跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
编程语言

Docker Compose 实践:简单拓扑、数据库代理与 WordPress 部署

介绍 Docker Compose 的核心用法,涵盖基于 YML 配置文件实现多容器简单拓扑、利用 Nginx 代理访问 MySQL 测试、以及使用 Docker Compose 快速部署包含 WordPress 和 MySQL 的个人博客站点。内容涉及服务依赖管理、数据持久化配置、网络互通原理及常见问题解答,帮助读者掌握容器化应用的一键部署与管理方法。

BigDataPan发布于 2026/2/9更新于 2026/10/2495 浏览
Docker Compose 实践:简单拓扑、数据库代理与 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 容器要有初始化数据这是规定的,因此被容器同步宿主机。

mysql 目录

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

curl 测试

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

匿名卷

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

移除容器

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

绑定卷保留

  • 最后容器成功被删除。

二.基于 nginx 实现代理访问 mysql 测试

架构示意

  • 因此可以看出对应的依赖关系是 mysql 依赖系统服务依赖 nginx。

进行 sql 编写:

sql 编写

sql 执行

进入 java 环境部署工程:

java 环境

jar 包上传

项目构建

构建完成

部署状态

进行访问对应端口:

端口访问

运行项目:

项目运行

运行日志

docker compose 编写:

version: '3'
services:
  web:
    image: nginx:latest
    ports:
      - "8765:80"
    volumes:
      - ./nginxconf:/etc/nginx/conf.d
    depends_on:
      - backend
  backend:
    image: myapp:latest
    volumes:
      - ./app:/app
    depends_on:
      - mysql
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: root
    volumes:
      - ./mysql:/var/lib/mysql
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5

介绍下:

三个服务:

  1. web - Nginx 网页服务器

    • 端口:8765(对外)->80(容器内)
    • 配置:本地 nginxconf 文件夹 -> 容器配置目录
    • 依赖:后端服务启动后才会启动
  2. backend - 后端应用

    • 代码:本地 app 文件夹 -> 容器应用目录
    • 依赖:数据库健康后才启动
  3. mysql - 数据库

    • 密码:root
    • 数据持久化:本地 mysql 文件夹保存数据
    • 健康检查:自动检测数据库是否正常

启动顺序:
数据库->后端->前端

然后把创建对应目录把 jar 包传进来,运行 yml 文件:

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 找到对应的镜像:

dockerhub

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

yml 指南

基于 vscode 进行 yml 编写:

vscode

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 运行环境:

  1. 两个服务:Web 应用 (WordPress) + 数据库 (MySQL)。
  2. 依赖管理:Web 应用会等待数据库完全启动后再启动。
  3. 数据持久化:网站文件和数据库数据都保存在主机上,安全可靠。
  4. 网络互通:两个容器通过 Compose 创建的内部网络自动连接。

进行启动:

启动命令

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

启动日志

  • 成功部署。

下面访问对应的 ip+port:

访问首页

下面进行注册:

注册页面

进行登录:

登录页面

来到对应主页:

博客主页

下面可以进行博客编写:

编辑文章

点击发布即可:

发布文章

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

主题设置

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

博客展示

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

网络通信

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

数据存储

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

销毁容器

  • 绑定卷,故内容在宿主机上不会消失。

总结下:

从 yml 文件可以看出,首先先启动对于的 msyql 容器(默认为 WordPress 创建对应管理的库),然后 WordPress 启动后,就可以拿着 mysql 容器为它设置的用户名及密码登录区访问对应的数据库,比如当访问对应网站生成的一些信息,就需要去这个数据库查找然后返回,最典型例子就是对应的博客发布(写入库),查看(从库对应位置读取出来),因此说两个容器是互相依赖的。

四.基于 docker compose常见问题

  1. up, run, start 命令的区别
  • up:核心命令。用于根据配置启动或重启整个服务栈。是开发时最常用的命令,可附加查看日志或后台运行。
  • run:用于执行一次性任务。仅为指定服务及其依赖创建临时容器,适用于运行测试或管理任务,提供交互式终端(比如某个 yml 有多个容器服务,只进行其中的一个容器测试就可以用)。
  • start:功能单一,仅用于重新启动已存在但处于停止状态的容器,不会创建任何新容器。
  1. 如何运行项目的多个副本
  • 通过 -p 参数或 COMPOSE_PROJECT_NAME 环境变量来为每个副本(对应服务的容器)设置一个唯一的项目名称;因为 Compose 使用项目名称来标识和隔离资源,不同的名称可以确保在同一主机上运行多个副本而互不干扰(简单来点就是一个 docker compose 只要在同一目录下的 yml 文件里的服务(如 test-nginx-1)都是默认在同一网络中,因此需要手动隔离,此时就可以用环境变量来改变对应目录名)。
  1. 如何控制服务启动顺序
  • 主要通过 depends_on 配置来声明服务间的依赖关系;为了更精确地控制,可以配合 healthcheck(健康检查)来确保所依赖的服务(如数据库)不仅已启动,而且已准备就绪后,再启动依赖它的服务(如应用)。

五.本篇小结

通过这三个实践案例,掌握用 Docker Compose 编排多容器应用,理解服务依赖、数据持久化、网络配置等要点,学会编写 yml 文件实现一键部署,解决容器启动、数据同步、访问等问题,提升容器化应用开发与运维能力。

目录

  1. 一.基于 yml 配置文件实现简单拓扑
  2. 二.基于 nginx 实现代理访问 mysql 测试
  3. 三.基于 docker compose 完成 WordPress 部署个人博客站点
  4. 四.基于 docker compose常见问题
  5. 五.本篇小结

更多推荐文章

查看全部
  • C++ 四十年演进:引用、内联与空指针的三大基石
  • macOS 环境下 OpenClaw 部署与配置指南
  • GitHub Copilot Plan 模式核心优势与适用场景
  • 扩散模型(Diffusion Model)原理与图像生成实战
  • 循环神经网络(RNN)与序列数据处理实战
  • Whisper-CTranslate2 高效语音识别与翻译工具实战
  • FPGA 跨时钟域 CDC 处理的三种核心工程方案
  • 数电设计步骤与 FPGA 实现的本质区别
  • Pyglet:Python 游戏开发与图形界面库
  • Formality 原语(Primitive)概念解析与等价性检查
  • 国产 AI 智能体工具横向测评:腾讯、字节、阿里等主流方案
  • 从长期记忆角度解析 Agent 技术
  • 基于 Rokid 灵珠平台的旅游 AR 智能体搭建指南
  • OpenClaw 本地推理方案:基于 Ollama 部署开源模型替代云端 Token 消耗
  • SpringMVC 核心处理流程深度解析
  • 深入解析 LRU 与 LFU 缓存算法:原理、实现与面试实战
  • 2025 年人工智能发展趋势与学习路径指南
  • 前端 AI 工具实战:Claude、OpenCode 与 A2UI 协议
  • 80 元低成本无人机系统设计与实现
  • C++ 多态:面向对象动态行为的核心机制

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online