type
status
date
slug
summary
tags
category
icon
password
一、Docker Compose是什么
前面我们学习过
Dockerfile
模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。这个问题在早期的 Docker 部署时期只能通过 Shell 脚本 + Crontab 计划任务来完成,不但操作复杂,稳定性也没有保障。Docker Compose
刚好可以满足这样的场景。Docker Compose 是单个宿主机上快速编排多个容器的工具,通过一个单独的 docker-compose.yml
模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project),支持容器的自动启动、自动部署、热更新、热升级等功能,非常适合组合使用多个容器进行开发的场景。docker-compose.yml
示例如下:这个
docker-compose.yml
文件定义了 web 和 redis 两个服务。二、Docker Compose使用
1、安装
Compose
支持 Linux、macOS、Windows 10 三大平台。Compose
可以通过 Python 的包管理工具 pip
进行安装,也可以直接下载编译好的二进制文件使用,甚至能够直接在 Docker 容器中运行。Docker Desktop for Mac/Windows
自带 docker-compose
二进制文件,安装 Docker 之后可以直接使用。Linux 系统请使用以下介绍的方法安装。
查看是否安装成功
2、编写配置文件
- 新建空目录作为 Docker Compose 的根目录。
- 新建
docker-compose.yml
配置文件,编排服务启动顺序和依赖关系。并把容器需要的所有资源移动到根目录下。
3、启动
在 Docker Compose 根目录下执行明亮启动所有容器。
三、 Docker Compose 配置文件详解
Docker Compose 使用 YAML 文件来定义多服务的应用。文件可以命名为:
compose.yaml
(官方推荐)
compose.yml
docker-compose.yaml
docker-compose.yml
一个完整的 docker-compose.yml 使用示例如下:
- 启动一个前端服务 webapp 和一个后端服务 database
- 为 webapp 配置 front-tier 网络、back-tier 网络和 sercret 验证
- 为 database 配置持久化卷。
- webapp 和 database 通过 back-tier 网络进行通讯。
整体架构如下所示:
下面是配置文件常用的一级标签:
version
:版本,已废弃。Compose 文件格式有 3 个版本,分别为1
、2.x
和3.x
。目前主流的为 3.x,支持 docker 1.13.0 以上的版本。官方的态度来说,version 字段即将被废弃。如果不加 version 字段启动失败,可以加个version: "3.9"
。
services
:必须字段,定义所有的容器服务。
networks
:配置容器连接的网络,用于容器间的通讯。
volumes
:挂载一个目录或者一个已存在的数据卷容器。
secrets
:存储敏感数据,例如服务密码。
- 2 services, backed by Docker images: webapp and database
- 1 secret (HTTPS certificate), injected into the frontend
- 1 configuration (HTTP), injected into the frontend
- 1 persistent volume, attached to the backend
- 2 networks
services
services 标签是使用最频繁的字段,而且是必须字段。用来定义所有的容器服务
build
指定构建镜像的上下文路径。该路径可以使用绝对路径,也可以使用相对路径(根目录为 Compose 文件所在目录),该路径里面必须包含 Dockerfile 文件。
build 字段也可以使用子字段进行更加详细的配置:
- context:必须字段,上下文路径。
- dockerfile:指定构建镜像的 Dockerfile 文件名。
- args:添加构建参数,这是只能在构建过程中访问的环境变量。
- labels:设置构建镜像的标签。
- target:多层构建,可以指定构建哪一层。
image
指定容器运行的镜像。以下格式都可以:
container_name
指定一个自定义容器名称。如果不指定,容器名称默认以 Compose 文件所在目录名称为前缀。
由于Docker容器名称必须是唯一的,因此如果指定了自定义名称,则无法将服务扩展到多个容器。
volumes
卷挂载路径设置。设置格式有:
宿主机路径:容器路径
宿主机路径:容器路径:访问模式
例如:
command
覆盖容器启动后默认执行的命令。
entrypoint
覆盖容器默认的 entrypoint。
也可以是以下格式:
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 之前停止。 注意:web 服务不会等待 redis db 完全启动 之后才启动。
environment
添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False。
ports
映射端口到宿主机上,格式为
宿主机端口:容器端口
或者仅仅指定容器的端口(宿主将会随机选择端口)。当使用 HOST:CONTAINER 格式来映射端口时,如果你使用的容器端口小于 60 你可能会得到错误得结果,因为 YAML 将会解析 xx:yy 这种数字格式为 60 进制。所以建议采用字符串格式。
expose
暴露端口,但不映射到宿主机,只被连接的服务访问。
healthcheck
用于检测 docker 服务是否健康运行。
network_mode
设置网络模式。
restart
- no:是默认的重启策略,在任何情况下都不会重启容器。
- always:容器总是重新启动。
- on-failure:在容器非正常退出时(退出状态非0),才会重启容器。
- unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
volumes
挂载一个目录或者一个已存在的数据卷容器,作用是:
- 重用数据卷。可以将主机路径挂载为单个服务定义的一部分,无需在一级
volumes
键中定义它。但是想在多个服务中重用一个卷,则需要在一级volumes 中定义一个命名卷。
- 保护宿主机文件。可以直接使用
HOST:CONTAINER
这样的格式,或者使用HOST:CONTAINER:ro
这样的格式,后者对于容器来说,数据卷是只读的,这样可以有效保护宿主机的文件系统。
如下实例,web 服务使用命名卷 (
mydata
),以及为单个服务定义的绑定安装(db
service下的第一个路径volumes
)。db
服务还使用名为dbdata
(db
service下的第二个路径volumes
)的命名卷,使用了旧字符串格式定义它以安装命名卷。命名卷必须列在顶级volumes
键下。简短语法
简短语法使用通用
[SOURCE:]TARGET[:MODE]
格式,其中 SOURCE
可以是主机路径或卷名。TARGET
是安装卷的容器路径。标准模式ro
用于只读和rw
读写(默认)。您可以在主机上挂载一个相对路径,该路径相对于正在使用的 Compose 配置文件的目录展开。相对路径应始终以
.
或开头..
。长语法
type
: 安装类型,bind
tmpfs
或npipe
source
: 安装源、主机上用于绑定安装的路径或在顶级volumes 中定义的卷的名称 。不适用于 tmpfs 挂载。
target
:安装卷的容器中的路径
read_only
: 将卷设置为只读的标志
bind
: 配置额外的绑定选项
networks
默认情况下,Compose 会创建一个默认网络,
services
服务的所有容器都加入默认网络,并且可以被该网络上的其他容器访问。我们可以创建通过 networks
自定义更复杂的网络,在相同网络下的容器可以进行通讯。例如一级配置
networks
创建了自定义的网络 。这里配置了两个frontend
和backend
,且自定义了网络类型。每一个services下,proxy
, app
, db
都定义了networks
配置。proxy
只加入到frontend
网络。
db
只加入到backend
网络。
app
同时加入到frontend
和backend
。
db
和proxy
不能通讯,因为不在一个网络中。
app
和两个都能通讯,因为app
在两个网络中都有配置。
db
和proxy
要通讯,只能通过app
这个应用来连接。
secrets
简短语法
简短的语法仅指定机密名称。以下示例授予
redis
服务对my_secret
和my_other_secret
机密的访问权限。./my_secret.txt
文件的内容被设置为 my_secret,my_other_secret
被定义为外部机密,这意味着它已经在Docker中定义,无论是通过运行docker secret create
命令还是通过另一个堆栈部署,都不会重新创建。如果外部机密不存在,堆栈部署将失败并显示secret not found
错误。长语法
source
:定义机密标识符。
target
:要挂载在/run/secrets/
服务的任务容器中的文件的名称,默认是 source。
uid
和gid
:/run/secrets/
在服务的任务容器中拥有文件的数字 UID 或 GID 。
mode
:要挂载在/run/secrets/
服务的任务容器中的文件的权限,以八进制表示法。例如,0444
代表可读。
下面的示例表示将my_secret 命名为
redis_secret
,模式为0440
(组可读),和用户组为103
。该redis
服务无权访问该my_other_secret
机密。三、Docker Compose 命令
docker-compose 命令需要在 Compose 文件所在目录下执行的,基本格式:
options说明
- f, –file FILE 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定。
- p, –project-name NAME 指定项目名称,默认将使用所在目录名称作为项目名。
- –verbose 输出更多调试信息。
- v, –version 打印版本并退出。
详细参考 这里
启动服务
该命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。链接的服务都将会被自动启动,除非已经处于运行状态。可以说,大部分时候都可以直接通过该命令来启动一个项目。options说明:
- d 在后台运行服务容器。
- –no-color 不使用颜色来区分不同的服务的控制台输出。
- –no-deps 不启动服务所链接的容器。
- –force-recreate 强制重新创建容器,不能与 –no-recreate 同时使用。
- –no-recreate 如果容器已经存在了,则不重新创建,不能与 –force-recreate 同时使用。
- –no-build 不自动构建缺失的服务镜像。
- t, –timeout TIMEOUT 停止容器时候的超时(默认为 10 秒)。
默认情况,启动的容器都在前台,控制台将会同时打印所有容器的输出信息,可以很方便进行调试。当通过 Ctrl-C 停止命令时,所有容器将会停止。一般推荐生产环境下使用后台运行,使用下面命令。
默认情况,如果服务容器已经存在,docker-compose up 将会尝试停止容器,然后重新创建(保持使用 volumes-from 挂载的卷),以保证新启动的服务匹配 docker-compose.yml 文件的最新内容。如果用户不希望容器被停止并重新创建,可以使用下面命令。这样将只会启动处于停止状态的容器,而忽略已经运行的服务。
如果用户只想重新部署某个服务,可以使用下面命令来重新创建服务并后台停止旧服务,启动新服务,并不会影响到其所依赖的服务。
列出所有服务
重新构建服务
停止服务
查看服务日志
启动已存在的服务
停止已运行的服务
重启服务
参考
- Author:mcbilla
- URL:http://mcbilla.com/article/7c6b49bd-2e35-4b9f-b284-4cd1ba391c4a
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts