指定 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, 经排查发现, nginxwordpress 在不同的网段, 网络无法互通.

dcoekr0的默认网络可以修改, 参考 :

http://note.youdao.com/noteshare?id=a5cf6dfaf98b627811598cf774a0f8e9

解决

  • nginx内添加一条从nginxwordpress的路由;
  • 修改docker-compose.yaml文件是它使用已有的docker0网络而不是新建一个独立的网络;

我这里使用了方案2.

docker-compose.yaml中添加network_mode: bridge即可, docker0bridge的别名(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/ \// /'

https://gist.github.com/ipedrazas/2c93f6e74737d1f8a791

问题

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能够保证wordpressdb之后启动, 还要指定links来向wordpress容器中注入hosts记录来实现基于主机名的通信

https://serverfault.com/a/880777/368226
https://stackoverflow.com/a/48557430/5723841