Docker基础——Docker Compose(容器编排)

什么是 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 1Version 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查看版本信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晚风吹长发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值