什么是 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 的功能
1. 使用步骤
Compose 使用的步骤:
使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
最后,执行 docker compose up 命令来启动并运行整个应用程序。
2. 核心功能
Compose 具有管理应用程序整个生命周期的命令:
- 启动,停止和重建服务
- 查看正在运行的服务的状态
- 流式传输运行服务的日志输出
- 在服务上运行一次性命令
Docker Compose 文件(docker-compose.yml)
文件语法版本

文件基本结构及常见指令
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所有我们的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 | 查看版本信息 |
&spm=1001.2101.3001.5002&articleId=163328058&d=1&t=3&u=365c4dc415914fda96605efc9060dc72)
931

被折叠的 条评论
为什么被折叠?



