文章目录
- 本篇摘要
- 一.基于yml配置文件实现简单拓扑
- 二.基于nginx实现代理访问mysql测试
- [三.基于docker compose 完成WordPress部署个人博客站点](#三.基于docker compose 完成WordPress部署个人博客站点)
- [四.基于`docker compose`常见问题](#四.基于
docker compose常见问题) - 五.本篇小结

本篇摘要
本文围绕Docker Compose展开,依次介绍基于yml配置实现简单拓扑、Nginx代理访问MySQL测试、WordPress部署个人博客站点,涵盖配置、部署、问题解决及原理,展示容器化应用高效部署与管理方法。
一.基于yml配置文件实现简单拓扑
下面将按照这个结构实现对应的拓扑结构,基于存储卷,网络等功能:

去对应目录创建yml文件:

解释下配置信息内容:
1. Web 服务 (Nginx)
- 作用:作为网站的服务器。
- 镜像 :
nginx:latest(最新版的Nginx)。 - 端口映射 :
8089:80--- 可以在电脑的浏览器上访问http://localhost:8089来打开网站。 - 文件挂载 :
./web:/usr/share/nginx/html--- 把本地的./web文件夹作为网站根目录,在里面放网页文件(如index.html)就能立即生效。 - 依赖 :设置了必须在
redis和mysql都启动成功后,才启动自己。
2. MySQL 服务
- 作用:运行MySQL数据库。
- 镜像 :
mysql:5.7(5.7版本的MySQL)。 - 密码 : root 用户的密码被设置为
root@123。 - 数据持久化 :
./mysql:/var/lib/mysql--- 将数据库文件保存在本地的./mysql目录下,即使容器删除,数据也不会丢失。 - 健康检查 :容器会定期执行
SELECT 1;命令来确认数据库是否正常响应。
3. Redis 服务
- 作用:运行Redis缓存服务。
- 镜像 :
redis:7。 - 健康检查 :通过
ping命令来确认服务是否正常。
4. 网络 (net1)
- 三个服务都加入了同一个叫
net1的虚拟网络。这样,它们之间就可以直接用服务名 (web,mysql,redis)互相访问,非常方便。
下面检查下是否有问题:

- 格式没有问题。

- 这里运行一下(按照对应顺序redis 再mysql再web),发现运行成功。

- 查看对应的网络详情,发现这几个容器确实被连接好了。

- 对应绑定卷目录也已经同步好了。
下面访问下nginx:

- 发现找不到,因为对应内容被宿主机映射目录为空覆盖了。


- 宿主机对应映射目录把内容同步过去。

- 发现这里mysql容器对应目录。宿主机的内容竟然不是空,被容器同步了,因为mysql容器要有初始化数据这是规定的,因此被容器同步宿主机。

- 因为在同一个网络故所有容器都能curl到对应的web服务(默认走80端口)。

- 这里默认有个匿名卷(Redis 服务没有定义任何卷挂载,但 Redis 官方镜像在 Dockerfile 中默认声明了数据卷,匿名卷)。

- 发现这里默认与启动顺序相反,因为对应依赖关系必须保持一致(比如web依赖mysql redis,因此就需要先移除web);对应redis匿名卷也被移除了。

- 这是绑定卷同步的对应宿主机目录内容,
-v操作只是针对管理卷(命名卷匿名卷);因此这里不会被删除。

- 最后容器成功被删除。
二.基于nginx实现代理访问mysql测试

- 因此可以看出对应的依赖关系是mysql依赖系统服务依赖nginx。
进行sql编写:


进入java环境部署工程:





进行访问对应端口:

运行项目:


docker compose 编写:

介绍下:
三个服务:
- web - Nginx网页服务器
- 端口:8765(对外)->80(容器内)
- 配置:本地
nginxconf文件夹->容器配置目录 - 依赖:后端服务启动后才会启动
- backend - 后端应用
- 代码:本地
app文件夹->容器应用目录 - 依赖:数据库健康后才启动
- mysql - 数据库
- 密码:root
- 数据持久化:本地
mysql文件夹保存数据 - 健康检查:自动检测数据库是否正常
启动顺序:
数据库->后端->前端
然后把创建对应目录把jar包传进来,运行yml文件:

- 没有问题启动成功。

- 反向代理初始化。

- 启动成功。

- 清理完后 绑定卷都存在。
三.基于docker compose 完成WordPress部署个人博客站点
下面将介绍使用 Docker Compose 这个容器编排工具,快速部署一个包含 WordPress(博客程序)和 MySQL(数据库)的完整个人博客站点。您无需在服务器上复杂地安装和配置各种软件,只需一个命令即可启动所有服务。
介绍下本次测试核心组件的作用:
1. WordPress:
- 是什么:全球最流行的开源内容管理系统(CMS),您可以通过它轻松地发布文章、管理页面、安装主题和插件,构建功能丰富的博客或网站。
- 在 Docker 中 :它作为一个容器运行,其官方镜像集成了完整的 LAMP 环境 :
- Linux: 容器的基础操作系统。
- Apache: Web 服务器,负责处理用户的 HTTP 请求。
- MySQL/MariaDB: 但在此架构中,数据库被分离到独立的容器,WordPress 容器内主要通过客户端库进行连接。
- PHP: 服务器端脚本语言,WordPress 本身由 PHP 编写,用于动态生成网页内容。
- 核心优势 :
- 易用性:拥有极其友好的图形化后台管理界面,无需技术背景即可上手。
- 生态丰富:拥有海量的免费和付费主题(用于控制网站外观)和插件(用于扩展功能,如SEO、电商、表单等)。
- 社区活跃:遇到任何问题几乎都能在网上找到解决方案和讨论。
2. MySQL:
- 是什么:关系型数据库管理系统(RDBMS)。
- 作用:WordPress 的所有核心数据(如文章、页面、评论、用户信息、主题和插件设置等)都结构化地存储在此数据库中。它相当于整个博客站点的"记忆大脑"。
- 在 Docker 中 :
- 它作为另一个独立的容器运行,与 WordPress 容器通过 Docker Compose 创建的内部网络进行通信,既保证了服务间的隔离,又确保了网络连通性。
- 使用数据卷(Volume) 来持久化存储数据库文件。这是至关重要的一步,确保了即使 MySQL 容器被删除或重建,您的博客数据也不会丢失。
- 为何选择 MySQL:WordPress 最初就是为 MySQL 设计的,两者具有最佳的兼容性和稳定性。虽然也支持 MariaDB(一个MySQL分支)等其他数据库,但 MySQL 是最标准的选择。
3. Docker Compose:
- 是什么:一个用于定义和运行多容器 Docker 应用程序的命令行工具。
- 作用 :通过一个
docker-compose.yml配置文件,以 "基础设施即代码(Infrastructure as Code)" 的方式,将 WordPress、MySQL 等多个容器及其依赖关系定义在一个文件中。它统一管理了:- 服务(Services):定义每个容器的镜像、配置。
- 网络(Networks) :自动创建私有网络,让容器间可以通过服务名(如
db)安全地相互发现和通信。 - 数据卷(Volumes):声明用于数据持久化的存储位置。
- 带来的革命性便利 :
- 一键启停 :无需记忆复杂的
docker run参数,只需docker-compose up -d和docker-compose down即可轻松启动和停止整个应用栈。 - 环境隔离:您的博客环境与主机系统完全隔离,不会污染主机环境,也不会与主机上的其他软件产生冲突。
- 可移植性与复现性:这个 YAML 文件可以在任何安装了 Docker 和 Compose 的机器上运行,保证环境完全一致,极大地简化了部署和迁移流程。
- 版本控制:配置文件可以放入 Git 等版本控制系统中进行管理,追踪每一次的变更。
- 一键启停 :无需记忆复杂的
总结而言,Docker Compose 将 WordPress 和 MySQL 这两个组件优雅地编织在一起,无需成为运维专家,就能轻松拥有一个高性能、易维护、且数据安全有保障的现代化博客部署方案。
下面讲下如何进行部署:
首先去docker hub 找到对应的镜像:

往下翻有个概览教你如何编写yml文件:

基于vscode进行yml编写:

1. 服务定义 (services:):
- 含义 :声明本文件要定义和运行的所有容器服务。这里定义了两个服务:
wordpress(网站程序)和db(数据库)。
2. WordPress 服务 (wordpress:):
image: wordpress- 指定使用官方的
wordpress镜像来创建容器。
- 指定使用官方的
restart: always- 确保容器意外退出时,Docker 会自动重新启动它,保证服务持续可用。
ports: - "8091:80"- 关键 :将容器内部的 80 端口 映射到宿主机的 8091 端口。
- 效果 :您通过访问
http://你的服务器IP:8091来打开网站。
environment:- 设置容器运行时的环境变量,用于配置 WordPress。
WORDPRESS_DB_HOST: db:数据库主机地址,db是另一个服务的名称,Compose 会自动解析其IP。WORDPRESS_DB_USER: user:连接数据库的用户名。WORDPRESS_DB_PASSWORD: user:对应用户的密码。WORDPRESS_DB_NAME: wordpress:WordPress 要使用的数据库名。
volumes: - ./wordpress/data:/var/www/html- 关键 :数据持久化 。将主机上的
./wordpress/data目录挂载到容器内的网站根目录。 - 目的:确保网站的主题、插件、上传文件等数据保存在主机上,容器重启也不会丢失。
- 关键 :数据持久化 。将主机上的
depends_on:- 定义服务间的依赖关系。
db: condition: service_healthy:关键 :表示wordpress服务必须等待db服务变得健康(通过健康检查确认)后才会启动。
3. MySQL 数据库服务 (db:):
image: mysql:5.7- 指定使用官方
mysql镜像的 5.7 版本。
- 指定使用官方
restart: always- 同样保证数据库服务会自动重启。
environment:- 设置数据库的初始化参数。
MYSQL_DATABASE: wordpress:容器启动时自动创建的数据库名称。MYSQL_USER: user:自动创建的普通用户。MYSQL_PASSWORD: user:上述普通用户的密码。MYSQL_ROOT_PASSWORD: "root":设置 root 超级用户的密码。
volumes: - ./db/data:/var/lib/mysql- 关键 :最重要 的数据持久化配置。将主机上的
./db/data目录挂载到容器内 MySQL 的数据存储目录。 - 目的:确保所有数据库数据(文章、用户、设置等)都安全保存在主机上,避免容器删除后数据丢失。
- 关键 :最重要 的数据持久化配置。将主机上的
healthcheck:- 定义健康检查,用于判断容器是否真正"准备就绪"。
test: ...:检查命令,尝试用 root 用户连接数据库并执行一个简单查询。interval: 10s:每 10 秒检查一次。timeout: 5s:每次检查等待 5 秒超时。retries: 10:连续失败 10 次后才标记为不健康。
总结:
配置文件通过 Docker Compose 定义了一个完整、可靠、数据持久化的 WordPress 运行环境:
- 两个服务:Web应用 (WordPress) + 数据库 (MySQL)。
- 依赖管理:Web 应用会等待数据库完全启动后再启动。
- 数据持久化:网站文件和数据库数据都保存在主机上,安全可靠。
- 网络互通 :两个容器通过 Compose
创建的内部网络自动连接。
进行启动:

- 这里的对应顺序也是先数据库再WordPress。

- 成功部署。
下面访问对应的ip+port:

下面进行注册:

进行登录:

来到对应主页:

下面可以进行博客编写:

点击发布即可:

然后可以设计自己喜欢的主题,然后修正下想要的页面布置进行博客展示,这里就草略展示下,访问对应的ip+port来映射访问对应的容器里内容:

- 这里简单展示下,对应的博客就以简单形式出来了。

- 这里就是mysql数据库容器与对应的wordpress容器进行通信的bridge网络。

- WordPress借助mysql进行存储对应的比如博客内容,设置等内容;这里可以看到对应存储配置以及对应内容文件。

- 销毁的顺序也是启动的逆向。

- 绑定卷,故内容在宿主机上不会消失。
总结下:
从yml文件可以看出,首先先启动对于的msyql容器(默认为WordPress创建对应管理的库),然后WordPress启动后,就可以拿着mysql容器为它设置的用户名及密码登录区访问对应的数据库,比如当访问对应网站生成的一些信息,就需要去这个数据库查找然后返回,最典型例子就是对应的博客发布(写入库),查看(从库对应位置读取出来),因此说两个容器是互相依赖的。
四.基于docker compose常见问题
up,run,start命令的区别
up:核心命令 。用于根据配置启动或重启整个服务栈。是开发时最常用的命令,可附加查看日志或后台运行。run:用于执行一次性任务 。仅为指定服务及其依赖创建临时容器,适用于运行测试或管理任务,提供交互式终端(比如某个yml有多个容器服务,只进行其中的一个容器测试就可以用)。start:功能单一,仅用于重新启动已存在但处于停止状态的容器,不会创建任何新容器。
- 如何运行项目的多个副本
- 通过
-p参数或COMPOSE_PROJECT_NAME环境变量来为每个副本(对应服务的容器)设置一个唯一的项目名称 ;因为 Compose 使用项目名称来标识和隔离资源,不同的名称可以确保在同一主机上运行多个副本而互不干扰(简单来点就是一个docker compose只要在同一目录下的yml文件里的服务(如test-nginx-1)都是默认在同一网络中,因此需要手动隔离,此时就可以用环境变量来改变对应目录名)。
- 如何控制服务启动顺序
- 主要通过
depends_on配置来声明服务间的依赖关系 ;为了更精确地控制,可以配合healthcheck(健康检查)来确保所依赖的服务(如数据库)不仅已启动,而且已准备就绪后,再启动依赖它的服务(如应用)。
五.本篇小结
通过这三个实践案例,掌握用Docker Compose编排多容器应用,理解服务依赖、数据持久化、网络配置等要点,学会编写yml文件实现一键部署,解决容器启动、数据同步、访问等问题,提升容器化应用开发与运维能力。