Docker Compose高手实践之路:简单拓扑、数据库代理、基于WordPress的个人博客站点一键搞定!

文章目录

本篇摘要

本文围绕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)就能立即生效。
  • 依赖 :设置了必须在 redismysql 都启动成功后,才启动自己。

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 编写:

介绍下:

三个服务:

  1. web - Nginx网页服务器
  • 端口:8765(对外)->80(容器内)
  • 配置:本地nginxconf文件夹->容器配置目录
  • 依赖:后端服务启动后才会启动
  1. backend - 后端应用
  • 代码:本地app文件夹->容器应用目录
  • 依赖:数据库健康后才启动
  1. 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 -ddocker-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 运行环境:

  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文件实现一键部署,解决容器启动、数据同步、访问等问题,提升容器化应用开发与运维能力。

相关推荐
6***S2221 小时前
SQL Server查看数据库中每张表的数据量和总数据量
数据库·sql·oracle
k***21601 小时前
使用 Docker 部署 RabbitMQ 的详细指南
docker·容器·rabbitmq
The star"'1 小时前
docker
docker·云计算
可爱又迷人的反派角色“yang”1 小时前
Mysql数据库(一)
运维·服务器·前端·网络·数据库·mysql·nginx
Lynnxiaowen1 小时前
今天我们开始学习Docker概述与安装
linux·学习·docker·容器·云计算
枫叶丹41 小时前
浙人医信创实践:电科金仓异构多活架构破解集团化医院转型难题
开发语言·数据库·架构
yddddddy1 小时前
Django在项目中的作用
数据库·python·django
一点 内容1 小时前
Apache DolphinScheduler 数据库模式深度解析:从表结构到调度逻辑
数据库·apache