什么是 Docker Compose
docker-compose 是 Docker 官方的开源项目,使用 python 编写,实现上调用了Docker 服务的 API 进行容器管理及编排,其官方定义为:定义和运行多个 Docker 容器的应用。
docker-compose 中有两个非常重要的概念:
- 服务 ( service ):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
- 项目( project ):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义, 整个 docker-compose.yml 定义一个项目。
Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。
通过 compose 可以方便的管理多个服务:

为什么要 Docker Compose
Docker 是一个轻量化的应用程序,Docker 官方推荐每个 Docker 容器中只运行一个进程**。**如果一个应用需要涉及到 MySQL、nginx 等环境, 那么我们需要分别为应用、数据库和 nginx 创建单独的 docker 容器,然后分别启动容器。
想象一下,当我们构建好 Docker 之后,每次启动应用,都至少需要 docker run 三次, 或者写一些脚本来实现, 这样会比较繁琐。
另外,这些 docker 容器都是分散独立的,也不方便镜像管理。那既然这些 docker容器都是为了同一个应用服务,我们就应该把它们放到一起,这就引出了 docker compose 来解决这类型的问题。
Docker Compose 的功能
- 使用步骤
Compose 使用的步骤:
使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
最后,执行 docker compose up 命令来启动并运行整个应用程序。
- 核心功能
Compose 具有管理应用程序整个生命周期的命令:
- 启动,停止和重建服务
- 查看正在运行的服务的状态
- 流式传输运行服务的日志输出
- 在服务上运行一次性命令
Docker Compose****文件(docker-compose.yml)
文件语法版本
目前官方支持三个大版本, 即 Version 1、Version 2 及 Version 3, 其中 Version 1 已经被废弃掉了。

文件基本结构及常见指令
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 create
networks: # 可选,等价于 docker network create
常见字段格式语法
image
指定容器运行的镜像。以下格式都可以:
image: redis
image: redis:5
image: redis@sha256:0ed5d5928d4737458944eb604cc8509e245c3e19d02ad83935398
bc4b991aac7
image: library/redis
image: docker.io/library/redis
image: my_private.registry:5000/redis
利用:nginx:1.24.0版本的镜像来启动一个容器

使用docker compose up -d 命令来运行这个yml脚本,compose会自动启动我们的容器和一个默认的网络

查看容器启动情况:

查看网络创建情况:

使用docker compose down可以利用compose关闭容器并清理空间:会完全的删除容器和网络

command

覆盖容器启动的默认命令:
command: "tail","-f","/dev/null"
command: tail -f /dev/null
command:
tail
-f
/dev/null
将nginx的容器的command修改为如下:启动容器后nginx服务器不会启动

利用curl 127.0.0.1 发现访问不到服务器,

查看当前容器的详细信息:cmd确实以及被我们修改了

entrypoint
覆盖容器默认的 entrypoint,可以是一个文件,也可以是一个语句

更改entrypoint之后,我们的容器不会去读取默认的entrypoint所有我们的nginx容器启动了,但是nginx服务并不会启动

environment
添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False。
#map 语法
environment:
RACK_ENV: development
SHOW: "true"
USER_INPUT:
#数组语法
environment:
RACK_ENV=development
SHOW=true
USER_INPUT
在yml文件中配置环境变量:

查看容器中的环境变量:

networks
用于指定容器运行的网络
给yml文件进行配置:

启动后发现net1网络中加入了当前容器。

volumes
将主机的数据卷或者文件挂载到容器里
#短语法
services:
db:
image: postgres:latest
volumes:
"/localhost/postgres.sock:/var/run/postgres/postgres.sock"
"/localhost/data:/var/lib/postgresql/data"
#完整语法
services:
backend:
image: awesome/backend
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
volumes:
db-data:
短语法绑定管理卷:

长语法绑定管理卷:

短语法绑定绑定卷:

长语法绑定绑定卷:

ports
指定端口映射。以下格式都可以:
#完整语法
ports:
- target: 80
host_ip: 127.0.0.1
published: 8080
protocol: tcp
mode: host
- target: 80
host_ip: 127.0.0.1
published: 8000-9000
protocol: tcp
mode: host
#短语法
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"
映射端口:

查看结果:

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 之前停止
services:
web:
build: .
depends_on:
db
redis
redis:
image: redis
db:
image: postgres

从构建顺序也可以看出是按照我们的依赖顺序进行的

销毁顺序也可以看出按照顺序进行销毁:

可以指定条件,healthy 需要配置 healthcheck 来完成


env_file
从文件添加环境变量。可以是单个值或列表的多个值
env_file: .env
env_file:
./common.env
./apps/web.env
/opt/secrets.env



Docker Compose****命令清单
|------------------------|----------------------------------------------------------------------------------------------------------------|
| 命令 | 功能 |
| docker compose build | 构建服务 |
| docker compose config | 规范显示服务配置 |
| docker compose cp | 在本地系统和服务器容器之间拷贝文件 |
| docker compose create | 创建服务的容器 |
| docker compose down | 停止所有容器 |
| docker compose events | 从服务器获取实时事件 |
| docker compoes exec | 在容器中指向命令 |
| docker compose images | 列出所有容器使用的镜像 |
| docker compose kill | 强制停止服务的容器 |
| docker compose logs | 显示日志 |
| docker compose ls | 显示所有项目 |
| docker compose pause | 暂停服务 |
| docker compose port | 列出所有映射端口 |
| docker compose ps | 列出项目中的所有容器 |
| docker compose pull | 拉取服务镜像 |
| docker compose push | 推送镜像 |
| docker compose restart | 重启某个服务 |
| docker compose rm | 删除服务停止容器 |
| docker compose run | 在指定服务容器上执行相关命令 |
| docker compose start | 启动被停止的容器 |
| docker compose stop | 停止某个运行的容器 |
| docker compose top | 显示运行的进程 |
| docker compose unpause | 恢复服务 |
| docker compose up | up 命令会构建,(重新)创建,启动,链接一个服务相关的容器。默认情况下如果容器已经存在,将会停止并尝试重新创建他们。并使用之前挂载的卷。--no-recreate 参数可以让容器不被停止或者重新创建,-d 表示后台运行 |
| docker compose version | 查看版本信息 |