玖叶教程网

前端编程开发入门

docker network 桥接多个 docker 容器服务

docker network 桥接多个 docker 容器服务

场景

假如有多个服务:mysql、 web1、web2、web3...等等,及后续未知的站点加入。创建 docker-compose.yaml 文件时,不可能每次有新的站点,都要修改一次 docker-compose.yaml 文件及再次 downup

比如:

Adminer

phpMyAdmin

这种情况,我们就只希望先创建一个 mysql 服务。再有新的站点需要使用 mysql 服务时,新站点的可以直接使用 hostmysql 方式连接到 mysql 服务。

错误示例

mysql

adminer

登录错误

登录时,报错误:

SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Try again

是因为 mysql 和 adminer 容器分别使用的桥接网络为 mysql_defaultadminer_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

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言