Docker Compose 学习之多容器应用编排与运维实践 —— 基于 Nginx+MySQL+Redis 服务栈的部署与管理

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)。

相关推荐
老毛肚2 小时前
Redis八股
数据库·redis·缓存
桌面运维家2 小时前
Windows自动运维:VHD虚拟磁盘大屏监控实践
运维
深圳市恒讯科技2 小时前
数据存储服务器配置方案:大规模数据业务如何选择服务器
运维·服务器
夜月yeyue2 小时前
Linux 邻接(Neighbor)子系统架构与 NUD 状态机
linux·运维·服务器·嵌入式硬件·算法·系统架构
科技林总2 小时前
【系统分析师】11.7 软件需求管理
学习
Hi~晴天大圣2 小时前
MySQL中JSON 格式字段里某个值修改
android·mysql·json
程序员老赵2 小时前
踩坑必看!配置了 Docker 镜像源,为啥还在疯狂访问官方仓库?
docker·容器
ADHD多动联盟2 小时前
如何有效应对孩子的多动症表现,提升学习能力与专注力?
学习·学习方法·玩游戏
令狐少侠20112 小时前
openclaw运维
运维·ai