Использование сетей в файле Docker Compose
Я пытаюсь понять, как контейнеры общаются друг с другом с помощью Docker Compose.
Я работаю в виртуальной машине без доменного имени, поэтому я использую IP-адрес: порт.
Я хочу простое приложение Wordpress, используя стандартные изображения: wordpress:php5.6-fpm-alpine
, mariadb
, nginx
, Кроме того, я хочу контейнер phpMyAdmin со своим собственным docker-compose.yml
, ссылаясь на контейнер MariaDB.
короткий рассказ
Мне удалось заставить его работать с links
,
Затем я попытался выполнить настройку, но я получил сообщение о том, что они не находятся в одной сети. Я знаю, что мог бы пойти с --link
в командной строке, но это не весело.
Итак, я понял, что это то, что networks
директивы для, и я переписал свой docker-compose.yml
,
Вот рабочая docker-compose.yml
для моего приложения Wordpress (только соответствующие материалы)
services:
blog:
(skip)
networks:
- maria_net
- app_net
db:
(skip)
networks:
- maria_net
web:
(skip)
networks:
- app_net
networks:
app_net:
maria_net:
Приложение предоставляет порт 8080, где nginx прослушивает.
Мне нужно сказать nginx прокси php запросы к blog
контейнер где php-fpm
прослушивает порт 9000
Файлы conf для nginx помещаются в контейнер /etc/nginx/conf.d
,
Что оно делает:
- устанавливает восходящий канал, указывающий на порт 9000
blog
контейнер (php-fpm
), - наборы
root
для статических файлов в /var/www/html, который является общим томом сblog
контейнер - запросы прокси на php файлах в апстрим
образец nginx/conf.d/default.conf
upstream backend {
server blog:9000;
}
server {
listen 80;
root /var/www/html;
index index.php;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
(...more fastcgi_param...)
fastcgi_pass backend;
}
}
При такой настройке Docker заботится о том, чтобы контейнеры в одной и той же сети были видны друг другу под их именем службы, и когда я нажимаю на IP своей виртуальной машины через порт 8080, я просто отлично вхожу в установку Wordpress.
PHPMyAdmin
Теперь я пытаюсь подключить контейнер phpMyAdmin к MariaDB.
docker-compose.yml
version: '3'
services:
phpmyadmin:
image: phpmyadmin/phpmyadmin
networks:
- maria_net
environment:
- PMA_ARBITRARY=1
restart: always
ports:
- 8081:80
volumes:
- /sessions
environment:
- PMA_HOST='db'
- PMA_USER=root
- PMA_PASSWORD=azerty
networks:
maria_net:
phpMyAdmin на самом деле слушает @8081, но говорит, что не может подключиться к хосту db
,
Что вполне нормально, как я выяснил:
user@host $ docker network ls
NETWORK ID NAME DRIVER SCOPE
3fbb92bac6dc blog_app_net bridge local
fa0ef0ee1a64 blog_maria_net bridge local
3b4cd3956119 bridge bridge local
820bc4c6c844 host host local
17b010e55091 none null local
79bcc3149270 phpmyadmin_maria_net bridge local
phpMyAdmin и MariaDB имеют свои mariadb_net
...
Я снова выполнил RTFM и обнаружил, что в Docker Compose необходимо указать, что вы хотите подключиться к существующей сети с external
(фактическое имя сети, как указано в docker network ls
):
networks:
maria_net:
external:
name: blog_maria_net
Теперь контейнеры phpmyadmin и mariadb находятся в одной сети:
$ docker network inspect blog_maria_net
[
{
"Name": "blog_maria_net",
"Id": "fa0ef0ee1a6479fba0ed60dc01480a5f2200ff1ab37de511f9a2e55caa238bb1",
"Created": "2017-07-02T13:01:08.473871818+02:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.19.0.0/16",
"Gateway": "172.19.0.1"
}
]
},
"Internal": false,
"Attachable": true,
"Ingress": false,
"Containers": {
"1b0241ed5609f541e60f23717d1cfd55ded4a272536ad417c33e57c573ffec72": {
"Name": "blog_blog_1",
"EndpointID": "9e4fd814799cce653299f0751af51482e9f40e15d73bc213af9f120bd7d0f143",
"MacAddress": "02:42:ac:13:00:03",
"IPv4Address": "172.19.0.3/16",
"IPv6Address": ""
},
"af6a790c667ba6576ebd056f8166a46d8da7cd1d2704a91e45b93d6d7c945e28": {
"Name": "blog_db_1",
"EndpointID": "a9e5d3489f8b156385d1c81c34b6b712708715803080f8b75651ba1bc8fdd039",
"MacAddress": "02:42:ac:13:00:02",
"IPv4Address": "172.19.0.2/16",
"IPv6Address": ""
},
"ccaf49d12d928a455c50be33e607e731bb1045f2afe9003c4d22a914af604923": {
"Name": "phpmyadmin_phpmyadmin_1",
"EndpointID": "8cfc3efa3654040fdaaa4ffa16643cfab838602d9eead3d14d40c0dd8fd45fe8",
"MacAddress": "02:42:ac:13:00:04",
"IPv4Address": "172.19.0.4/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {
"com.docker.compose.network": "maria_net",
"com.docker.compose.project": "blog"
}
}
]
И контейнер Мариадб псевдоним db
согласно названию его услуги:
$ docker inspect blog_db_1
(...)
"Networks": {
"blog_maria_net": {
"IPAMConfig": null,
"Links": null,
"Aliases": [
"af6a790c667b",
"db"
],
"NetworkID": "fa0ef0ee1a6479fba0ed60dc01480a5f2200ff1ab37de511f9a2e55caa238bb1",
"EndpointID": "a9e5d3489f8b156385d1c81c34b6b712708715803080f8b75651ba1bc8fdd039",
"Gateway": "172.19.0.1",
"IPAddress": "172.19.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:13:00:02"
}
}
Но phpMyAdmin все еще не может подключиться к базе данных хоста:
MySQL a répondu : Documentation
#2005 - Unknown MySQL server host ''db'' (-2)
Двойная кавычка может быть проблемой...
1 ответ
На самом деле это была цитата: я установил переменную окружения для БД с кавычками, которые экранируются phpmyadmin, поэтому вместо подключения к хосту db
он пытается подключиться к 'db'
:
- PMA_HOST='db'
Так должно быть:
- PMA_HOST=db
Это была довольно неприятная проблема, но все о сетях в Compose не слишком ясно, и я надеюсь, что, наконец, получение рабочего conf поможет другим.