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