docker network 桥接多个 docker 容器服务
docker network 桥接多个 docker 容器服务
场景
假如有多个服务:mysql、 web1、web2、web3...等等,及后续未知的站点加入。创建 docker-compose.yaml 文件时,不可能每次有新的站点,都要修改一次 docker-compose.yaml 文件及再次 down 和 up。
比如:
Adminer
phpMyAdmin
这种情况,我们就只希望先创建一个 mysql 服务。再有新的站点需要使用 mysql 服务时,新站点的可以直接使用 host 为 mysql 方式连接到 mysql 服务。
错误示例
mysql
adminer
登录错误
登录时,报错误:
SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Try again
是因为 mysql 和 adminer 容器分别使用的桥接网络为 mysql_default 和 adminer_default。不在同一网络,所以直接使用 mysql 作为 host 来连接是无效的。
正确示例
这时候需要将之改造为:
mysql
adminer
分别:
在 mysql / adminer 的服务下添加
networks:
- db
以及在顶级添加一个 networks 服务:
networks:
db:
name: db
则可正常登录。以后再有需要 db 服务的,按照上述方式添加该两项 networks 即可。
注意: name 选项必须填入,且一致。否则容器不可互通。
此方式,会导致个别容器无法 down 。
---
或者可以先创建一个 network ,再使用。
1、创建一个 network:
docker network create db
2、查看 network 列表:
docker network ls
更多 network 命令可以通过 docker network help 查看。
3、按上一个(大)步骤,将顶级的 networks 修改为:
networks:
db:
external: true
即可。此方式,在将所有服务都 down 后,不会删除 此 network 。
docker-compose.yaml 文件
mysql
version: '3'
services:
mysql:
image: mysql
container_name: mysql
restart: unless-stopped
hostname: mariadb
environment:
MYSQL_ROOT_PASSWORD: 123456
networks:
- db
networks:
db:
name: mysql
adminer
version: '3'
services:
adminer:
image: adminer
container_name: adminer
restart: unless-stopped
ports:
- 8080:8080
networks:
- db
networks:
db:
name: mysql
更多说明可参考文档:
https://docs.docker.com/compose/compose-file/compose-file-v3/#external-1