用 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 确保服务启动顺序,避免 "应用启动时数据库还没就绪" 的问题

相关推荐
涛声依旧393162 小时前
安装部署自己的nginx
运维·服务器·nginx
Radan小哥2 小时前
Docker学习笔记---day002
笔记·学习·docker
wanhengidc2 小时前
物理服务器都有哪些作用?
运维·服务器·安全·智能手机·云计算
lys_8285 小时前
【linux】解决NAT模型下使用Xshell连接虚拟机显示22端口connection failed问题
linux·运维·服务器
Mxsoft6195 小时前
电力系统智能运维网络安全威胁检测与防御策略
运维·安全·web安全
序属秋秋秋6 小时前
《Linux系统编程之系统导论》【冯诺依曼体系结构 + 操作系统基本概述】
linux·运维·服务器·c语言·ubuntu·操作系统·冯诺依曼体系结构
roman_日积跬步-终至千里7 小时前
【Docker多节点部署】基于“配置即身份“理念的 Docker 多节点 StarRocks 高可用集群自动化部署方案
java·docker·微服务
piepis7 小时前
Doris Docker 完整部署指南
数据仓库·docker·doris·容器部署
LSL666_9 小时前
5 Repository 层接口
android·运维·elasticsearch·jenkins·repository