Docker Compose 学习之多容器应用编排与运维实践 ------ 基于 Nginx+MySQL+Redis 服务栈的部署与管理:
Docker Compose核心概念详解:
Docker Compose 是 Docker 官方推出的多容器应用编排工具,核心作用是通过一个统一的 YAML 配置文件(docker-compose.yml),定义、管理多个关联的 Docker 容器,实现「一键启动 / 停止 / 重启 / 扩缩容」整个应用栈(此次笔记以部署 Nginx+MySQL+Redis 组合为例)。
简单来说:手动启动多个容器需要敲多条 docker run 命令,而 Compose 只用一个配置文件 + 一条命令就能搞定。
1、核心设计目标
简化多容器部署:避免手动逐个启动容器、配置网络 / 挂载 / 依赖;
统一环境配置:开发 / 测试 / 生产环境使用相同的 docker-compose.yml,保证环境一致性;
服务关联管理:轻松定义容器间的依赖、网络、数据卷等关系;
生命周期管理:一键完成应用栈的启动、停止、重启、删除、日志查看等操作。
2、核心概念(3 个核心要素)
2.1配置文件(docker-compose.yml)
这是 Compose 的核心,用 YAML 语法定义服务(Services)、网络(Networks)、数据卷(Volumes) 三大核心模块,示例结构:
2.2服务(Services)
定义:一个「服务」对应一个应用组件(如 Nginx 服务、MySQL 服务),本质是一组相同配置的容器实例(可扩缩容);
核心属性(你之前用到的):
image:服务使用的镜像(如 nginx:1.28.1);
ports:宿主机与容器的端口映射;
volumes:数据卷挂载(持久化数据);
environment:容器内环境变量;
depends_on:服务间的启动依赖(如 Nginx 依赖 MySQL);
restart:容器重启策略(如 always 保证服务高可用);
command:覆盖镜像的默认启动命令。
2.3项目(Project)
定义:由 docker-compose.yml 定义的所有服务构成一个「项目」,项目名默认是配置文件所在目录的名称(也可通过 --project-name 自定义);
作用:通过项目名可以统一管理一组关联服务(比如 docker-compose -p myapp up 启动 myapp 项目的所有服务)
3、实验流程
3.1安装和验证docker-compose
下载和安装:
wget https://github.com/docker/compose/releases/download/v5.0.2/docker-compose-$(uname -s)-$(uname -m)
mv docker-compose-$(uname -s)-$(uname -m) /usr/bin/docker-compose
# 或者
curl https://github.com/docker/compose/releases/download/v5.0.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/bin/docker-compose
chmod +x /usr/bin/docker-compose
验证安装版本:
[root@localhost ~]# docker-compose -v
Docker Compose version v5.0.2
[root@localhost ~]# docker-compose --version
Docker Compose version v5.0.2
3.2编写一个docker-compose.yml文件,进行深入操作;
任务:在docker-compose.yml文件中定义三个服务,分别是 nginx、mysql、redis 服务。
文件代码如下:
services:
nginx:
image: nginx:1.28.1
restart: always
container_name: nginx
environment:
- TZ=Asia/Shanghai
ports:
- 80:80
- 443:443
volumes:
- /opt/nginx/log:/var/log/nginx
- /opt/nginx/www:/usr/share/nginx/html
depends_on:
- mysql
- redis
#编写思路:采用nginx:1.28.1稳定版本镜像进行搭建;当容器异常/主机重启时自动重启;自定义容器名为nginx;统一容器时区为上海,保持环境时间一致性;端口映射为80(http)和443(https);数据卷挂载为宿主机日志目录到容器日志目录,持久化管理;宿主机网页目录到容器默认网页目录(方便修改页面)。
mysql:
image: mysql:8.4.4
container_name: mysql
ports:
- 3306:3306
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
environment:
MYSQL_ROOT_PASSWORD: "123456"
volumes:
- /opt/mysql/db:/var/lib/mysql
#编写思路:采用MySQL 8.4.4 最新稳定版镜像进行搭建;自定义容器名为mysql;端口映射为3306;覆盖镜像默认启动命令,配置数据库编码为默认字符集,定义字符排序规则;设置mysql的用户密码,并将mysql数据目录持久化挂载到主机。
redis:
image: redis:8.4
container_name: redis
environment:
- TZ=Asia/Shanghai
ports:
- 6379:6379
volumes:
- /opt/redis/data:/data
depends_on:
- mysql
#编写思路:选定redis:8.4最新镜像版本;自定义容器名为redis;统一时区;添加端口映射为6379;挂载redis数据目录,持久化;创建依赖,启动redis前先启动mysql。
完成后启动并运行docker-compose.yml 文件中所定义的所有服务;
[root@localhost ~]# docker-compose up -d
[+] up 4/4
✔ Network root_default Created 0.0s
✔ Container mysql Created 0.1s
✔ Container nginx Created 0.1s
✔ Container redis Created 0.1s
3.3熟悉常用命令
3.3.1查看运行的project
[root@localhost ~]# docker-compose ls
NAME STATUS CONFIG FILES
root running(3) /root/docker-compose.yml
[root@localhost ~]# docker compose ls
NAME STATUS CONFIG FILES
root running(3) /root/docker-compose.yml
3.3.2查看所有运行的容器
[root@localhost ~]# docker-compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
mysql mysql:8.4.4 "docker-entrypoint.s..." mysql 37 minutes ago Up 37 minutes 0.0.0.0:3306->3306/tcp, [::]:3306->3306/tcp, 33060/tcp
nginx nginx:1.28.1 "/docker-entrypoint...." nginx 37 minutes ago Up 37 minutes 0.0.0.0:80->80/tcp, [::]:80->80/tcp, 0.0.0.0:443->443/tcp, [::]:443->443/tcp
redis redis:8.4 "docker-entrypoint.s..." redis 37 minutes ago Up 37 minutes 0.0.0.0:6379->6379/tcp, [::]:6379->6379/tcp
[root@localhost ~]#
3.3.3查看容器运行日志
[root@localhost ~]# docker compose logs
mysql | 2026-03-13 05:44:07+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.4.4-1.el9 started.
mysql | 2026-03-13 05:44:08+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
mysql | 2026-03-13 05:44:08+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.4.4-1.el9 started.
...
3.3.4查看容器事件
如果没有发现事件,它会一直处于监听状态。
[root@localhost ~]# docker-compose events --json
3.3.5暂停服务,解除暂停服务
[root@localhost ~]# docker-compose pause
[+] pause 3/3
✔ Container mysql Paused 0.0s
✔ Container nginx Paused 0.0s
✔ Container redis Paused 0.0s
[root@localhost ~]# docker-compose unpause
[+] unpause 3/3
✔ Container redis Unpaused 0.0s
✔ Container nginx Unpaused 0.0s
✔ Container mysql Unpaused 0.0s
3.3.6停止容器运行,启动停止的容器
[root@localhost ~]# docker-compose stop
[+] stop 3/3
✔ Container redis Stopped 0.2s
✔ Container nginx Stopped 0.2s
✔ Container mysql Stopped 1.1s
[root@localhost ~]# docker-compose start
[+] start 3/3
✔ Container mysql Started 0.6s
✔ Container nginx Started 0.6s
✔ Container redis Started 0.5s
3.3.7进入容器内部服务
[root@localhost ~]# docker-compose exec nginx /bin/bash
root@35c8f7d7ddf1:/# pwd
/
root@35c8f7d7ddf1:/# ls
bin dev docker-entrypoint.sh home lib64 mnt proc run srv tmp var
boot docker-entrypoint.d etc lib media opt root sbin sys usr
root@35c8f7d7ddf1:/# cd /usr
root@35c8f7d7ddf1:/usr# ls
bin games include lib lib64 libexec local sbin share src
root@35c8f7d7ddf1:/usr# cd /usr/share/nginx/html/
root@35c8f7d7ddf1:/usr/share/nginx/html# ls
root@35c8f7d7ddf1:/usr/share/nginx/html#
3.3.8停止并删除容器
示例:停止并删除 docker-compose.yml 文件中所定义的所有服务。
[root@localhost ~]# docker-compose down
[+] down 4/4
✔ Container mysql Removed 1.3s
✔ Container redis Removed 0.3s
✔ Container nginx Removed 0.2s
✔ Network root_default Removed 0.1s
完成后查看容器:
[root@localhost ~]# docker-compose ps -a
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
3.3.9显示暴露的端口
[root@localhost ~]# docker-compose port nginx 80
0.0.0.0:80
4、总结和反思
本次实验围绕 Docker Compose 多容器编排工具展开,以部署 Nginx+MySQL+Redis 组合应用为核心场景,完成了 Compose 工具安装、多服务配置文件编写、应用栈生命周期管理等全流程操作,核心亮点有:
1.熟悉Docker Compose 核心概念:理解配置文件(docker-compose.yml)、服务(Services)、项目(Project)三大核心要素的关联关系,能够通过单一 YAML 文件定义多容器的镜像、端口、数据卷、依赖、环境变量等关键配置。
2.实现了多容器统一管理:对比手动执行 docker run 启动多个容器的繁琐方式,通过 docker-compose up/down/start/stop 等命令,一键完成整个应用栈的启动、停止、删除,大幅提升多容器部署效率。
3.完成了数据持久化与环境标准化:通过数据卷挂载实现 Nginx 日志 / 网页、MySQL 数据、Redis 数据的持久化存储;统一配置容器时区(Asia/Shanghai)、MySQL 字符编码(utf8mb4)等,保证多容器环境一致性。
4.掌握了 Compose 项目管理、容器状态查看、日志排查、容器进入、端口验证等高频操作(如 docker-compose ls/ps/logs/exec/port 等),形成了多容器应用的日常运维能力.
易错提示:
1.YAML 语法严格缩进:YAML 文件依赖缩进表示层级关系(建议使用 2 个空格,禁止用 Tab),若缩进错误(如 services 下的 nginx/mysql/redis 服务缩进不一致),会导致 docker-compose up 时报语法解析错。
2.端口映射冲突:宿主机端口已被占用(如 80/3306/6379 被本机其他进程占用),会导致容器启动失败,需提前通过 netstat -tulpn | grep 端口号 检查端口占用。
3.depends_on 仅保证启动顺序,不保证服务就绪:depends_on 仅能控制容器启动的先后顺序,但无法确保 MySQL/Redis 服务完全启动(如 MySQL 初始化未完成)就启动 Nginx,可能导致 Nginx 连接后端服务失败。解决方案:需在应用层增加重试逻辑,或使用第三方工具(如 wait-for-it)检测服务端口就绪后再启动依赖服务。
4.镜像版本不存在:配置文件中指定的镜像版本(如 redis:8.4)若为非官方 / 不存在版本,会导致镜像拉取失败,需提前在 Docker Hub 确认镜像版本的合法性(建议使用 LTS 稳定版本,如 redis:7.2、mysql:8.0)。