如何正确连接使用多个docker-compose文件创建的容器与隔离网络

时间:2017-07-10 14:27:19

标签: docker docker-compose docker-networking

我正在尝试为虚拟机上的一些项目设置可扩展的docker生产环境。

我的设置如下:

前端:(这可以按预期工作:感谢Tevin Jeffery for this

# ~/proxy/docker-compose.yml
version: '2'  
services:  
  nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    ports:
      - '80:80'
      - '443:443'
    volumes:
      - '/etc/nginx/vhost.d'
      - '/usr/share/nginx/html'
      - '/etc/nginx/certs:/etc/nginx/certs:ro' 
      - '/var/run/docker.sock:/tmp/docker.sock:ro'
    networks:
      - nginx
  letsencrypt-nginx-proxy:
    container_name: letsencrypt-nginx-proxy
    image: 'jrcs/letsencrypt-nginx-proxy-companion'
    volumes:
      - '/etc/nginx/certs:/etc/nginx/certs'
      - '/var/run/docker.sock:/var/run/docker.sock:ro'
    volumes_from:
      - nginx-proxy
    networks:
      - nginx
networks:  
  nginx:
    driver: bridge

数据库:(计划添加postgres以支持rails应用程序)

# ~/mysql/docker-compose.yml
version: '2'
services:
  db:
    image: mariadb
    environment:
      MYSQL_ROOT_PASSWORD: wordpress
#   ports:
#     - 3036:3036
    networks:
      - db
networks:
  db:
    driver: bridge

最后一个wordpress博客测试一切是否有效:

# ~/wp/docker-compose.yml
version: '2'
services:
  wordpress:
    image: wordpress
    # external_links:
    #   - mysql_db_1:mysql
    ports:
      - 8080:80
    networks:
      - proxy_nginx
      - mysql_db
    environment:
      # for nginx and dockergen
      VIRTUAL_HOST: gizmotronic.ca
      # wordpress setup
      WORDPRESS_DB_HOST: mysql_db_1 
#     WORDPRESS_DB_HOST: mysql_db_1:3036  
#     WORDPRESS_DB_HOST: mysql 
#     WORDPRESS_DB_HOST: mysql:3036  
      WORDPRESS_DB_USER: root
      WORDPRESS_DB_PASSWORD: wordpress
networks:
  proxy_nginx:
    external: true
  mysql_db:
    external: true

我的问题是Wordpress容器无法连接到数据库。当我尝试启动(docker-compose up)Wordpress容器时出现以下错误:

wordpress_1  | Warning: mysqli::mysqli(): (HY000/2002): Connection refused in - on line 22
wordpress_1  |
wordpress_1  | MySQL Connection Error: (2002) Connection refused
wp_wordpress_1 exited with code 1

更新:

我终于能够让这个工作了。我的主要问题是依赖于环境变量的容器默认值。这创建了一个自动数据卷,没有数据库或用户按下单词。在我将显式环境变量添加到mysql和Wordpress容器后,我删除了数据卷并重新启动了两个容器。这迫使mysql容器重新创建数据库和用户。

~/mysql/docker-compose.yml

environment:
  MYSQL_ROOT_PASSWORD: wordpress
  MYSQL_USER: wordpress
  MYSQL_PASSWORD: wordpress
  MYSQL_DATABASE: wordpress

~/wp/docker-compose.yml

environment:
  # for nginx and dockergen
  VIRTUAL_HOST: gizmotronic.ca
  # wordpress setup
  WORDPRESS_DB_HOST: mysql_db_1
  WORDPRESS_DB_USER: wordpress
  WORDPRESS_DB_PASSWORD: wordpress
  WORDPRESS_DB_NAME: wordpress

1 个答案:

答案 0 :(得分:0)

docker-compose的一个问题是虽然有时您的应用程序链接到您的数据库,但应用程序不会等待您的数据库启动并准备就绪。这是Docker官方阅读: https://docs.docker.com/compose/startup-order/

我遇到了类似的问题,我的测试应用程序会因为无法连接到我的服务器而失败,因为它还没有启动并运行。

我对上面链接中发布的文章进行了类似的解决方法,运行shell脚本来ping数据库的地址,直到可以使用它为止。此脚本应该是应用程序中的最后一个CMD命令。

RESPONSE=$(curl --write-out "%{http_code}\n" --silent --output /dev/null "YOUR_MYSQL_DATABASE:3306")

# Until the mysql sends a 200 HTTP response, we're going to keep checking
until [ $RESPONSE -eq "200" ]; do
  sleep 2
  echo "MySQL is not ready yet.. retrying... RESPONSE: ${RESPONSE}"
  RESPONSE=$(curl --write-out "%{http_code}\n" --silent --output /dev/null "YOUR_MYSQL_DATABASE:3306")
done

# Once we know the server's up, we can start run our application 
enter code to start your application here

我不能100%确定这是否是您遇到的问题。调试问题的另一种方法是使用-d标志以分离模式运行docker-compose并运行docker ps以查看您的数据库是否正在运行。如果它正在运行,请运行docker logs $YOUR_DB_CONTAINER_ID以查看MySQL在启动时是否给您任何错误