摘要
docker compose
是什么?
优点 |
描述 |
简化控制 |
Docker Compose 允许在单个 YAML 文件中定义和管理多容器应用程序,简化了服务编排与协调,使环境管理和复制更容易。 |
高效的协作 |
配置文件易于共享,促进开发人员、运营团队和其他利益相关者之间的协作,从而提升工作流程效率和问题解决速度。 |
快速应用程序开发 |
Compose 利用缓存重复使用未更改服务的容器,加快环境变更速度,提高开发效率。 |
跨环境的可移植性 |
支持在 Compose 文件中使用变量,使配置能根据不同环境或用户进行自定义,增强了可移植性。 |
广泛的社区和支持 |
拥有活跃的社区,提供丰富的资源、教程和技术支持,有助于持续改进与高效排障。 |
docker compose
安装
1 2
| sudo dnf install docker-ce-3:26.1.3-1.el8 docker-ce-cli-3:26.1.3-1.el8 containerd.io docker-buildx-plugin docker-compose-plugin -y
|
1 2
| sudo dnf install docker-compose-plugin -y
|
直接下载docker-compose的命令文件
1 2 3 4 5 6
| sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose version
|
docker compose
命令
命令 |
中文说明 |
示例 |
attach |
连接到服务的运行中容器的标准输入、输出和错误流 |
docker compose attach web |
build |
构建或重新构建服务 |
docker compose build |
config |
解析并标准化 Compose 文件 |
docker compose config |
cp |
在服务容器与本地文件系统之间复制文件/文件夹 |
docker compose cp web:/app/file.txt ./file.txt |
create |
为服务创建容器,但不启动 |
docker compose create |
down |
停止并移除容器、网络等资源 |
docker compose down |
events |
实时接收容器事件 |
docker compose events |
exec |
在运行中的容器中执行命令 |
docker compose exec web ls /app |
images |
列出已创建容器所使用的镜像 |
docker compose images |
kill |
强制停止服务容器 |
docker compose kill |
logs |
查看服务容器的日志输出 |
docker compose logs |
ls |
列出当前运行的 Compose 项目 |
docker compose ls |
pause |
暂停服务容器 |
docker compose pause |
port |
显示某端口映射的公网地址 |
docker compose port web 80 |
ps |
列出服务的容器 |
docker compose ps |
pull |
拉取服务使用的镜像 |
docker compose pull |
push |
推送服务镜像到仓库 |
docker compose push |
restart |
重启服务容器 |
docker compose restart |
rm |
移除已停止的服务容器 |
docker compose rm |
run |
在服务上运行一次性命令 |
docker compose run web echo Hello |
scale |
扩展服务实例数量 |
docker compose up --scale web=3 |
start |
启动已存在但已停止的服务容器 |
docker compose start |
stats |
实时显示容器资源使用情况 |
docker compose stats |
stop |
停止运行中的服务容器 |
docker compose stop |
top |
显示容器内的运行进程 |
docker compose top |
unpause |
取消暂停服务容器 |
docker compose unpause |
up |
创建并启动服务容器 |
docker compose up |
version |
显示 Docker Compose 版本信息 |
docker compose version |
wait |
阻塞直到第一个服务容器停止 |
docker compose wait |
watch |
监听服务构建上下文变更并重新构建/刷新容器 |
docker compose watch |
docker compose
常用命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| docker compose up
docker compose up -d
docker compose -f docker-compose.yml up -d
docker compose up --build
docker compose stop
docker compose kill
docker compose restart
docker compose rm -s
docker compose down
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| docker compose ls
docker compose ps -a
docker compose config
docker compose images
docker compose top
docker compose stats
docker compose logs -f
docker compose logs -f service_name
docker compose exec service_name bash
|
1 2 3 4 5 6
| docker compose down
docker compose pull
docker compose up -d --build
|
docker-compose.yml
的语法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| version: "3.8" name: "project_name" services: servicename: build: image: command: environment: volumes: networks: ports: expose: depends_on: env_file: servicename2: image: command: networks: ports: servicename3:
volumes: networks:
|
volumes
1 2 3 4 5 6 7 8 9 10 11 12 13
| services: backend: image: example/database volumes: - db-data:/etc/data
backup: image: backup-service volumes: - db-data:/var/lib/backup/data
volumes: db-data:
|
volumes 的属性
1 2 3 4
| volumes: db-data: driver: local db-data2:
|
1 2 3 4 5 6
| volumes: db-data: driver_opts: type: "nfs" o: "addr=10.40.0.199,nolock,soft,rw" device: ":/docker/example"
|
1 2 3
| volumes: db-data: external: true
|
1 2 3 4
| volumes: db-data: name: db-data external: true
|
1 2 3 4 5 6
| volumes: db-data: labels: com.example.description: "Database volume" com.example.department: "IT/Ops" com.example.label-with-empty-value: ""
|
networks
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| services: frontend: image: example/webapp networks: - front-tier - back-tier db: image: postgres networks: - backend
networks: front-tier: back-tier:
|
1 2 3 4 5 6 7 8 9 10 11 12
| services: some-service: image: foo
services: some-service: image: foo networks: default: {} networks: default: {}
|
networks 的属性
1 2 3
| networks: gitea: driver: bridge
|
1 2 3 4 5
| networks: frontend: driver: bridge driver_opts: com.docker.network.bridge.host_binding_ipv4: "127.0.0.1"
|
driver_opts 常见配置项(针对 bridge 网络驱动)
选项键名(driver_opts ) |
说明 |
com.docker.network.bridge.name |
指定桥接网络的名称(默认是随机生成,如 br-xxxxx ) |
com.docker.network.bridge.enable_icc |
是否允许容器之间的通信(true 或 false ) |
com.docker.network.bridge.enable_ip_masquerade |
是否启用 IP 假冒(NAT,通常用于外网访问) |
com.docker.network.bridge.host_binding_ipv4 |
设置容器端口绑定到主机的哪个 IP(如 "127.0.0.1" ,绑定到本地) |
com.docker.network.bridge.default_bridge |
是否将该网络设置为默认 bridge 网络(true 或 false ) |
com.docker.network.driver.mtu |
设置网络的最大传输单元(MTU,例如 "1500" ) |
com.docker.network.bridge.allow_non_default_bridge |
是否允许容器加入非默认的 bridge 网络(较少使用) |
1 2 3
| networks: gitea: attachable: true
|
1 2 3
| networks: gitea: external: true
|
1 2 3 4
| networks: gitea: name: gitea external: true
|
1 2 3 4 5 6
| networks: mynet1: labels: com.example.description: "Financial transaction network" com.example.department: "Finance" com.example.label-with-empty-value: ""
|
1 2 3
| networks: gitea: internal: true
|
services
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
networks: gitea: external: false driver: bridge
volumes: gitea: driver: local
services: server: image: gitea/gitea:latest environment: - USER_UID=1000 - USER_GID=1000 - DB_TYPE=mysql - DB_HOST=db:3306 - DB_NAME=gitea - DB_USER=gitea - DB_PASSWD=gitea restart: always networks: - gitea volumes: - gitea:/data - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro ports: - "3000:3000" depends_on: db: condition: service_healthy
db: image: mysql:8 environment: - MYSQL_ROOT_PASSWORD=gitea - MYSQL_USER=gitea - MYSQL_PASSWORD=gitea - MYSQL_DATABASE=gitea restart: always networks: - gitea volumes: - ./mysql:/var/lib/mysql healthcheck: test: ["CMD-SHELL", "mysql -u root -pgitea", "-e 'SELECT 1;'"] interval: 10s timeout: 5s retries: 3
|
1 2 3 4
| services: server: build: . image: example/webapp
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| services: server: build: context: ./webapp dockerfile: Dockerfile platforms: - linux/amd64 args: - FOO=bar labels: com.example.description: "Accounting webapp" com.example.department: "Finance" com.example.label-with-empty-value: ""
|
1 2 3 4
| services: server: command: ["python", "app.py"] image: example/webapp
|
1 2 3 4 5 6 7 8 9 10 11 12
| services: server: image: example/webapp entrypoint: - php - -d - zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so - -d - memory_limit=-1 - vendor/bin/phpunit
|
1 2 3 4 5 6 7 8 9 10
| services: web: build: . depends_on: - db - redis redis: image: redis db: image: postgres
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| services: web: build: . depends_on: db: condition: service_healthy restart: true redis: condition: service_started redis: image: redis db: image: postgres
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| services: server: image: example/webapp environment: - FOO=bar - BAZ=qux
services: server: image: example/webapp environment: FOO: bar BAZ: qux
|
1 2 3 4 5 6
| services: server: image: example/webapp env_file: - ./a.env - ./b.env
|
1 2 3 4 5 6 7 8
| services: server: image: example/webapp env_file: - path: ./default.env required: true - path: ./override.env required: false
|
1 2 3 4 5 6 7 8
| services: server: image: example/webapp restart: "no"
|
1 2 3 4 5 6 7 8 9 10
| services: server: image: example/webapp healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] interval: 1m30s timeout: 10s retries: 3 start_period: 40s start_interval: 5s
|
test定义Compose运行的命令来检查容器运行状况。它可以是字符串,也可以是列表。如果是列表,第一个项目必须是NONE、CMD或CMD-SHELL。如果它是一个字符串,它等同于指定CMD-SHELL后跟该字符串。
1 2 3 4
| test: ["CMD", "curl", "-f", "http://localhost"]
test: ["CMD-SHELL", "curl -f http://localhost || exit 1"] test: curl -f https://localhost || exit 1
|
test 中的 CMD 和 CMD-SHELL 是两种不同的执行方式,它们的主要区别在于:
项目 |
CMD |
CMD-SHELL |
✅ 用途 |
直接执行命令(不通过 shell) |
通过 shell(如 /bin/sh -c )执行命令 |
🧾 写法格式 |
["CMD", "executable", "arg1", "arg2"] |
["CMD-SHELL", "command string"] |
🔧 是否使用 shell |
否 |
是 |
🧠 是否支持 shell 语法 |
❌ 否 (不能使用 && 、 || 、\$VAR 等) |
✅ 是 (支持管道、重定向、变量、命令组合) |
🛡️ 安全性/可移植性 |
✅ 更安全,执行更明确 |
⚠ 依赖容器中存在 shell(如 /bin/sh ) |
⚙️ 执行效率 |
✅ 稍快,因无需 shell 解析 |
⚠ 稍慢,需通过 shell 启动 |
📦 推荐使用场景 |
- 简单健康检查命令 - 安全环境 - 精简镜像 |
- 需要使用逻辑控制(|| , && ) - 复杂检查逻辑 |
📌 示例 |
["CMD", "curl", "-f", "http://localhost"] |
["CMD-SHELL", "curl -f http\://localhost || exit 1"] |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| services: backend: image: example/backend volumes: - type: volume source: db-data target: /data volume: nocopy: true subpath: sub - type: bind source: /var/run/postgres/postgres.sock target: /var/run/postgres/postgres.sock
volumes: db-data:
services: backend: image: example/backend volumes: - db-data:/data - /var/run/postgres/postgres.sock:/var/run/postgres/postgres.sock
volumes: db-data:
|
1 2 3 4 5 6 7 8 9
| services: some-service: networks: - some-network - other-network
networks: some-network: other-network:
|