Docker 实战系列(三):Docker Compose + 多服务协同打包详解

Docker 实战系列(三):Docker Compose + 多服务协同打包详解

本篇主题:使用 Docker Compose 编排多服务项目
适用人群:了解基本的 Docker 镜像构建,想进一步实现应用与数据库、缓存、队列等服务联动的开发者。


✦ 场景背景

我们已经拥有了一个基于 Flask 的 Python 应用,运行良好。但在真实业务中,常常需要多个服务配合运行,例如:

  • Flask 应用负责提供 HTTP API
  • PostgreSQL 提供数据库存储
  • Redis 提供缓存或任务队列
    通过 Docker Compose,我们可以用一套配置文件一次性启动多个容器,彼此通过容器名互联互通,开发体验更流畅。

一、准备项目结构

我们定义一个简单的“文章系统”示例项目,包含 Flask + PostgreSQL:

myproject/
├── docker-compose.yml
├── app/
│   ├── Dockerfile
│   ├── app.py
│   ├── requirements.txt
└── db/
    └── init.sql

二、编写 Flask 服务代码(app/app.py)

from flask import Flask
import psycopg2
import os
app = Flask(__name__)
def get_connection():
    return psycopg2.connect(
        dbname=os.getenv("POSTGRES_DB"),
        user=os.getenv("POSTGRES_USER"),
        password=os.getenv("POSTGRES_PASSWORD"),
        host="db",   # 注意:这里使用服务名 db 作为主机名
        port=5432
    )
@app.route('/')
def index():
    conn = get_connection()
    cur = conn.cursor()
    cur.execute("SELECT message FROM greetings LIMIT 1;")
    result = cur.fetchone()
    cur.close()
    conn.close()
    return result[0] if result else "No data"
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080)

三、准备 Flask 的 Dockerfile(app/Dockerfile)

FROM python:3.11-slim
WORKDIR /opt/app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 8080
CMD ["python", "app.py"]

四、Flask 依赖(app/requirements.txt)

flask
psycopg2-binary

五、PostgreSQL 初始化脚本(db/init.sql)

CREATE TABLE IF NOT EXISTS greetings (
    id SERIAL PRIMARY KEY,
    message TEXT NOT NULL
);
INSERT INTO greetings (message) VALUES ('Hello from PostgreSQL!');

六、编写 docker-compose.yml

version: '3.9'
services:
  web:
    build: ./app
    ports:
      - "8080:8080"
    environment:
      - POSTGRES_DB=example
      - POSTGRES_USER=example
      - POSTGRES_PASSWORD=secret
    depends_on:
      - db
  db:
    image: postgres:15
    environment:
      - POSTGRES_DB=example
      - POSTGRES_USER=example
      - POSTGRES_PASSWORD=secret
    volumes:
      - db_data:/var/lib/postgresql/data
      - ./db/init.sql:/docker-entrypoint-initdb.d/init.sql:ro
volumes:
  db_data:

七、一键启动所有服务

在项目根目录下执行:

docker compose up --build

等待几秒后访问:

http://localhost:8080

输出:

Hello from PostgreSQL!

👏👏 你现在拥有一个可以快速部署的完整应用栈


八、更多技巧(进阶)

功能方法
容器互通Compose 默认创建同一网络,服务名可直接作为主机名
数据持久化使用 volume 映射数据库数据目录
初始化数据PostgreSQL 支持自动执行 /docker-entrypoint-initdb.d/*.sql
服务依赖控制depends_on 让主服务等待数据库容器
环境配置.env 文件统一管理密码、配置更安全

九、常用命令汇总

# 构建并启动所有服务
docker compose up --build
# 后台运行
docker compose up -d
# 查看日志
docker compose logs -f
# 停止服务
docker compose down
# 停止并清除所有卷
docker compose down -v

十、小结

到目前为止,你已经掌握了:
✅ 编写 Dockerfile 构建应用镜像
✅ 使用 docker-compose.yml 编排多个服务
✅ 快速部署一个数据库驱动的 Web 应用
✅ 使用容器服务名代替 IP 地址实现自动网络互通


十一、下一步你可以考虑:

  • 加入 Redis 实现缓存或任务队列
  • 引入 Nginx 实现反向代理 + TLS
  • 加入测试容器进行自动化测试
  • 部署到 Kubernetes,体验更大规模编排

结语
💬 重点提醒 :喜欢请加关注哦 !
📣 更多原创内容、技术干货,欢迎关注「键上江湖」公棕HAO,与你一键相逢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

derek2026

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值