Docker Compose 多容器编排实战

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

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

常用生命周期命令

在 compose.yaml 或 docker-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。

相关推荐
镜子AI8 小时前
镜子AI 技术复盘:三条自动化链路上的“停止条件“设计
运维·人工智能·自动化
tianyuanwo9 小时前
NetBox 数据库详解:当“关系型数据库”被装进一个网络运维的领域模型里
运维·数据库·netbox
螺蛳粉 螺蛳粉10 小时前
第 05 篇:etcd 深入:Raft 共识、watch 机制与快照备份恢复实战(底座认知 05)
docker·云原生·容器·kubernetes·etcd·分布式存储·kube-apiserver
知已难寻11 小时前
03 · OpenStack的计算管理 Nova
运维·服务器·开发语言·云原生·云计算·openstack·开源软件
huainingning12 小时前
Windows syslog日志服务器搭建与模拟器对接
运维·服务器·智能路由器
say_fall12 小时前
【Linux系统编程】Ext 文件系统:磁盘与存储、文件与目录、现代计算机究竟如何寻找文件
linux·运维·服务器·数据库·c++
wacsii12 小时前
【Linux进程(一)】Linux 进程初探:操作系统如何管理进程?fork() 为什么返回两次?
linux·运维·服务器
相思难忘成疾13 小时前
从零搭建 Kubernetes 1.30 集群:kubeadm 部署一主多从实战(RHEL 9.3 + Docker + flannel)
linux·运维·kubernetes
PellyKoo13 小时前
【docker】cifs卷改smb密码后容器起不来的解决方法
运维·docker·容器
时早玖沐13 小时前
放弃 QQ 官方机器人:用 SnowLuma + AstrBot 自建 QQ 机器人
docker·开源·agent