Может ли docker-compose разделять ip между сервисами с дискретными портами? - PullRequest
0 голосов
/ 07 октября 2018

В настоящее время у нас есть докер-контейнеры со сложными сборками, использующими supervisord, чтобы мы могли группировать сервисы вместе.Например, nginx и ssh.

Я пытаюсь перестроить их с помощью большей управляемой сервисом изоляции, связанной общими томами.Однако, без сопоставления IP-адреса с хостом , я не могу найти способ разрешить совместное использование IP-адресов, даже если порты могут быть дискретными.

Что япопытка сделать что-то вроде этого:

version: '2'
services:
  web:
    image: nginx
    volumes:
    - /data/web:/var/www
    networks:
      public:
        ipv4_address: 10.0.0.1
    ports:
    - "10.0.0.1:80:80"
  ssh:
    image: alpine-sshd
    volumes:
    - /data/web:/var/www
    networks:
      public:
        ipv4_address: 10.0.0.1
    ports:
    - "10.0.0.1:22:22"
networks:
  public:
    external: true

... где public - предопределенная сеть Macvlan для докера.

При попытке этого я получаю сообщение об ошибке:

ERROR: for ssh  Cannot start service ssh: Address already in use

Мне известно, что еще одно решение этой проблемы - ввести третий сервис для работы в качестве прокси.Тем не менее, я подумал, что это будет достаточно простой случай, чтобы не нуждаться в этом.

Можно ли настроить docker-compose / docker-network для маршрутизации через порт, чтобы позволить тому же IP-адресу бытьиспользуется для разных контейнеров?

1 Ответ

0 голосов
/ 09 октября 2018

Можно ли настроить docker-compose / docker-network для маршрутизации через порт, чтобы один и тот же IP-адрес мог использоваться для разных контейнеров?

Да, мы можем (знакомо? -_-!).Docker предлагает опцию сетевого режима, которая называется service:service-name.

Когда мы выполняем docker run, мы можем добавить флаг --network=service:service-name.Это означает, что текущий контейнер использует то же пространство имен сети, что и service:service-name. Дополнительная информация ссылка здесь.

Попробуйте следующий составной файл ниже.Я проверил это, который работает хорошо.

version: '2'
services:
  web:
    image: nginx
    networks:
      public:
        ipv4_address: 10.0.0.2
    ports:
      - "8880:80"
      - "2220:22"

  ssh:
    image: panubo/sshd
    network_mode: "service:web"
    depends_on:
      - web
networks:
  public:
    external: true
...