Docker Compose核心功能
-
使用YAML文件定义多容器应用
-
一键启动/停止/重建整个应用栈
-
管理服务依赖关系与网络配置
-
环境变量集中管理,适配多环境部署
-
核心概念层级
-
Service(服务):一个应用组件,可包含多个相同镜像的容器实例
-
Project(项目):一组关联服务组成的业务单元,由
docker-compose.yml定义 -
Container(容器):服务的运行实例,基于镜像创建
-
YAML文件关键配置项
| 配置项 | 说明 | 示例 |
|---|---|---|
| image | 指定镜像 | image: nginx:latest |
| build | 构建镜像 | build: {context: ./app, dockerfile: Dockerfile.prod} |
| ports | 端口映射 | ports: ["80:80", "443:443"] |
| expose | 内部暴露端口(不映射到主机) | expose: ["80"] |
| environment | 环境变量 | environment: {MYSQL_ROOT_PASSWORD: lee} |
| volumes | 数据卷挂载 | volumes: ["/host/data:/container/data:ro"] |
| networks | 网络连接 | networks: [mynet1, mynet2] |
| command | 覆盖默认启动命令 | command: ["python","app.py"] |
| restart | 重启策略 | restart: always |
| container_name | 指定容器名称 | container_name: webserver |
| network_mode | 使用指定网络模式 | network_mode: bridge |
-
网络与卷的自定义
-
networks:定义自定义网络驱动、子网、外部网络引用 -
volumes:定义命名卷,支持外部卷引用
-
常用命令
bash
# 启动服务(后台运行)
docker compose up -d
# 指定YAML文件启动
docker compose -f custom.yml up -d
# 启动前重新构建镜像
docker compose up -d --build
# 停止并删除服务、网络、卷
docker compose down
# 启动/停止/重启已存在服务
docker compose start
docker compose stop
docker compose restart
# 查看服务状态
docker compose ps
# 查看服务日志
docker compose logs
docker compose logs -f web # 跟踪指定服务日志
# 在运行容器中执行命令
docker compose exec web bash
# 拉取服务镜像
docker compose pull
# 验证YAML配置
docker compose config
docker compose config -q # 静默验证,无输出表示正确
# ===== 构建自定义镜像 =====
# Dockerfile示例
vim Dockerfile
# 内容:
# FROM busybox:latest
# RUN touch /leefile1
# docker-compose.yml示例
vim compose.yml
# 内容:
# version: "3.8"
# services:
# test1:
# image: test1
# build:
# context: /root/test
# dockerfile: Dockerfile
# command: ["/bin/sh","-c","sleep 3000"]
# restart: always
# container_name: busybox1
# 构建镜像
docker compose build
docker compose build test1 # 仅构建指定服务
# 启动(自动拉取或构建)
docker compose up -d # 若镜像不存在会尝试pull
docker compose up -d --build # 强制先构建再启动
# ===== 企业示例:HAProxy + Nginx负载均衡 =====
# 目录结构
/docker/
├── web/
│ ├── html1/ # web1站点内容
│ └── html2/ # web2站点内容
├── conf/
│ └── haproxy/
│ └── haproxy.cfg
└── docker-compose.yml
# haproxy.cfg示例
vim /docker/conf/haproxy/haproxy.cfg
# 内容:
# global
# log stdout format raw local0
# defaults
# mode http
# timeout connect 5000ms
# timeout client 50000ms
# timeout server 50000ms
# frontend http_front
# bind *:80
# default_backend http_back
# backend http_back
# balance roundrobin
# server web1 web1:80 check
# server web2 web2:80 check
# docker-compose.yml示例
vim docker-compose.yml
# 内容:
# version: "3.8"
# services:
# web1:
# image: nginx:latest
# container_name: web1
# restart: always
# networks: [mynet1]
# expose: ["80"]
# volumes: ["/docker/web/html1:/usr/share/nginx/html"]
# web2:
# image: nginx:latest
# container_name: web2
# restart: always
# networks: [mynet1]
# expose: ["80"]
# volumes: ["/docker/web/html2:/usr/share/nginx/html"]
# haproxy:
# image: haproxy:2.3
# container_name: haproxy
# restart: always
# networks: [mynet1, mynet2]
# volumes: ["/docker/conf/haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg"]
# ports: ["80:80"]
# networks:
# mynet1:
# driver: bridge
# mynet2:
# driver: bridge
# 启动负载均衡架构
docker compose up -d
# 验证
curl http://<宿主机IP> # 应轮询返回web1或web2内容
# ===== 高级网络配置示例 =====
vim compose.yml
# 内容:
# services:
# test:
# image: busybox
# container_name: busybox1
# command: ["/bin/sh","-c","sleep 3000"]
# restart: always
# networks:
# - mynet1
# - mynet2
# networks:
# mynet1:
# driver: bridge
# mynet2:
# ipam:
# driver: default
# config:
# - subnet: 172.28.0.0/16
# gateway: 172.28.0.254
# default:
# external: true
# name: bridge # 使用外部已有网络
# ===== 数据卷配置示例 =====
vim compose.yml
# 内容:
# services:
# test:
# image: busybox
# container_name: busybox1
# command: ["/bin/sh","-c","sleep 3000"]
# restart: always
# volumes:
# - data:/test
# - /etc/passwd:/tmp/passwd:ro
# volumes:
# data:
# name: timinglee # 指定卷名称