在现代网站架构中,使用容器化技术来部署应用程序已经成为一种常见的做法。Docker 是一个非常强大的工具,它允许我们将应用程序及其依赖打包到一个容器中,从而实现轻量级的虚拟化部署。本篇文章将展示如何使用 Docker 来搭建一个包含 MySQL、WordPress、Nginx 和 Certbot 环境的完整网站。
我们将实现以下目标:
- 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 证书。
第一步:准备工作
首先,确保你已经安装了 Docker 和 Docker 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
解释:
- MySQL:
使用官方mysql:5.7
镜像,创建 MySQL 容器,并设置一个默认数据库和 root 密码。我们还使用了volumes
来持久化数据库数据。 - WordPress:
使用官方wordpress
镜像,设置与 MySQL 数据库的连接(通过MYSQL_HOST
和MYSQL_PASSWORD
环境变量)。WordPress 容器依赖 MySQL 容器启动。 - Nginx:
使用nginx
镜像,配置 Nginx 作为反向代理,监听 HTTP 和 HTTPS 请求。所有的请求都将被转发到 WordPress 容器。Nginx 还挂载了 Certbot 配置和证书存储目录。 - 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 网站。如果有任何问题,欢迎在评论区提问!
发表回复