#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 ) чтобы лучше помочь сообществу.