四个容器挨个敲docker太麻烦,用Compose一条命令全拉起
【摘要】 用docker-compose.yml定义多容器应用,包含服务依赖、网络隔离、数据卷挂载、环境变量和健康检查。
一个项目跑起来要前端nginx、后端API、数据库PostgreSQL、缓存Redis,四个容器手动 docker run 敲一遍,参数还各不相同,换台机器又重来。Docker Compose 把所有东西写在一个 YAML 里,docker compose up -d 一条命令全拉起来。

一、写个完整的docker-compose.yml
version: "3.9"
services:
web:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./frontend/dist:/usr/share/nginx/html
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
api:
condition: service_healthy
restart: unless-stopped
api:
build: ./backend
ports:
- "8080:8080"
environment:
- DB_HOST=postgres
- DB_PORT=5432
- DB_USER=app
- DB_PASS=secret
- REDIS_ADDR=redis:6379
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_started
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
interval: 10s
timeout: 5s
retries: 3
restart: unless-stopped
postgres:
image: postgres:16-alpine
environment:
POSTGRES_USER: app
POSTGRES_PASSWORD: secret
POSTGRES_DB: myapp
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U app"]
interval: 5s
retries: 5
restart: unless-stopped
redis:
image: redis:7-alpine
command: redis-server --maxmemory 256mb --maxmemory-policy allkeys-lru
volumes:
- redisdata:/data
restart: unless-stopped
volumes:
pgdata:
redisdata:
二、常用命令速查
docker compose up -d # 后台启动全部
docker compose down # 停止并删除容器
docker compose down -v # 连数据卷一起删
docker compose logs -f api # 看api服务日志
docker compose ps # 查看运行状态
docker compose restart api # 重启单个服务
docker compose build # 重新构建镜像
docker compose up -d --scale api=3 # 水平扩展api到3个实例
三、网络隔离
Compose 默认给所有服务建一个 bridge 网络,服务之间用服务名当域名互访。要隔离的话,定义多个网络:
services:
web:
networks: [frontend]
api:
networks: [frontend, backend]
postgres:
networks: [backend]
redis:
networks: [backend]
networks:
frontend:
driver: bridge
backend:
driver: bridge
internal: true # 外部访问不了
web 和 postgres 互相看不见,api 两边都能通,安全边界清晰。
四、环境变量管理
别把密码硬编码在 YAML 里,用 .env 文件:
# .env
DB_PASS=my_secure_password
API_PORT=8080
# docker-compose.yml 里引用
environment:
- DB_PASS=${DB_PASS}
- API_PORT=${API_PORT}
不同环境(开发/测试/生产)各一份 .env,YAML 文件不用改。
五、开发体验优化
本地开发时,代码改了要重新 build 才生效,太慢。挂载源码 + 热重载:
api:
build: ./backend
volumes:
- ./backend:/app # 挂载源码
- /app/node_modules # 排除node_modules
command: air # Go热重载工具
Go 用 air,Python 用 uvicorn --reload,Node 用 nodemon,代码一保存容器内自动重启。
六、和K8s的边界
| 对比项 | Docker Compose | Kubernetes |
|---|---|---|
| 定位 | 本地/单机编排 | 集群编排 |
| 服务发现 | 服务名DNS | Service+DNS |
| 负载均衡 | 无(需手动) | 内置 |
| 滚动更新 | 需手动 | 原生支持 |
| 自愈 | restart策略 | 自动调度 |
| 学习成本 | 低 | 高 |
小结
Compose 适合开发环境和小规模部署,十几台机器以内的项目用它够了。超过这个规模,或者需要滚动更新、自动扩缩容、跨节点调度,就该上 K8s 了。很多人犯的错误是拿 Compose 上生产,没有健康检查、没有资源限制、日志没收集,出了问题两眼一抹黑。加好 healthcheck 和 restart 策略,至少能扛住容器挂掉自动拉起这种基础故障。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)