
1. 项目概述为什么选择Docker Compose搭建个人博客如果你一直想拥有一个完全由自己掌控的个人博客但又对服务器配置、环境依赖这些繁琐的步骤望而却步那么今天这个方法可能就是为你量身定做的。我将带你用Docker Compose在三分钟左右的时间里从零开始搭建一个功能完整、基于WordPress的个人博客网站。这听起来可能有点技术性但别担心整个过程就像搭积木一样简单直观你不需要成为运维专家也能搞定。简单来说Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。你可以把它想象成一个“一键部署”的脚本。我们这次要搭建的博客核心就是两个“容器”一个运行WordPress博客程序本身另一个运行MySQL数据库用来存储你的文章、评论等所有数据。传统方式安装你需要分别配置Web服务器、PHP环境、数据库步骤多且容易出错。而用Docker Compose我们只需要编写一个简单的配置文件然后执行一条命令所有服务就会自动拉取镜像、创建容器、配置网络并启动彼此之间还能自动连接。这极大地降低了技术门槛让你能专注于博客内容创作而不是和环境搏斗。这个方法特别适合开发者、技术爱好者、学生或者任何想快速拥有一个独立博客站点的朋友。它部署在你自己能控制的服务器或电脑上数据完全私有并且由于容器化的特性迁移、备份、升级都变得异常简单。接下来我们就从最基础的准备工作开始一步步实现这个目标。2. 环境准备与核心工具解析在开始“搭积木”之前我们需要准备好“工地”和“工具箱”。这里的核心就是Docker和Docker Compose。我会详细解释它们是什么以及如何正确安装特别是针对Windows和macOS用户可能遇到的常见坑。2.1 Docker与Docker Compose到底是什么你可以把Docker理解为一个轻量级的虚拟机。但它比传统虚拟机更高效因为它不是模拟整个操作系统而是利用宿主机的内核只打包应用程序及其依赖环境即“镜像”。运行起来的镜像实例就叫“容器”。每个容器都是相互隔离的这保证了环境的一致性你在自己电脑上测试好的服务放到服务器上也能以完全相同的方式运行。Docker Compose则是管理多个关联容器的“管家”。我们这次的项目涉及WordPress和MySQL两个容器它们需要互通网络、知道彼此的存在。如果手动用Docker命令启动你需要先创建网络再分别启动两个容器并指定复杂的连接参数非常容易出错。而Docker Compose允许我们用一个docker-compose.yml文件以声明式的方式定义这两个服务、它们的配置以及之间的关系。之后只需一条docker-compose up -d命令管家就会按照蓝图把一切安排得明明白白。2.2 安装Docker与Docker Compose的避坑指南安装Docker通常很简单访问Docker官网下载对应系统的Docker Desktop安装包即可。但这里有几个关键点需要注意尤其是“Virtualization support not detected”这个经典错误。对于Windows用户Win10/11专业版、企业版或教育版开启Hyper-V和容器功能这是必须的。在“启用或关闭Windows功能”中确保勾选了“Hyper-V”和“容器”选项然后重启电脑。开启BIOS/UEFI中的虚拟化如果开启Hyper-V后Docker Desktop仍然启动失败并提示“Virtualization support wasn’t detected”那问题通常出在BIOS设置。你需要重启电脑进入BIOS/UEFI设置界面开机时按F2、Del、F10等键因主板而异找到“Virtualization Technology”Intel VT-x或AMD-V选项将其设置为“Enabled”。保存退出后问题通常就能解决。使用WSL 2后端这是目前Windows上Docker的推荐方式。安装Docker Desktop时它会提示你安装WSL 2内核更新包。确保完成这一步并在Docker Desktop设置中将默认后端改为WSL 2能获得更好的性能和兼容性。对于macOS用户安装过程相对顺畅。直接从官网下载Docker Desktop for Mac的安装包拖入应用程序文件夹即可。需要注意的是Apple Silicon芯片M1/M2/M3的Mac需要下载支持ARM64架构的版本。Docker Desktop会自动处理架构适配问题但在拉取某些镜像时如果该镜像没有提供ARM64版本可能会遇到问题。不过我们使用的WordPress和MySQL官方镜像都提供了多架构支持所以无需担心。对于Linux用户如Ubuntu通常通过包管理器安装。但请注意新版本的Docker Compose已经集成到Docker CLI中作为docker compose插件命令注意中间没有横线。我们后续的命令将使用这个新语法。如果你遇到ModuleNotFoundError: No module named compose这类错误很可能是因为你安装了旧版的、独立的docker-compose带横线工具并且与新环境不兼容。最稳妥的方法是卸载旧版直接使用Docker DesktopLinux版本或确保安装的Docker Engine版本在20.10以上它已内置了Compose V2。实操心得无论用什么系统安装完成后务必在终端或命令提示符中运行docker --version和docker compose version或docker-compose --version来验证安装是否成功。这是避免后续一切“灵异事件”的第一步。3. 项目蓝图编写docker-compose.yml文件一切准备就绪现在我们来绘制搭建博客的“蓝图”——docker-compose.yml文件。这个文件是整个过程的核心它用YAML语法清晰地描述了我们要运行哪些服务、每个服务用什么镜像、如何配置以及服务间如何关联。3.1 文件结构与基础语法解析首先在你计划存放博客项目的目录下例如~/my-wordpress-blog创建一个名为docker-compose.yml的空文件。用任何文本编辑器如VS Code、Notepad、Sublime Text打开它。YAML文件对缩进非常敏感必须使用空格通常为2个空格而不能使用Tab键。一个基本的Compose文件结构如下version: 3.8 # 指定Compose文件格式的版本 services: # 定义所有要运行的服务容器 db: # 第一个服务我们命名为“db”数据库 # ... 数据库服务的配置细节 wordpress: # 第二个服务我们命名为“wordpress” # ... WordPress服务的配置细节 volumes: # 定义持久化数据卷防止容器删除后数据丢失 # ... 数据卷配置version指定了我们使用的Compose文件语法版本3.8是一个广泛兼容且功能稳定的版本。services部分是重头戏里面列出了我们所有要运行的应用。3.2 详解MySQL服务配置我们先来配置数据库服务这是博客的数据仓库。db: image: mysql:8.0 container_name: wp_mysql_db restart: always environment: MYSQL_ROOT_PASSWORD: your_strong_root_password_here MYSQL_DATABASE: wordpress MYSQL_USER: wordpress_user MYSQL_PASSWORD: your_strong_wordpress_password_here volumes: - db_data:/var/lib/mysql networks: - wp_networkimage: mysql:8.0指定使用MySQL 8.0的官方镜像。Docker会自动从Docker Hub拉取它。选择8.0是因为它性能、功能和安全性的一个良好平衡点且与WordPress兼容性好。你也可以用mysql:latest但指定版本能确保环境一致性避免未来因镜像更新导致意外问题。container_name: wp_mysql_db给这个容器起个名字方便我们后续管理和查看日志。不起名的话Docker会分配一个随机名字。restart: always设置容器退出时总是重启。这对于需要持续运行的服务如数据库至关重要能保证服务器重启后博客自动恢复。environment这是配置容器的环境变量相当于在容器内部设置了系统参数。MYSQL_ROOT_PASSWORD设置MySQL超级用户root的密码。务必替换your_strong_root_password_here为一个高强度密码这是安全底线。MYSQL_DATABASE容器启动时自动创建的数据库名称我们命名为wordpress。MYSQL_USER和MYSQL_PASSWORD自动创建一个名为wordpress_user的用户并赋予其访问wordpress数据库的权限。同样密码要设得复杂些。volumes: - db_data:/var/lib/mysql这是数据持久化的关键。db_data是一个我们将在文件底部定义的“命名卷”。它将宿主机的某个目录由Docker管理映射到容器内的/var/lib/mysqlMySQL存储所有数据的地方。这样即使我们删除并重建db容器博客的所有文章、评论等数据依然安全地保留在db_data卷中不会被清除。networks: - wp_network将这个服务接入一个自定义的网络wp_network。这样wordpress服务才能通过服务名db来访问数据库而不是复杂的IP地址。3.3 详解WordPress服务配置接下来配置博客程序本身。wordpress: image: wordpress:latest container_name: wp_app restart: always ports: - 8080:80 environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wordpress_user WORDPRESS_DB_PASSWORD: your_strong_wordpress_password_here WORDPRESS_DB_NAME: wordpress volumes: - wp_data:/var/www/html depends_on: - db networks: - wp_networkimage: wordpress:latest使用最新的WordPress官方镜像。WordPress社区活跃latest标签能让你获得最新的安全更新和功能。ports: - 8080:80端口映射这是将服务暴露给外界的关键。格式是宿主机端口:容器内端口。这里将容器内部的80端口Web服务器默认端口映射到宿主机的8080端口。这意味着你可以在浏览器通过http://你的服务器IP:8080或http://localhost:8080来访问博客。选择8080是为了避免与宿主机上可能已经运行的Web服务如Apache/Nginx冲突。你可以改成任何未被占用的端口比如80:80直接使用默认HTTP端口。environment配置WordPress连接数据库的参数。WORDPRESS_DB_HOST: db:3306这是精髓所在。db就是我们上面定义的MySQL服务的名称Compose会自动在wp_network网络内通过这个服务名进行DNS解析找到数据库容器的IP。3306是MySQL的默认端口。这种通过服务名连接的方式是Docker Compose管理多容器应用的最大优势之一完全无需关心动态IP。其他WORDPRESS_DB_*变量与db服务中创建的用户和数据库对应确保一致。volumes: - wp_data:/var/www/html同样使用命名卷wp_data来持久化WordPress的核心文件、插件、主题以及上传的媒体文件。否则容器重启后你安装的主题和插件都会消失。depends_on: - db声明依赖关系。告诉Composewordpress服务需要等待db服务启动并进入健康状态对于MySQL意味着可以接受连接之后再启动。这避免了WordPress启动时因数据库未就绪而报错。networks: - wp_network让WordPress容器也加入同一个网络这样它才能与db容器通信。3.4 定义网络与数据卷最后在文件的最外层定义我们在服务中引用的网络和数据卷。volumes: db_data: wp_data: networks: wp_network: driver: bridgevolumes声明了两个命名卷db_data和wp_data。Docker会在宿主机的特定位置通常是/var/lib/docker/volumes/下创建并管理它们。你不需要手动指定路径Docker会处理好。networks声明了一个名为wp_network的自定义桥接网络。driver: bridge是默认的驱动它会在宿主机内部创建一个虚拟网络允许接入的容器相互通信同时与宿主机隔离。这比使用默认的bridge网络更安全、更清晰。至此完整的docker-compose.yml文件就编写完成了。它就像一个详细的施工图纸包含了所有部件和连接方式。4. 一键部署与博客初始化蓝图在手现在只需一条命令Docker Compose就会化身最有效率的施工队自动完成所有搭建工作。4.1 启动服务与验证部署打开终端Linux/macOS或命令提示符/PowerShellWindows导航到你存放docker-compose.yml文件的目录。执行以下命令docker compose up -ddocker compose这是Compose V2的命令语法。如果你安装的是旧版独立工具可能需要使用docker-compose带横线。建议升级到新版本。up根据docker-compose.yml创建并启动所有服务。-d代表“detached”让服务在后台运行。如果不加这个参数终端会卡住并实时输出所有容器的日志适合调试初期查看启动过程正常运行时建议加上。执行命令后你会看到Docker开始拉取PullMySQL和WordPress的镜像。如果这是第一次运行需要下载时间取决于你的网速。镜像拉取完成后Docker会依次创建网络、数据卷然后启动db容器等待其就绪后再启动wordpress容器。如何验证服务是否正常运行查看容器状态运行docker compose ps。你应该看到两个服务的状态都是Up。NAME COMMAND SERVICE STATUS PORTS wp_app docker-entrypoint.s… wordpress Up 0.0.0.0:8080-80/tcp wp_mysql_db docker-entrypoint.s… db Up 3306/tcp, 33060/tcp查看实时日志如果想看某个服务的运行日志可以用docker compose logs -f wordpress查看WordPress日志或docker compose logs -f db。-f参数可以持续跟踪输出按CtrlC退出。最重要的验证——访问博客打开你的浏览器访问http://localhost:8080如果部署在本地电脑或http://你的服务器IP地址:8080如果部署在云服务器。你应该能看到WordPress著名的“五分钟安装”界面。注意事项如果你在云服务器如阿里云、腾讯云ECS上部署除了确保服务器的安全组或防火墙放行了你映射的端口如8080外访问时需要使用服务器的公网IP。同时在服务器上执行docker compose up -d时localhost指的是服务器本身。4.2 WordPress初始化设置详解看到安装界面意味着Docker部分已大功告成。接下来是WordPress本身的配置。选择语言第一屏是选择语言选择“简体中文”后点击“继续”。数据库连接信息这一步非常关键但通常不需要你手动填写。因为我们在docker-compose.yml中已经通过环境变量WORDPRESS_DB_*提供了所有信息WordPress会自动读取并填充。你直接点击“提交”即可。这是Docker Compose配置的另一个便利之处。运行安装程序点击“提交”后WordPress会测试数据库连接。如果一切正常你会进入“现在安装”页面点击它。站点信息配置站点标题给你的博客起个名字比如“小明的技术笔记”。用户名设置一个管理员用户名。不要使用默认的admin建议用一个不易被猜到的名字这是安全最佳实践。密码为管理员账户设置一个强密码。系统会生成一个你可以用它也可以自己输入一个更复杂的。务必妥善保存这个密码。您的电子邮件填写有效的邮箱用于接收通知和密码重置。对搜索引擎的可见性如果这是你刚搭建的、不想被搜索引擎立刻收录的测试站或私人站可以勾选此项。正式公开的博客则不要勾选。安装WordPress点击“安装WordPress”。成功后你会看到登录按钮。登录后台使用你刚才设置的用户名和密码登录http://localhost:8080/wp-admin即可进入WordPress强大的后台管理界面Dashboard。至此一个功能完整的个人博客网站就已经搭建并初始化完毕了。你可以开始发布文章、更换主题、安装插件打造属于你自己的网络空间。5. 日常管理、维护与故障排查博客跑起来只是开始日常的运维管理同样重要。Docker Compose让这些操作变得极其简单。5.1 常用Docker Compose管理命令掌握以下几个命令你就能轻松管理你的博客“容器集群”停止所有服务docker compose down这个命令会停止并删除docker-compose.yml中定义的所有容器、网络默认创建的但不会删除我们定义的db_data和wp_data数据卷。你的文章和上传的文件都安全。启动服务docker compose up -d在运行过down之后再次运行此命令Compose会重新创建容器并启动因为数据卷还在所有数据完好无损。查看服务状态docker compose ps查看服务日志docker compose logs查看所有服务的最近日志。docker compose logs -f wordpress持续跟踪followWordPress容器的日志输出调试时非常有用。进入容器内部docker compose exec wordpress bash这条命令会打开一个交互式bash shell让你进入wordpress容器的内部文件系统。你可以在这里执行一些高级操作比如手动检查文件、调试PHP等。退出时输入exit。重启某个服务docker compose restart wordpress拉取最新镜像并重启如果你想更新WordPress到最新版本可以运行docker compose pull wordpress docker compose up -d --force-recreate wordpresspull拉取最新镜像up命令加上--force-recreate会强制用新镜像重新创建容器。注意更新前最好备份数据卷。5.2 数据备份与迁移高枕无忧的秘诀数据是无价的。得益于Docker数据卷备份和迁移变得非常容易。备份找到数据卷在宿主机上的实际位置。可以用docker volume inspect wp_data查看Mountpoint字段。更简单的方法是使用docker命令直接打包备份# 创建一个备份目录 mkdir ~/blog_backup # 将数据卷打包成tar文件 docker run --rm -v wp_data:/source -v ~/blog_backup:/backup alpine tar czf /backup/wp_data_backup_$(date %Y%m%d).tar.gz -C /source . docker run --rm -v db_data:/source -v ~/blog_backup:/backup alpine tar czf /backup/db_data_backup_$(date %Y%m%d).tar.gz -C /source .这个命令使用了一个临时的Alpine Linux容器将数据卷wp_data,db_data挂载进去然后执行tar压缩命令将压缩包输出到宿主机的~/blog_backup目录。--rm参数表示容器运行后自动删除。迁移/恢复 在新服务器上首先确保Docker和Docker Compose已安装并将备份的tar.gz文件和docker-compose.yml复制过去。启动一个空白服务创建出空的数据卷docker compose up -d然后docker compose down。使用docker命令恢复数据docker run --rm -v wp_data:/target -v ~/blog_backup:/backup alpine sh -c cd /target tar xzf /backup/wp_data_backup_YYYYMMDD.tar.gz --strip-components1将YYYYMMDD替换为你的备份日期对db_data执行类似操作重新启动服务docker compose up -d。你的博客就会完整地在新服务器上重现。5.3 常见问题与排查技巧实录即使流程再简单也难免会遇到问题。这里记录几个我亲自踩过的坑和解决方法。问题1访问localhost:8080报错“建立数据库连接时出错”排查思路这几乎总是数据库连接问题。检查容器状态docker compose ps确认db和wordpress两个容器都是Up状态。检查数据库日志docker compose logs db查看MySQL启动过程中是否有错误比如权限问题、初始化失败等。常见情况是环境变量密码含有特殊字符导致解析错误尝试用纯字母数字密码。检查依赖顺序虽然我们写了depends_on但它只控制启动顺序不等待服务“就绪”。有可能WordPress启动时MySQL还在初始化。可以稍等几十秒再刷新页面或者查看WordPress日志docker compose logs wordpress看是否有连接重试的记录。验证环境变量确保docker-compose.yml中wordpress服务的WORDPRESS_DB_PASSWORD和db服务的MYSQL_PASSWORD完全一致包括大小写和特殊字符。问题2上传主题/插件时提示需要FTP凭据原因这是因为WordPress容器内Web服务器进程www-data用户对wp-content目录位于持久化卷wp_data中没有写权限。解决方案进入WordPress容器修改目录权限。docker compose exec wordpress bash chown -R www-data:www-data /var/www/html/wp-content chmod -R 755 /var/www/html/wp-content exit或者更一劳永逸的方法是在docker-compose.yml的wordpress服务部分通过命令覆盖默认的启动命令在启动时自动修正权限wordpress: image: wordpress:latest ... command: sh -c chown -R www-data:www-data /var/www/html/wp-content chmod -R 755 /var/www/html/wp-content docker-entrypoint.sh apache2-foreground 问题3如何配置自定义域名而不是用IP:端口访问解决方案这需要在前端增加一个反向代理服务器如Nginx或Caddy。你可以再创建一个Nginx容器与WordPress容器共享网络由Nginx监听80/443端口并根据域名将请求转发到WordPress容器的80端口。同时你需要一个域名并配置DNS解析到你的服务器IP。这超出了“三分钟”的范畴但却是生产环境的标准做法。一个简单的docker-compose.yml扩展示例如下services: # ... 原有的db和wordpress服务 nginx-proxy: image: nginx:alpine container_name: wp_nginx ports: - 80:80 - 443:443 volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro - ./ssl:/etc/nginx/ssl depends_on: - wordpress networks: - wp_network你需要编写对应的nginx.conf配置文件并放置SSL证书。问题4服务器重启后博客没有自动启动排查检查docker-compose.yml中每个服务是否都设置了restart: always。如果设置了Docker守护进程启动后容器应该会自动重启。更深层解决对于Linux服务器可以配置系统服务让docker compose up在开机时运行。例如创建一个systemd服务文件。通过以上步骤你不仅成功搭建了一个博客更掌握了一套基于Docker Compose的轻量级应用部署和管理方法论。这套方法可以复用于很多其他服务比如Nextcloud、GitLab、各类数据库等。容器化技术带来的隔离性、一致性和便携性能让你的个人项目管理和维护工作变得轻松而优雅。