使用Docker Compose创建多容器WordPress项目

84次阅读
没有评论

问题描述

希望创建一个简单的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_netsite2_net。然后,您可以在每个站点的Docker配置中使用networks属性将其连接到相应的网络中,从而使它们处于各自的子网中。

请注意,这只是一个示例,您可能需要根据实际情况进行调整。另外,确保适当配置全局nginx代理以路由来自不同子网的请求。

总结

通过在Docker Compose中配置等待时间或使用健康检查,您可以解决MySQL和WP服务只能同时运行一个的问题。此外,通过为每个站点创建自己的Docker网络,并连接到全局nginx代理,您可以实现多个站点的隔离和请求路由。在实际操作中,请根据您的需求进行适当的调整和测试。

正文完