用 Docker Compose 管理留言板多容器应用

用 Docker Compose 管理留言板多容器应用

导航目录

  1. 引言
  2. 实验前准备
  3. 环境规划
  4. 部署前置条件
  5. 核心配置文件
  6. 部署步骤
  7. 功能验证
  8. [Docker Compose 优势](#Docker Compose 优势)

一、引言

复制代码
目标是将上一个实验中手动启动的 MySQL 和 Python 应用 容器,
通过 docker-compose.yml 文件统一管理,实现 "一键启动 / 停止所有服务"。

描述:

本项目是基于 Flask + MySQL 的留言板应用,通过 Docker Compose 实现开发环境与测试环境的隔离部署,支持独立端口、独立数据库、独立日志存储,确保开发与测试过程互不干扰。

二、实验前准备

基于上一个实验"用 Docker 部署一个带 MySQL 的 Python 留言板"(需要有message-app:v1镜像和mysql:data卷,若没有可重新构建)

进入之前的应用目录:

cd /root/message-board

三、环境规划

环境类型 应用端口 数据库端口 数据库名 日志目录 项目标识(项目名)
开发环境 5000 3307 message_board_dev ./logs/dev dev-project
测试环境 5001 3308 message_board_test ./logs/test test-project

四、部署前置条件

  1. 服务器已安装 Docker 和 Docker Compose;
  2. 服务器开放端口:5000(开发)、5001(测试)、3307(开发MySQL)、3308(测试MySQL);
  3. 项目文件结构:

四、部署前置条件

1. 环境变量文件

开发环境(.env.dev)
ini 复制代码
APP_PORT=5000               # 开发环境应用端口
DB_NAME=message_board_dev   # 开发环境数据库名
DB_PASSWORD=dev123456       # 数据库密码
LOG_DIR=./logs/dev          # 日志目录
DB_PORT=3307                # 数据库映射端口
测试环境(.env.test)
复制代码
APP_PORT=5001               # 测试环境应用端口
DB_NAME=message_board_test  # 测试环境数据库名
DB_PASSWORD=test123456      # 数据库密码
LOG_DIR=./logs/test         # 日志目录
DB_PORT=3308                # 数据库映射端口
2. Docker Compose 配置(docker-compose.yml)
复制代码
version: '3.8'

x-common-config:
  &common-config
  restart: always
  logging:
    driver: "json-file"
    options:
      max-size: "10m"
      max-file: "3"

services:
  db:
    <<: *common-config
    image: mysql:5.7
    container_name: ${ENV}_db
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
      MYSQL_DATABASE: ${DB_NAME}
    volumes:
      - ${ENV}_mysql-data:/var/lib/mysql
    ports:
      - "${DB_PORT}:3306"
    networks:
      - ${ENV}_net
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${DB_PASSWORD}"]
      interval: 5s
      timeout: 5s
      retries: 5

  web:
    <<: *common-config
    build: .
    container_name: ${ENV}_app
    environment:
      DB_HOST: db
      DB_PORT: 3306
      DB_USER: root
      DB_PASSWORD: ${DB_PASSWORD}
      DB_NAME: ${DB_NAME}
    ports:
      - "${APP_PORT}:5000"
    depends_on:
      db:
        condition: service_healthy
    volumes:
      - ${LOG_DIR}:/app/logs
    networks:
      - ${ENV}_net

networks:
  dev_net:
  test_net:

volumes:
  dev_mysql-data:
  test_mysql-data:

3. 应用代码关键优化(app.py

数据库连接重试:最多 10 次重试,间隔 5 秒,避免 MySQL 未就绪导致启动失败;

日志持久化:日志输出到 /app/logs/app.log 并挂载到本地目录,便于排查问题。

六、部署步骤

步骤 1:创建 docker-compose.yml 文件(compose核心配置文件)
复制代码
cat > docker-compose.yml << 'EOF'
version: '3.8'  # Compose 文件版本(需与 Docker 版本兼容)

# 定义所有服务(容器)
services:
  # MySQL 服务(对应之前的 mymysql 容器)
  db:
    image: mysql:5.7  # 使用的镜像
    container_name: mymysql  # 容器名(可选,默认是 项目名_服务名_1)
    environment:  # 环境变量(替代 -e)
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: message_board
    volumes:  # 数据卷挂载(替代 -v)
      - mysql-data:/var/lib/mysql
    ports:  # 端口映射(替代 -p)
      - "3306:3306"
    restart: always  # 容器退出时自动重启(新增配置)

  # Python 应用服务(对应之前的 myapp 容器)
  web:
    image: message-app:v1  # 使用上一个实验构建的镜像
    container_name: myapp
    environment:
      DB_HOST: db  # 连接 MySQL 服务名(替代容器名,Compose 自动解析)
      DB_PASSWORD: 123456
      DB_NAME: message_board
    ports:
      - "5000:5000"
    depends_on:  # 依赖 db 服务,确保 db 先启动
      - db
    restart: always

# 声明数据卷(需与上面的 volumes 对应)
volumes:
  mysql-data:  # 复用之前创建的命名卷(若不存在会自动创建)
EOF
步骤2:理解docker-compose.yml核心配置
复制代码
配置项	      作用说明
version	    指定 Compose 语法版本(3.8 是较新且稳定的版本)。
services	定义所有容器服务(这里有 db 和 web 两个服务)。
depends_on	定义启动顺序(web 依赖 db,确保 db 先启动再启动 web)。
volumes	     声明全局数据卷(复用之前的 mysql-data,确保数据持久化)。
restart: always	容器意外退出时自动重启(比手动启动更稳定,适合生产环境)。
步骤 3:使用 Docker Compose 操作服务
启动所有服务(首次运行)
复制代码
# 前台启动(可看到日志输出,按 Ctrl+C 停止)
docker compose up

# 推荐使用后台启动方式(-d 表示 detached 模式)
docker compose up -d

启动成功后,会自动创建默认网络,web 服务可通过 db 这个服务名直接连接 MySQL(无需 --link)。
查看服务状态
复制代码
# 查看正在运行的服务
docker compose ps

# 查看所有服务(包括已停止的)
docker compose ps -a
查看服务日志
复制代码
# 查看所有服务的日志(实时输出)
docker compose logs -f

# 只查看 web 服务的日志
docker compose logs -f web
停止并删除服务
复制代码
# 停止服务(保留容器、网络、数据卷)
docker compose stop

# 停止并删除容器、网络(保留数据卷,推荐)
docker compose down

# 停止并删除所有(包括数据卷,谨慎使用!会丢失 MySQL 数据)
docker compose down -v

七、功能验证

复制代码
步骤1:查看数据卷的独立性
# 查看所有数据卷(确认开发/测试数据卷独立存在)
docker volume ls | grep -E "dev-project|test-project"
正常输出应包含两个独立的数据卷:
local     dev-project_dev_mysql-data
local     test-project_test_mysql-data
步骤2:向开发环境写入数据
1. 访问开发环境:http://服务器IP:5000  
2. 提交一条留言(例如:这是开发环境的测试数据)。
步骤3:检查测试环境是否存在开发环境的数据
1. 访问测试环境:http://服务器IP:5001  
2. 确认页面中 没有 步骤2中提交的留言(若为空,说明隔离生效)。
步骤4:向测试环境写入数据
1. 在测试环境提交一条留言(例如:这是测试环境的测试数据)。
步骤5:检查开发环境是否存在测试环境的数据
1. 刷新开发环境页面:http://服务器IP:5000  
2. 确认页面中 没有 步骤4中提交的留言。
步骤6:通过数据库直接验证(更彻底)
1. 进入开发环境的 MySQL 容器,查看数据:
# 进入开发环境MySQL容器
docker exec -it dev_db mysql -u root -pdev123456
# 查看开发环境数据库中的留言
use message_board_dev;
select * from messages;  # 应仅显示步骤2中提交的留言
exit;

2. 进入测试环境的 MySQL 容器,查看数据:
# 进入测试环境MySQL容器
docker exec -it test_db mysql -u root -ptest123456
# 查看测试环境数据库中的留言
use message_board_test;
select * from messages;  # 应仅显示步骤4中提交的留言
exit;
留言


开发环境-数据库检查:
测试环境-数据库检查

八、Docker Compose 优势

1.配置即代码:所有容器参数写在 docker-compose.yml 中,无需记忆复杂命令,方便版本控制。

2.一键操作:up 启动所有服务,down 停止所有服务,比手动逐个操作高效 10 倍。

3.网络自动管理:服务间通过服务名通信(如 web 用 db 连接 MySQL),无需手动配置 --link 或网络。

4.依赖控制:depends_on 确保服务启动顺序,避免 "应用启动时数据库还没就绪" 的问题

相关推荐
再ZzZ4 分钟前
Docker快速部署Kafka(内网通用版本)
docker·容器·kafka
C+++Python32 分钟前
Linux/C++多进程
linux·运维·c++
最贪吃的虎33 分钟前
GitHub推送又超时了?试试SSH
运维·ssh·github
XZY02843 分钟前
如何使用grpc
运维·服务器
rleS IONS1 小时前
SQL2000在win10上安装的方法
运维·服务器
Stack Overflow?Tan901 小时前
linux ubuntu22.04安装ROS2humble完整版的流程
linux·docker·ros2
zly35001 小时前
centos7 sshd无法启动
linux·运维·服务器
编程大师哥2 小时前
Linux 命名管道(FIFO)通信 超清晰讲解
linux·运维·服务器
Smile_2542204182 小时前
linux服务器清理磁盘
linux·运维·服务器
KivenMitnick3 小时前
Claude Code--Ubuntu Linux超详细配置教程(附每步的可能报错及解决方法)
linux·运维·ubuntu