我正在尝试为虚拟机上的一些项目设置可扩展的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
答案 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在启动时是否给您任何错误