我正在尝试为虚拟机上的一些项目设置可扩展的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
最佳答案
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在启动时是否给您任何错误
关于docker - 如何使用隔离的网络正确连接使用多个docker-compose文件创建的容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45014698/