四个容器挨个敲docker太麻烦,用Compose一条命令全拉起

举报
柠檬-夏日清爽 发表于 2026/09/22 10:30:04 2026/09/22
【摘要】 用docker-compose.yml定义多容器应用,包含服务依赖、网络隔离、数据卷挂载、环境变量和健康检查。

一个项目跑起来要前端nginx、后端API、数据库PostgreSQL、缓存Redis,四个容器手动 docker run 敲一遍,参数还各不相同,换台机器又重来。Docker Compose 把所有东西写在一个 YAML 里,docker compose up -d 一条命令全拉起来。

image.png

一、写个完整的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)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。