问题描述
希望创建一个简单的WordPress站点项目模板,其中包括一个全局的nginx代理和n个WP站点,每个站点都有自己的MySQL服务器。用户希望通过git clone
模板,通过一个Shell脚本启动Docker,并创建每个站点的链接服务,以便多个站点可以在同一台机器上运行,而不会互相冲突。用户提供了全局代理服务和站点Docker配置的示例。
全局代理服务示例
以下是全局nginx代理服务的示例docker-compose.yml
配置:
version: "3"
services:
nginx-proxy:
image: jwilder/nginx-proxy
container_name: nginx-proxy
ports:
- "80:80"
- "443:443"
volumes:
- ./certs:/etc/nginx/certs:ro
- /var/run/docker.sock:/tmp/docker.sock:ro
restart: unless-stopped
networks:
default:
external:
name: nginx-proxy
站点Docker配置示例
以下是站点Docker配置的示例docker-compose.yml
配置:
version: "3"
services:
mysql:
image: mysql:5.7
volumes:
- wordpress_data:/var/lib/mysql
restart: always
environment:
MYSQL_DATABASE: ${PROJECT_NAME}
MYSQL_ROOT_PASSWORD: somewordpress
container_name: ${PROJECT_NAME}-mysql
wordpress:
depends_on:
- mysql
image: wordpress:latest
volumes:
- wordpress_data:/var/lib/mysql
restart: always
environment:
VIRTUAL_HOST: ${PROJECT_NAME}.local
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_NAME: ${PROJECT_NAME}
WORDPRESS_DB_PASSWORD: somewordpress
WORDPRESS_TABLE_PREFIX: ${PROJECT_NAME}_
container_name: ${PROJECT_NAME}-wordpress
volumes:
wordpress_data:
networks:
default:
external:
name: nginx-proxy
用户在每个项目中都会检查全局代理服务的存在,然后尝试创建它(使用Shell脚本)。
用户指出,他能够成功启动每个站点,但似乎MySQL和WP服务只能同时运行一个。
用户也考虑过将它们放在自己的子网上,并使用一个nginx服务器来路由传入请求(来自全局反向代理),但没有得到一个可行的模型。
解决方案
以下操作可能涉及版本差异,请在执行前备份相关数据,特别是MySQL数据。
解决MySQL和WP服务只能同时运行一个的问题
在Docker Compose中,depends_on
属性并不保证服务的启动顺序和可用性。为了确保MySQL和WP服务能够同时运行,您可以考虑以下步骤:
1. 增加等待时间:在WordPress服务启动前,增加一些等待时间,以确保MySQL服务已完全启动并准备就绪。您可以在WordPress服务的entrypoint
中添加等待命令,直到MySQL服务准备就绪。
2. 使用Healthcheck:在MySQL服务中使用healthcheck
来检查其健康状态,只有在MySQL服务准备就绪时,才允许WordPress服务启动。
配置Docker网络
要将多个站点隔离在各自的子网中,并使用全局nginx代理路由请求,您可以尝试以下步骤:
1. 为每个站点创建一个Docker网络,使其处于自己的子网中。
2. 在全局nginx代理中,将每个站点的容器连接到相应的子网,以便能够路由请求。
下面是一个示例配置,展示了如何为每个站点创建自己的Docker网络,并将站点容器连接到全局nginx代理:
version: "3"
services:
nginx-proxy:
image: jwilder/nginx-proxy
container_name: nginx-proxy
ports:
- "80:80"
- "443:443"
volumes:
- ./certs:/etc/nginx/certs:ro
- /var/run/docker.sock:/tmp/docker.sock:ro
restart: unless-stopped
networks:
default:
external:
name: nginx-proxy
site1_net:
driver: bridge
site2_net:
driver: bridge
在上述示例中,我们为每个站点创建了一个自定义的Docker网络,如site1_net
和site2_net
。然后,您可以在每个站点的Docker配置中使用networks
属性将其连接到相应的网络中,从而使它们处于各自的子网中。
请注意,这只是一个示例,您可能需要根据实际情况进行调整。另外,确保适当配置全局nginx代理以路由来自不同子网的请求。
总结
通过在Docker Compose中配置等待时间或使用健康检查,您可以解决MySQL和WP服务只能同时运行一个的问题。此外,通过为每个站点创建自己的Docker网络,并连接到全局nginx代理,您可以实现多个站点的隔离和请求路由。在实际操作中,请根据您的需求进行适当的调整和测试。