如何正确地将使用多个docker-compose文件创build的容器与隔离networking连接起来

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

我的设置如下:

前端:(如预期的那样工作:感谢Tevin Jeffery )

# ~/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博客来testing一切是否正常:

 # ~/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 

更新:

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

~/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 

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

我遇到类似的问题,我的testing应用程序将失败,因为它不能连接到我的服务器,因为它没有启动和运行。

我对上面链接中的文章做了一个类似的解决方法,运行一个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%确定的。 debugging你的问题的另一种方法是运行docker-compose在-d标志的分离模式下运行docker ps来查看你的数据库是否在运行。 如果它正在运行,运行docker logs $YOUR_DB_CONTAINER_ID来查看MySQL是否在启动时给你任何错误