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,与你一键相逢!
1517

被折叠的 条评论
为什么被折叠?



