Контейнеры Docker запускаются в разных подсетях

#wordpress #networking #nginx #docker

#wordpress #сеть #nginx #docker

Вопрос:

Мне нужно запустить 3 контейнера: nginx, wordpress и wordpress2. Проблема в том, что контейнер nginx запускается с 172.17.0.2, wordpress с 172.18.0.3 и wordpress2 с 172.19.0.4. Контейнеры WordPress запускаются с их docker-compose.yml, настроенным так, как я показываю:

Для wordpress:

 version: '2'
services:
   db:
     image: mysql:5.7
     volumes:
       - "./.data/db:/var/lib/mysql"
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: wordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress
   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     links:
       - db
     ports:
       - "8000:80"
     networks:
       - ipv4_address: 172.17.0.5
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_PASSWORD: wordpress
  

Для wordpress2:

 version: '2'
    services:
       db:
         image: mysql:5.7
         volumes:
           - "./.data/db:/var/lib/mysql"
         restart: always
         environment:
           MYSQL_ROOT_PASSWORD: wordpress
           MYSQL_DATABASE: wordpress
           MYSQL_USER: wordpress
           MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     links:
       - db
     ports:
       - "8001:80"
     networks:
       - ipv4_address: 172.17.0.6
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_PASSWORD: wordpress
  

Как вы можете видеть, я ввел в поле networks ipv4_address, но когда я запускаю docker-compose.yml, в этой строке отображается ошибка. Я думал, что по умолчанию все контейнеры обычно подключены к одной сети, но не в этом случае. Можете ли вы помочь мне разместить все контейнеры в одной подсети?

Комментарии:

1. Если все 3 контейнера являются частью одного стека, возможно ли было бы поместить их все в один файл docker-compose? Если вы можете, вы можете использовать встроенный dns docker для доступа к контейнерам по имени их хоста, и вам не придется заботиться о конкретных IP-адресах.

Ответ №1:

Каждый docker-compose.yml создаст свою собственную подсеть. Таким образом, ваши 3 контейнера не могут видеть друг друга. Сети, созданные другим docker-compose, считаются внешними, поэтому вы должны объявить их как таковые. Вы можете увидеть эти сети с помощью docker network ls .

После объявления внешних сетей в ваших внешних сетях в вашем файле docker-compose.yml вам нужно будет определить, какие сети должна использовать служба nginx. Вы должны сохранить default сеть.

Обычно имя по умолчанию для вашей сети docker-compose — <current_dir>_default . Итак, предположим, что ваш текущий каталог называется yourproject1, сетевое имя будет yourproject1_default .

И тогда вы сможете получить доступ к своим контейнерам wordpress, используя external_links (лучше, чем ip-адреса IMO)

Вот что я бы сделал для файла docker-compose.yml от nginx, чтобы он мог видеть контейнеры wordpress :

 version: '2'

services:
  nginx:
    ...
    external_links:
      - your_project1_wordpress1_1:wordpress1
      - your_other_project2_wordpress2_1:wordpress2
    networks:
      - default
      - your_project1_default
      - your_other_project2_defaul



networks:
  your_project1_default:
    external: true
  your_other_project2_default:
    external: true
  

Комментарии:

1. @Asier Я рад, что это помогло. Вы можете пометить ответ как правильный ( i.stack.imgur.com/QpogP.png ) чтобы лучше помочь сообществу.