使用 Docker 搭建 MySQL、WordPress、Nginx 和 Certbot 环境

,

在现代网站架构中,使用容器化技术来部署应用程序已经成为一种常见的做法。Docker 是一个非常强大的工具,它允许我们将应用程序及其依赖打包到一个容器中,从而实现轻量级的虚拟化部署。本篇文章将展示如何使用 Docker 来搭建一个包含 MySQLWordPressNginxCertbot 环境的完整网站。

我们将实现以下目标:

  • MySQL:用于存储 WordPress 数据。
  • WordPress:提供内容管理系统(CMS)功能。
  • Nginx:作为反向代理和 Web 服务器,负责处理 HTTPS 请求并提供 SSL 证书支持。
  • Certbot:用于自动申请和续期 SSL 证书,确保网站通过 HTTPS 安全访问。

如果不想一步步学习,可以直接使用下面的一键部署,适合ubuntu server

Github一键部署项目:Github/Ushiao/docker-compose-wordpress-nginx-mysql

环境概述

我们将使用 Docker 和 Docker Compose 来创建多个容器:

  • MySQL 容器:运行 MySQL 数据库。
  • WordPress 容器:运行 WordPress 内容管理系统。
  • Nginx 容器:作为反向代理和 Web 服务器。
  • Certbot 容器:自动获取和管理 SSL 证书。

第一步:准备工作

首先,确保你已经安装了 DockerDocker Compose。如果没有安装,可以参考 Docker 官网Docker Compose 官网 安装这些工具。

第二步:创建 docker-compose.yml 文件

创建一个名为 docker-compose.yml 的文件,并将以下内容粘贴到文件中:

services:
  nginx:
    image: nginx:latest
    container_name: nginx
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./data/certbot/conf:/etc/letsencrypt
      - ./data/certbot/www:/var/www/certbot
    depends_on:
      - wordpress_tagword
      - certbot
    networks:
      wordpress_network:
        aliases:
          - nginx.local
  certbot:
    image: certbot/certbot
    container_name: certbot
    volumes:
      - ./data/certbot/conf:/etc/letsencrypt
      - ./data/certbot/www:/var/www/certbot
    entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"
    networks:
      - wordpress_network
  wordpress_tagword:
    image: wordpress:latest
    container_name: wordpress_tagword
    environment:
      WORDPRESS_DB_HOST: db_tagword:3306
      WORDPRESS_DB_NAME: ${DB_NAME}
      WORDPRESS_DB_USER: ${DB_USER}
      WORDPRESS_DB_PASSWORD: ${DB_PASSWORD}
    volumes:
      - ./data/wordpress:/var/www/html
    networks:
      wordpress_network:
        aliases:
          - wordpress_tagword.local
  db_tagword:
    image: mysql:5.7
    container_name: db_tagword
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
      MYSQL_DATABASE: ${DB_NAME}
      MYSQL_USER: ${DB_USER}
      MYSQL_PASSWORD: ${DB_PASSWORD}
    volumes:
      - ./data/mysql:/var/lib/mysql
    networks:
      wordpress_network:
        aliases:
          - db_tagword.local
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
networks:
  wordpress_network:
    driver: bridge

解释:

  1. MySQL
    使用官方 mysql:5.7 镜像,创建 MySQL 容器,并设置一个默认数据库和 root 密码。我们还使用了 volumes 来持久化数据库数据。
  2. WordPress
    使用官方 wordpress 镜像,设置与 MySQL 数据库的连接(通过 MYSQL_HOSTMYSQL_PASSWORD 环境变量)。WordPress 容器依赖 MySQL 容器启动。
  3. Nginx
    使用 nginx 镜像,配置 Nginx 作为反向代理,监听 HTTP 和 HTTPS 请求。所有的请求都将被转发到 WordPress 容器。Nginx 还挂载了 Certbot 配置和证书存储目录。
  4. Certbot
    使用 certbot/certbot 镜像,并设置一个 entrypoint 让 Certbot 在容器中定期自动续期 SSL 证书。它会使用 /var/www/certbot 目录来处理域名验证。

第三步:配置 Nginx

在项目根目录下创建一个 nginx.conf 文件,配置 Nginx 作为 HTTPS 反向代理:

server {
    listen 80;
    server_name flykun.com www.flykun.com;
    location /.well-known/acme-challenge/ {
        root /var/www/certbot;  # Certbot 验证文件目录
    }
    # 重定向到 HTTPS
    return 301 https://$host$request_uri;
}
server {
    listen 443 ssl;
    server_name flykun.com www.flykun.com;
    ssl_certificate /etc/letsencrypt/live/flykun.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/flykun.com/privkey.pem;
    location / {
        proxy_pass http://wordpress:80;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

解释:

  • HTTP 端口(80)
    用于 Certbot 验证域名所有权并重定向到 HTTPS。
  • HTTPS 端口(443)
    配置了 SSL 证书路径,并将所有流量反向代理到 WordPress 容器。

第四步:申请 SSL 证书

使用 Certbot 容器获取 SSL 证书:

# 将flykun.com和www.flykun.com修改成您的域名
docker exec -it certbot certbot \
certonly --webroot --webroot-path=/var/www/certbot \
--email your-email@example.com --agree-tos \
--no-eff-email -d flykun.com -d www.flykun.com

此命令会通过 webroot 插件请求 SSL 证书,验证过程通过 HTTP-01 验证进行,Certbot 会在 Nginx 中配置的 .well-known/acme-challenge/ 路径下放置验证文件。验证成功后,证书将被存储在 ./data/certbot 目录中。

第五步:启动 Docker 容器

执行以下命令启动所有容器:

docker-compose up -d

这将启动所有服务(MySQL、WordPress、Nginx 和 Certbot),并将它们放入后台运行。

第六步:自动续期 SSL 证书

Certbot 会定期检查证书的有效期并自动续期。你可以通过容器的定时任务来设置定期续期,确保 SSL 证书不会过期。Certbot 会每 12 小时运行一次,检查并续期证书。

文件结构

如果你需要一个合适的文件结构,请参考一下

docker-wordpress-nginx-certbot/
│
├── docker-compose.yaml         # Docker Compose configuration to define services
├── nginx.conf                  # Nginx configuration for reverse proxy and SSL
├── .env                        # Environment variables for sensitive configurations
├── deploy.sh                   # One-click deployment script
├── README.md                   # Project documentation
└── data/                        # Persistent data for certificates, WordPress, and MySQL
    ├── certbot/
    ├── wordpress/
    └── mysql/

总结

通过 Docker 和 Docker Compose,本文展示了如何轻松搭建一个包含 MySQL、WordPress、Nginx 和 Certbot 的完整网站架构:

  • MySQL:提供数据库支持。
  • WordPress:用于内容管理。
  • Nginx:作为反向代理服务器,提供 HTTPS 支持。
  • Certbot:自动申请并管理 SSL 证书。

通过这一解决方案,你可以快速部署一个 WordPress 网站,并确保它通过 HTTPS 安全访问。同时,Certbot 的自动续期功能确保 SSL 证书不会过期,提供持续的安全保障。


希望这篇教程能帮助你使用 Docker 部署一个安全的 WordPress 网站。如果有任何问题,欢迎在评论区提问!

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据