Docker Compose 与容器编排?

2025年 阅读约 10 分钟 面试指南 · Linux/Docker

深入解析Docker Compose:多容器编排、docker-compose.yml配置详解、网络与数据卷、常用命令、与Kubernetes对比,附面试模拟问答。

一句话总结

Docker Compose 是 Docker 官方的多容器编排工具,通过一个 docker-compose.yml 文件定义多个服务、网络、数据卷,一条命令启动所有服务。核心概念:services(服务定义,每个服务对应一个容器)、networks(自定义网络,服务间通过服务名通信)、volumes(数据卷,持久化数据)。常用命令:docker-compose up -d(后台启动)、docker-compose down(停止并删除)、docker-compose logs -f(查看日志)。Compose 适合单机多容器编排,Kubernetes 适合集群编排。

初级理解

docker-compose.yml 示例

# docker-compose.yml:Spring Boot + MySQL + Redis version: '3.8' services: # Spring Boot 应用 app: build: . # 从当前目录 Dockerfile 构建 # image: myapp:latest # 或直接使用镜像 container_name: myapp ports: - "8080:8080" environment: - SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/mydb - SPRING_REDIS_HOST=redis depends_on: - mysql - redis networks: - app-network restart: always # MySQL 数据库 mysql: image: mysql:8.0 container_name: mysql ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: 123456 MYSQL_DATABASE: mydb volumes: - mysql_data:/var/lib/mysql networks: - app-network restart: always # Redis 缓存 redis: image: redis:7-alpine container_name: redis ports: - "6379:6379" volumes: - redis_data:/data networks: - app-network restart: always # 数据卷 volumes: mysql_data: redis_data: # 网络 networks: app-network: driver: bridge

中级深入

常用命令

# 启动/停止 docker-compose up -d # 后台启动所有服务 docker-compose up -d --build # 重新构建并启动 docker-compose up -d app # 只启动 app 服务 docker-compose down # 停止并删除容器/网络 docker-compose down -v # 同时删除数据卷(危险!) docker-compose stop # 停止(不删除容器) docker-compose start # 启动已停止的容器 docker-compose restart # 重启 # 查看状态 docker-compose ps # 查看服务状态 docker-compose logs -f # 查看所有服务日志 docker-compose logs -f app # 查看指定服务日志 docker-compose top # 查看进程 # 进入容器 docker-compose exec app bash # 进入 app 服务容器 docker-compose exec mysql mysql -uroot -p # 执行命令 # 伸缩(仅在不指定端口映射时可用) docker-compose up -d --scale app=3 # 其他 docker-compose config # 验证配置文件 docker-compose pull # 拉取最新镜像

depends_on 与健康检查

# depends_on 只控制启动顺序,不等待服务就绪 # 需要配合健康检查确保依赖服务可用 services: app: depends_on: mysql: condition: service_healthy # 等待 MySQL 健康检查通过 # ... mysql: image: mysql:8.0 healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 10s timeout: 5s retries: 5 start_period: 30s # 健康检查参数: # test:检查命令 # interval:检查间隔 # timeout:超时时间 # retries:重试次数 # start_period:启动缓冲时间(不计数失败)

高级进阶

Compose 网络原理

# Compose 默认创建一个网络(项目名_default) # 所有服务加入该网络,可通过服务名互相访问 # 示例:app 连接 MySQL # 传统方式:jdbc:mysql://192.168.1.100:3306/mydb # Compose:jdbc:mysql://mysql:3306/mydb # 服务名 "mysql" 被 DNS 解析为容器 IP # 自定义网络: networks: frontend: # 前端网络 backend: # 后端网络 services: nginx: networks: - frontend app: networks: - frontend - backend # app 同时连接前后端网络 mysql: networks: - backend # mysql 只在后端网络,前端无法直接访问 # 网络隔离的好处: # 1. 安全性:数据库不暴露给前端 # 2. 清晰架构:前后端分离

Docker Compose vs Kubernetes

对比维度Docker ComposeKubernetes
定位单机多容器编排集群容器编排
规模单台服务器多节点集群
配置docker-compose.ymlYAML(Deployment/Service/...)
服务发现服务名 DNSService + CoreDNS
负载均衡需额外配置Service 内置
滚动更新不支持Deployment 内置
自愈restart: always自动重启+重新调度
适用场景开发/测试/单机部署生产环境/大规模集群

实战场景

# 场景1:本地开发环境一键启动 # docker-compose.yml 包含: # - Spring Boot 应用 # - MySQL # - Redis # - Nacos(注册中心/配置中心) # 一条命令启动完整开发环境 # 场景2:多环境配置 # docker-compose.yml(基础配置) # docker-compose.dev.yml(开发环境覆盖) # docker-compose.prod.yml(生产环境覆盖) # 启动: docker-compose -f docker-compose.yml \ -f docker-compose.dev.yml up -d # 场景3:CI/CD 集成测试 # GitHub Actions / Jenkins 中: docker-compose up -d # 启动依赖服务 ./mvnw test # 运行测试 docker-compose down -v # 清理

面试模拟

面试官:Docker Compose 是什么?和 Kubernetes 有什么区别?

你:Docker Compose 是单机多容器编排工具,通过 docker-compose.yml 定义服务、网络、卷,一条命令启动。Kubernetes 是集群编排平台,支持多节点、自动调度、滚动更新、自愈等。Compose 适合开发测试和单机部署,K8s 适合生产集群。Compose 简单易用,K8s 功能强大但复杂。

面试官:depends_on 能保证服务就绪吗?如何解决?

你:depends_on 只控制启动顺序,不等待服务就绪(如 MySQL 可能还没完成初始化)。解决方案:1)使用 condition: service_healthy 配合 healthcheck;2)应用层重试(Spring Boot 连接重试);3)使用 wait-for-it.sh 等脚本等待端口可用。