Docker Compose 多容器编排实战

Docker 入门(五):Docker Compose 编排多容器应用

当一个应用包含数据库、缓存、后端和前端等多个服务时,逐个执行 docker run 很快会变得难以维护。Docker Compose 使用一个 YAML 文件描述服务、网络、端口、环境变量和数据卷,让整套环境可以一次启动和停止。

常用生命周期命令

compose.yamldocker-compose.yml 所在目录执行:

bash 复制代码
docker compose up -d       # 创建并后台启动
docker compose logs -f     # 查看实时日志
docker compose stop        # 停止容器,保留容器
docker compose start       # 启动已停止的容器
docker compose down        # 停止并删除容器、网络

新版 Docker 推荐使用 docker compose 子命令;旧环境也可能使用独立的 docker-compose 命令。

Compose 文件核心字段

  • services:定义应用服务。
  • image:使用已有镜像;build:从 Dockerfile 构建镜像。
  • command:覆盖镜像默认命令。
  • container_name:指定容器名称,团队协作时应谨慎使用以避免重名。
  • ports:将宿主机端口映射到容器端口。
  • depends_on:声明启动顺序,不代表依赖服务已经真正就绪。
  • environment:传入环境变量,敏感值应使用外部密钥管理。
  • expose:只在 Compose 网络内声明服务端口,不发布到宿主机。
  • restart:配置容器异常退出后的重启策略。
  • volumes:挂载命名卷或宿主机目录,持久化数据和配置。
  • networks:定义服务之间的通信网络。
  • working_dir:设置容器内的工作目录。

一个简单示例

yaml 复制代码
services:
  web:
    image: nginx:1.27-alpine
    ports:
      - "8080:80"
    depends_on:
      - api
    networks: [app]

  api:
    build: ./api
    environment:
      DB_HOST: db
    networks: [app]

  db:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD: change-me
    volumes:
      - pgdata:/var/lib/postgresql/data
    networks: [app]

volumes:
  pgdata:

networks:
  app:

在同一个 Compose 网络中,服务可以直接使用服务名互相访问,例如 API 通过 db:5432 连接数据库。生产环境不要把示例密码直接提交到代码仓库,应改用 .env、Secrets 或外部配置中心。

Portainer:可选的图形化管理

Portainer 可以通过 Web 界面查看容器、镜像、网络和卷,适合学习和日常运维。部署时仍要为管理端设置强密码,并限制访问来源。

小结

Compose 的价值在于把多容器环境声明式地保存下来。掌握服务、网络、卷、端口和环境变量后,就可以用同一份配置复现开发环境,并进一步接入 CI/CD。

相关推荐
虎头金猫2 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
分布式存储与RustFS2 天前
MinIO 官方 Docker 镜像被移除:依赖它的项目该怎么办
docker·云原生·devops·对象存储·minio·分布式存储
AI职业加油站2 天前
AI智能体应用工程师证书:政策红利下的职业新风口
大数据·运维·人工智能·学习·职场发展
此冬歌咏2 天前
K8s 节点故障实战:优雅驱逐 31 秒,硬故障 331 秒,以及那个永远 Pending 的 Pod
运维·k8s
玉&心2 天前
通过Arthas在线诊断K8S中的内存及JVM等使用情况
docker·k8s·arthas
xing-xing2 天前
Docker容器中Nginx站点根目录网页配置访问
nginx·docker
-梅2 天前
linux(8) 软硬链接
linux·运维·服务器
赵文宇(温玉)2 天前
CoreDNS的hosts插件的缺行配置导致k8s集群异常
容器·kubernetes·rancher
guo_wen_qiang2 天前
上传本地镜像到harbor中
docker·容器·持续部署
张洛闻Eren2 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github