指定 docker-compose 使用已有网络(existing network)
通常,docker-compose 会为它管理的docker 容器组创建一个专用的网络,命名为 xxx_default, 但有时候我们却希望 docker-compose 能使用已有的 docker 网络,使之维护的容器能与现有的容器实现网络互通。
背景
我在vps
上跑了一个nginx容器用来做反向代理, 它使用的docker默认网桥docker0
, 默认网络是172.17.0.0/16
, ip地址 172.17.0.3
.
现在我用wordpress
+mysql
来跑一个博客, 使用docker-compose
管理, 博客跑起来后, 发现nginx
无法代理wordpress
, 经排查发现, nginx
和wordpress
在不同的网段, 网络无法互通.
dcoekr0
的默认网络可以修改, 参考 :
http://note.youdao.com/noteshare?id=a5cf6dfaf98b627811598cf774a0f8e9
解决
- 在
nginx
内添加一条从nginx
到wordpress
的路由; - 修改
docker-compose.yaml
文件是它使用已有的docker0
网络而不是新建一个独立的网络;
我这里使用了方案2.
在docker-compose.yaml
中添加network_mode: bridge
即可, docker0
是bridge
的别名(alias).
注意:
vps
服务器由于能从公网直接访问, 不建议将不需要的容器端口映射到主机上, 或者使用iptables
进行限制.- 我这里使用的是IBM的
System Z
服务器, 硬件架构是s390x
, 不能直接使用docker官方的MySQL
, 找了一个第三方的MariaDB
;
下面是完整的文件内容:
version: '3'
services:
db:
image: sinenomine/mariadb-s390x
volumes:
- /data/wordpress/mysql:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: [email protected]
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: [email protected]
network_mode: bridge
wordpress:
depends_on:
- db
links:
- db
image: s390x/wordpress:latest
volumes:
- /data/wordpress/wordpress:/var/www/html_volume
#ports:
# - "30080:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: [email protected]
network_mode: bridge
参考
https://docs.docker.com/compose/wordpress/#define-the-project
https://github.com/docker/compose/issues/3012
列出所有容器和ip
docker ps -q | xargs -n 1 docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} {{ .Name }}' | sed 's/ \// /'
问题
docker-compose
启动后, wordpress
并不能正常启动,大量抛错:
Warning: mysqli::mysqli(): php_network_getaddresses: getaddrinfo failed: Name or service not known in - on line 22
Warning: mysqli::mysqli(): (HY000/2002): php_network_getaddresses: getaddrinfo failed: Name or service not known in - on line 22
MySQL Connection Error: (2002) php_network_getaddresses: getaddrinfo failed: Name or service not known
原来是docker-compose.yaml
文件, 不但要指定depends_on
使得compose能够保证wordpress
在db
之后启动, 还要指定links
来向wordpress
容器中注入hosts记录
来实现基于主机名的通信
https://serverfault.com/a/880777/368226
https://stackoverflow.com/a/48557430/5723841