核心定义
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它允许您使用一个单独的配置文件(通常是 .yml 格式)来配置应用程序的所有服务、网络和卷,然后通过一条简单的命令就能创建和启动所有服务。
可以把它想象成一个自动化脚本或编排工具,专门用于在单台主机上部署由多个容器组成的应用。
为什么要使用 Docker Compose?解决什么问题?
在理解 Compose 之前,先想想如果不用它,会多麻烦: 假设应用由以下服务组成:Web 应用、Redis 缓存服务、MySQL 数据库服务,如果没有 Docker Compose,你需要手动完成以下步骤:
你需要记住并输入一大堆 docker run 命令,这个过程非常繁琐且容易出错。
Docker Compose 解决了这个问题:
docker-compose.yml)描述整个应用栈的架构。docker compose up)就能同时创建、启动所有服务,并处理好它们之间的依赖关系。核心概念与工作流程
docker-compose.yml 文件:
这是 Docker Compose 的核心。你在这个 YAML 文件中定义你的应用所需的服务、网络和卷。
docker compose up 命令:
在包含 docker-compose.yml 文件的目录下运行此命令。Compose 会:
docker compose down 命令:
当你想要停止并清理整个应用时,运行此命令。它会停止所有容器,并删除创建的容器和网络(默认情况下不删除卷)。
总结:Docker Compose 的优点
docker run 命令。注意:Docker Compose 通常用于开发、测试和单机部署。对于生产环境中跨多台主机的集群管理和编排,更强大的工具如 Kubernetes 或 Docker Swarm 更为合适。不过,Compose 文件可以作为学习这些更复杂工具的基础。
version:指定Docker Compose文件的版本格式,不同版本支持的功能和语法有所不同,高版本兼容低版本services: 服务,可以存在多个servicename: 服务名字,它也是内部bridge网络可以使用的DNS name,如果不是集群模式相当于docker run的时候指定的一个名称,集群(Swarm)模式是多个容器的逻辑抽象image: 镜像的名字(必选)command: 如果设置,则会覆盖默认镜像里的CMD命令environment: 等价于docker container run里的–env选项,设置环境变量volumes: 等价于docker container run里的-v选项,绑定数据卷networks: 等价于docker container run里的–network选项,指定网络ports: 等价于docker container run里的-p选项,指定端口映射expose: 可选,指定容器暴露的端口build: 构建目录depends_on: 服务依赖配置env_file: 环境变量文件servicename2:image:command:networks:ports:servicename3: #…volumes: # 可选,等价于docker volume createnetworks: # 可选,等价于docker network create
准备这样一个目录结构:
mycompose/
├── prj1
│ └── docker-compose.yml
├── prj2
│ └── docker-compose.yml
└── prj3
└── docker-compose.yml
......image 功能:指定容器镜像 示例:
创建prj1目录:
mkdir prj1在prj1中创建文件docker-compose.yml
cd prj1touch docker-compose.yml编辑docker-compose文件
vim docker-compose.yml
services:
web:
image: nginx:1.24.0启动配置
docker compose up清除容器
docker compose down
接下来就不再详细展示每个步骤,重点讲解第3步文件的配置。 command 功能:覆盖容器启动的默认指令 格式:
command: ["bundle", "exec", "thin", "-p", "3000"]
//或
command: bundle exec thin -p 3000示例:
serveices:
web:
image: nginx:1.24.0
command: bundle exec thin -p 3000这些内容都写在配置文件docker-compose.yml里面

entrypoint
功能:覆盖容器默认的 entrypoint。
格式:
entrypoint: /code/entrypoint.sh也可以是列表格式:
entrypoint:
- php
- -d
- zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so
- -d
- memory_limit=-1
- vendor/bin/phpunit示例:
services:
web:
image: nginx:1.24.0
entrypoint:
- tail
- -f
- /etc/os-releaseenvironment
environment
功能:
添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False。
格式:
# map 格式
environment:
RACK_ENV: development
SHOW: "true"
USER_INPUT:# 数组格式
environment:
- RACK_ENV=development
- SHOW=true
- USER_INPUT=示例:
services:
web:
image: nginx:1.24.0
environment:
TEST: 1
networks 功能:配置容器网络 示例:
services:
web:
image: nginx:1.24.0
networks:
- web1
- web2
networks:
web1:
web2:
volume 功能:配置容器的存储卷
#短语法
volumes:
- "/localhost/postgres.sock:/var/run/postgres/postgres.sock"
- "/localhost/data:/var/lib/postgresql/data"
#完整语法
volumes:
#命名卷
- type: volume
source: db-data
target: /data
volume:
nocopy: true
#绑定卷
- type: bind
source: /var/run/postgres/postgres.sock
target: /var/run/postgres/postgres.sock示例:
services:
web:
image: nginx:1.24.0
volumes:
- /home/qsy/gitDocker/data/myvolumes:/usr/share/nginx/html/ports 功能:配置容器的端口映射
#完整语法
ports:
- target: 80
host_ip: 127.0.0.1
published: 8080
protocol: tcp
mode: host
- target: 80
host_ip: 127.0.0.1
#短语法
ports:
- "3000"
- "3000-3005"
- "8000:8000"
- "9090-9091:8080-8081"
- "49100:22"
- "127.0.0.1:8001:8001"
- "127.0.0.1:5000-5010:5000-5010"
- "6060:6060/udp"示例:
services:
web:
image: nginx:1.24.0
ports:
- 7070:80expose 功能:暴露端口,但不映射到宿主机,只被连接的服务访问。仅可以指定内部端口为参数. 格式/示例:
expose:
- "3000"
- "8000"depends_on 功能:设置依赖关系
docker compose up:以依赖性顺序启动服务。在以下示例中,先启动 db 和 redis,才会启动 web。docker compose up SERVICE:自动包含 SERVICE 的依赖项。在以下示例中,docker compose up web 还将创建并启动 db 和 redis。docker compose stop:按依赖关系顺序停止服务。在以下示例中,web 在 db 和 redis 之前停止。version: "3.7"
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgresenv_file 从文件添加环境变量。可以是单个值或列表的多个值。
env_file: xxx.env也可以是列表格式:
env_file:
- ./.env
- ./apps/web.env
- /opt/secrets.envdocker compose 指令与容器操作相似,只不过把容器改成了服务
命令格式:
docker-compose 命令的基本的使用格式为
docker compose [OPTIONS] COMMAND [ARGS...]命令清单:
用法和功能与容器的相关指令类似,只是docker compose的操作对象是服务而已。 参考文章:Docker容器核心指令 关键命令选项 up 功能: 该命令的作用十分强大,它会尝试自动完成包括构建镜像、(重新)创建服务、启动服务并关联服务相关容器的一系列操作,可以直接通过该命令来启动一个项目。 语法:
docker compose up [options] [service...]选项说明:
-d 在后台运行服务器,推荐在生产环境下使用该选项--force-recreate 强制重新创建容器,不能与 --no-recreate 同时使用--no-recreate 如果容器已经存在了,则不重新创建,不能与 --force-recreate 同时使用down 功能:停止所有容器,并删除容器和网络。 语法:
docker compose down [options] [SERVICE...]选项说明:
-v, --volumes:删除容器同时删除目录映射。run 功能:该命令可以在指定服务器上执行相关的命令 语法:
# 例如:启动一个 ubuntu 服务容器,并执行 ping docker.com 命令
# docker compose run ubuntu ping docker.com
docker compose run [options] SERVICE [COMMAND] [ARGS...]与docker run的区别,该指令是用服务启动容器,而不是镜像 选项说明:
-d 后台运行容器--name NAME 为容器指定一个名字--entrypoint CMD 覆盖默认的容器启动指令-e KEY=VAL 设置环境变量值,可多次使用选项来设置多个环境变量-u, --user="" 指定运行容器的用户名或者 uid--rm 运行命令后自动删除容器-p, --publish=[] 映射容器端口到本地主机示例:

docker-compose.yml配置

启动,会先启动依赖的服务。

清理,与启动相反,先清理主要的服务,然后清理依赖的服务。

非常感谢您能耐心读完这篇文章。倘若您从中有所收获,还望多多支持呀!