Docker-Compose环境搭建及其使用
Compose文件是一个定义Docker应用程序的服务,网络和卷的YAML文件。
简介
Compose文件是一个定义Docker应用程序的服务,网络和卷的YAML文件。
兼容
有几种版本的Compose文件格式 1、2、2.x和3.x
此表显示哪些Compose文件版本支持特定的Docker版本。
Compose file format | Docker Engine release |
---|---|
3.3 | 17.06.0+ |
3.2 | 17.04.0+ |
3.1 | 1.13.1+ |
3.0 | 1.13.0+ |
2.3 | 17.06.0+ |
2.2 | 1.13.0+ |
2.1 | 1.12.0+ |
2.0 | 1.10.0+ |
1.0 | 1.9.1.+ |
版本
目前有三种版本的Compose文件格式:
- 版本1,传统格式。这是通过省略
version
YAML根部的一个键来指定的。 - 版本2.x. 这是通过YAML根部的一个
version: '2'
或者version: '2.1'
等等条目指定的。 - 版本3.x是最新和推荐的版本,旨在在Compose和Docker Engine的swarm模式之间交叉兼容。这是通过YAML根部的一个
version: '3'
或者version: '3.1'
等等条目指定的。
下面将一一介绍版本差异:
版本1
当在书写docker-compose.yml
文件时不声明文件版本时,默认为版本1。这个版本中,所有的服务都是直接声明在根下的。
在版本1文件中是不能声明volumes
、network
和构建参数的。
在使用版本1时,Compose会将每一个容器都放置在一个默认的bridge
环境中。
example:
版本2
当在书写docker-compose.yml
文件时,此时则必须在文档根目录下声明版本号。
所有的服务均需声明在services:
目录下。
命名卷声明在volumes:
目录下,网络声明在networks:
目录下。
默认情况下,每个容器均会加入Project(应用程序:即一个docker-compose.yml
文件的范围)范围的默认网络中,并且相互之间可以使用服务名访问对方,links
可以弃用了。
example:
Full example:
版本2.1
引入以下附加参数:
link_local_ips
isolation
labels
name
userns_mode
healthcheck
sysctls
pids_limit
版本2.2
引入以下附加参数:
init
scale
版本2.3
引入以下附加参数:
target
start_period
与healthchecks
版本3
为了在Compose和Docker Engine的swarm模式之间交叉兼容,版本3删除了几个选项并添加了更多选项。
- 删除:
volume_driver
,volumes_from
,cpu_shares
,cpu_quota
,cpuset
,mem_limit
,memswap_limit
,extends
,group_add
。请参阅升级指南以了解如何迁移这些指南。(有关更多信息extends
,请参阅扩展服务。) - 补充:部署
版本3.3
引入以下附加参数:
- 建立
labels
credential_spec
configs
- 部署
endpoint_mode
升级
版本2.x到3.x
在版本2.x和3.x之间,yml文件的结构是相同的,但是几个选项已被删除:
volume_driver
:不是在服务上设置卷驱动,而是使用顶层volumes
选项定义卷并在那里指定驱动。版本:“3”服务:db:image:postgres卷: - data:/ var / lib / postgresql
/ data卷:data:驱动程序:mydrivervolumes_from
:要在服务之间共享卷,请使用顶级volumes
选项对其进行定义,并从使用服务级别volumes
选项共享服务的每个服务中引用它。cpu_shares
,cpu_quota
,cpuset
,mem_limit
,memswap_limit
:这些已被替换下的资源键deploy
。请注意,deploy
配置仅在使用时生效docker stack deploy
,并被忽略docker-compose
。extends
:对于version: "3.x"
撰写文件,此选项已被删除。(有关更多信息,请参阅扩展服务。)group_add
:对于version: "3.x"
撰写文件,此选项已被删除。pids_limit
:此选项尚未在version: "3.x"
Compose文件中引入。link_local_ips
innetworks
:该选项尚未在version: "3.x"
Compose文件中引入。
版本1到2.x
在大多数情况下,从版本1移动到2是一个非常简单的过程:
- 将整个文件缩进一层,并
services:
在顶部放置一个键。 version: '2'
在文件顶部添加一行。
如果您使用特定的配置功能,则会更加复杂:
dockerfile
:现在context
在build
之下:build: context:
。dockerfile:Dockerfile-alternatelog_driver
,log_opt
:这些现在在logging
密钥下:logging: driver: syslog options: syslog-address: "tcp://192.168.0.42:123"
links
使用环境变量:如环境变量引用中所述,由链接创建的环境变量已被弃用一段时间。在新的Docker网络系统中,它们已被删除。您应该直接连接到适当的主机名或使用链接主机名设置相关的环境变量:web:links: - db
environment: - DB_PORT = tcp:// db:5432external_links
:Compose在运行版本2项目时使用Docker网络,因此链接的行为稍有不同。特别是,两个容器必须连接到至少一个共同的网络才能通信,即使明确地链接在一起。将外部容器连接到应用程序的默认网络,或者将外部容器和服务的容器连接到外部网络。net
:这现在被network_mode:net:host - > network_mode:host net:bridge - > network_mode:bridge net:none - >
network_mode:none 替代如果您正在使用net: "container:[service name]"
,您现在必须network_mode: "service:[service name]"
改用它。net:“container:web” - > network_mode:“service:web”如果你正在使用net: "container:[container name/id]"
,这个值不需要改变。net:“container:cont-name” - > network_mode:“container:cont-name”net:“container:abc12345” - >
network_mode:“container:abc12345”volumes
使用命名卷:现在必须在volumes
Compose文件的顶级部分显式声明这些命令。如果某个服务装载了一个已命名的卷data
,则必须data
在顶级volumes
部分中声明一个卷。整个文件可能如下所示:版本:’2’服务:db:image:postgres卷: - data:/ var / lib / postgresql /
data卷:data:默认情况下,Compose创建一个卷,其名称带有前缀与您的项目名称。如果您希望仅调用data
它,请将其声明为external:volumes:data:external:true
安装
Bash
我们可以从 Github 上下载它的二进制包来使用,最新发行的版本地址:https://github.com/docker/compose/releases。
运行以下命令以下载 Docker Compose 的当前稳定版本:
要安装其他版本的 Compose,请替换 1.24.1。
将可执行权限应用于二进制文件:
Docker Desktop or Docker Toolbox
Docker 桌面版和 Docker Toolbox 已经包括 Compose 和其他 Docker 应用程序,因此 Windows 用户不需要单独安装 Compose。
Docker-Compose指令
build
bundle
config
create
down
events
exec
help
images
kill
logs
pause
port
PS
pull
push
restart
rm
run
scale
start
stop
top
unpause
up
build
构建docker-compose服务。服务名默认为project_service
。
bundle
生成分布式应用程序包(DAB)。
config
验证并查看docker-compose.yml
文件。
create
为服务创建容器。
down
停止容器并移除通过up
创建的容器,网络,卷和图像。
默认情况下,唯一删除的内容是:
在撰写文件中定义的服务容器
在撰写文件的部分中定义的网络
networks
默认网络(如果使用的话)
注:由用户自定义的网络和卷不会删除。
events
为项目中的每个容器流化容器事件。
使用该--json
标志,每行将打印一个 json 对象,其格式为:
exec
这相当于docker exec
。使用此子命令,您可以在服务中运行任意命令。命令默认分配一个 TTY ,所以你可以通过此命令获得交互式提示。例如:docker-compose exec web bash
。
images
列出创建的容器使用的图像。
kill
运行容器的强制通过发送SIGKILL
信号来停止。可以选择要传递的信号类型,例如:
logs
显示服务的日志输出。
pause
暂停运行服务的容器。它可以与docker-compose unpause
一起使用。
port
打印端口绑定的公共端口。
ps
列出容器。
pull
拉取在docker-compose.yml
或docker-stack.yml
文件中定义的服务相关联的映像,但不会基于这些映像启动容器。
push
将服务的镜像推送到它们各自的位置registry/repository
。
做出以下假设:
您正在推送您在本地创建的镜像
您可以访问构建密钥
restart
重新启动所有停止并正在运行的服务
如果对docker-compose.yml
配置进行更改,则运行此命令后这些更改将不会反映出来。
例如,对环境变量(在构建容器后但在容器的命令执行之前添加)的更改在重新启动后将不会更新。
rm
删除已停止的服务容器。
默认情况下,附加到容器的匿名卷不会被删除。你可以用这个覆盖它-v
。要列出所有卷,请使用docker volume ls
。
任何不在卷中的数据都将丢失。
运行没有选项的命令也会删除由docker-compose up
或创建的一次性容器docker-compose run
:
run
针对服务运行一次性命令。例如,以下命令启动该web
服务并bash
作为其命令运行。
您使用的命令run
从具有由服务定义的配置的新容器中启动,包括卷,链接和其他详细信息。但是,有两个重要的区别。
首先,通过的命令将run
覆盖服务配置中定义的命令。例如,如果web
服务配置以bash
开头,则将其docker-compose run web python app.py
覆盖python app.py
。
第二个区别是该docker-compose run
命令不会创建服务配置中指定的任何端口。这可以防止端口与已打开的端口发生冲突。如果您确实想要创建服务的端口并将其映射到主机,请指定--service-ports
标签:
或者,可以使用--publish
或-p
选项,就像使用docker run
:
如果启动使用链接配置的服务,则该run
命令首先检查链接服务是否正在运行,并在服务停止时启动该服务。一旦所有链接的服务正在运行,run
执行您通过它的命令。例如,您可以运行:
这将为链接db
容器打开一个交互式 PostgreSQL shell 。
如果您不希望run
命令启动链接容器,请使用--no-deps
标签:
scale
注该命令已弃用。若需使用该命令,请用
--scale
标签代替。
设置为服务运行的容器数量。
数字在表单中被指定为参数service=num
。例如:
提示:或者,在 Compose 文件版本3.x中,您可以将部署密钥下的副本指定为 Swarm 模式的服务配置的一部分。请注意,
deploy
密钥及其子选项(包括replicas
)仅适用于docker stack deploy
命令,不适用于docker compose up
或docker-compose run
。
start
启动服务的现有容器。
stop
停止运行容器而不删除它们。他们可以重新开始docker-compose start
。
top
显示正在运行的进程。
unpause
取消暂停服务的暂停容器。
up
构建,(重新)创建,启动并附加到服务的容器。
除非它们已经在运行,否则该命令还会启动所有相关联的服务。
该docker-compose up
命令汇总每个容器的输出。当命令退出时,所有容器都停止。运行docker-compose up -d
将在后台启动容器并使其运行。
如果存在服务的现有容器,并且在创建容器后服务的配置或映像已更改,则docker-compose up
通过停止并重新创建容器(保留已安装的卷)来提取更改。要防止撰写选取更改,请使用该--no-recreate
标签。
如果您想强制 Compose 停止并重新创建所有容器,请使用该--force-recreate
标签。
如果进程遇到错误,则此命令的退出代码为1
。
如果使用SIGINT
(ctrl
+ C
)中断进程或者SIGTERM
容器停止,并且退出代码为0
。
如果SIGINT
或SIGTERM
在此关闭阶段再次发送,正在运行的容器将被终止,并且退出代码为2
。
环境变量
Compose 支持在.env
放在docker-compose
执行该命令的文件夹(当前工作目录)中的环境文件中声明默认环境变量。
语法规则
这些语法规则适用于.env
档案:
以
VAR=VAL
格式组合期望env
文件。以
#
(即注释)开头的行被忽略。空行被忽略。
没有特殊的引号处理(即它们将成为 VAL 的一部分,你已经被警告;))。
编写文件和 CLI 变量
这里定义的环境变量将用于变量替换在撰写文件中,并且还可以用于定义以下内容 CLI 变量
COMPOSE_API_VERSION
COMPOSE_CONVERT_WINDOWS_PATHS
COMPOSE_FILE
COMPOSE_HTTP_TIMEOUT
COMPOSE_TLS_VERSION
COMPOSE_PROJECT_NAME
DOCKER_CERT_PATH
DOCKER_HOST
DOCKER_TLS_VERIFY
注
运行时环境中存在的值将始终覆盖在
.env
档案。同样,通过命令行参数传递的值也优先。中定义的环境变量。
.env
文件在容器中不自动可见。若要设置适用于容器的环境变量,请遵循本主题中的指导方针。组合中的环境变量,描述如何将 shell 环境变量传递到容器,在复合文件中定义环境变量等等。
环境变量的使用
撰写中有多个部分在某种意义上处理环境变量。这个页面应该可以帮助你找到你需要的信息。
在组合文件中替换环境变量
可以在 shell 中使用环境变量填充复合文件中的值:
有关更多信息,请参见变量替换节中的“撰写文件引用”。
在容器中设置环境变量
可以在服务的容器中设置环境变量。“环境”键,就像docker run -e VARIABLE=VALUE ...
*
将环境变量传递到容器
可以将环境变量直接从shell传递到服务的容器,“环境”键不给他们一个价值,就像docker run -e VARIABLE ...
*
DEBUG
容器中的变量的值将从运行复合的 shell 中相同变量的值中提取。
“env_file“ 配置选项
可以将多个环境变量从外部文件传递到服务的容器,env_file
选项,就像docker run --env-file=FILE ...
*
以 “docker-compose run”设置环境变量
就像docker run -e
,则可以在一次性容器上设置环境变量docker-compose run -e
*。
还可以通过不给变量值从 shell 传递变量:
DEBUG
容器中的变量的值将从运行复合的 shell 中的相同变量的值中提取。
“.env”文件
控件中引用的任何环境变量或用于配置撰写的任何环境变量的默认值。环境文件命名.env
*
当你运行的时候docker-compose up
,web
上面定义的服务使用图像webapp:v1.5
.您可以使用配置命令,它将已解析的应用程序配置打印到终端:
shell 中的值优先于.env
文件中指定的值。如果你TAG
在你的 shell 中设置了一个不同的值,那么这个替换就会image
使用它:
当使用 shell 中 environment
变量和env_file
配置文件提供值时,环境变量的值将首先从环境密钥获取,然后从环境文件获取,然后从 ** -entry **
获取:**Dockerfile**
**ENV**
你可以用它来测试例如 NodeJSCLI 中的容器:
有任何ARG
或ENV
设置在Dockerfile
只有在否码头工人作曲进入environment
或env_file
NodeJS 容器专用材料:如果你有package.json
进入script:start
就像NODE_ENV=test node server.js
,这将推翻你的docker-compose.yml档案中任何文件。
使用环境变量配置组合
有几个环境变量可供您配置 Docker Compose 命令行行为。它们以 CLI 环境变量开头COMPOSE_
或DOCKER_
记录在 CLI 环境变量中。
由链接创建的环境变量
在 v1 撰写文件中使用 ‘links’ 选项时,将为每个链接创建环境变量。它们记录在 Link 环境变量参考中。但请注意,这些变量已被弃用 - 您应该将链接别名用作主机名。
通用服务配置
Compose 支持两种共享通用配置的方法:
扩展整个撰写文件使用多个组合文件
扩展个人服务大
extends
场域
多重合成文件
使用多个组合文件可以使您为不同的环境或不同的工作流自定义组合应用程序。
理解多重组合文件
默认情况下,撰写读取两个文件,docker-compose.yml
还有一个可选的docker-compose.override.yml
档案。根据惯例,docker-compose.yml
包含基本配置。正如其名称所暗示的那样,覆盖文件可以包含对现有服务或全新服务的配置重写。
如果在两个文件中都定义了服务,则使用添加和覆盖配置.
若要使用多个覆盖文件或具有不同名称的重写文件,可以使用-f
选项指定文件列表。按照命令行中指定的顺序编写合并文件。docker-compose
命令引用有关使用-f
使用多个配置文件时,必须确保文件中的所有路径相对于基本组合文件。这是必需的,因为重写文件不一定是有效的组合文件。覆盖文件可以包含小的配置片段。跟踪服务的哪个片段相对于哪个路径比较困难和混乱,因此,为了使路径更容易理解,必须相对于基文件定义所有路径。
用例
在本节中,有两个用于多个组合文件的常用用例:为不同的环境更改一个组合应用程序,以及对一个复合应用程序运行管理任务。
不同环境
多文件的常见用例是为类似生产环境(可能是生产,分段或CI)更改开发撰写应用程序。为了支持这些差异,你可以将你的 Compose 配置分成几个不同的文件:
从一个基本文件开始,它定义了服务的规范配置。
Docker-Compose.yml
在此示例中,开发配置向主机公开了一些端口,将我们的代码作为卷装入,并构建 Web 图像。
docker-compose.override.yml
当你运行的时候docker-compose up
它自动读取重写。
现在,在生产环境中使用 Compose 应用程序将会很好。因此,创建另一个覆盖文件(可能存储在不同的 git 仓库或由不同的团队管理)。
Docker-Compose.prod.yml
要使用此产品组合文件进行部署,可以运行
这将使用docker-compose.yml
和docker-compose.prod.yml
(但不包括开发配置docker-compose.override.yml
)中的配置部署所有三个服务。
有关产品中的 Compose 的更多信息,请参阅产品。
管理任务
另一个常见的用例是针对组合应用程序中的一个或多个服务运行临时或管理任务。此示例演示运行数据库备份。
从 Docker-Compose.yml 开始
在 docker-compose.admin.yml 中添加一个新服务来运行数据库导出或备份。
开始正常的环境运行docker-compose up -d
。要运行数据库备份,也要包含docker-compose.admin.yml
。
扩展服务
注意:
extends
关键字在早期的 Compose 文件格式中支持到 Compose 文件版本2.1(请参阅v1中的扩展和第2版中的扩展),但在 Compose 版本3.x中不受支持。请参阅第3版的添加和删除键摘要以及有关如何升级的信息。请参阅 moby / moby#31101 以关注extends
在未来版本中以某种形式添加支持的可能性。
Docker Compose 的extends
关键字可以在不同文件之间共享通用配置,甚至可以完全共享不同的项目。如果您有多个服务可以重复使用一组通用配置选项,则扩展服务很有用。使用extends
您可以在一个地方定义一套通用的服务选项,并从任何地方引用它。
记住links
,volumes_from
和depends_on
从不使用extends
服务之间共享。这些例外存在以避免隐式依赖性; 你总是本地定义links
和volumes_from
。这可以确保在读取当前文件时,服务之间的依赖关系清晰可见。在本地定义这些也确保对引用文件的更改不会破坏任何内容。
理解扩展配置
中定义任何服务时docker-compose.yml
,您可以声明您正在扩展如下的另一个服务:
此指令将编写为重用webapp
中定义的服务。common-services.yml
档案。假设common-services.yml
看起来是这样的:
在这种情况下,您将得到完全相同的结果,就像您编写docker-compose.yml
用同样的build
,ports
和volumes
直接定义在web
.
您可以进一步在本地定义(或重新定义)配置docker-compose.yml
:
您还可以编写其他服务并链接web
向他们提供服务:
用例
当您有多个具有公共配置的服务时,扩展单个服务非常有用。下面的示例是一个包含两个服务的撰写应用程序:一个 Web 应用程序和一个队列工作程序。这两个服务使用相同的代码库,并共享许多配置选项。
在 common.yml 中我们定义了通用配置:
在 docker-compose.yml 中,我们定义了使用通用配置的具体服务:
添加和覆盖配置
将副本配置从原始服务复制到本地服务。如果在原始服务和本地服务中都定义了配置选项,则本地值取代或扩展原始价值。
对于单值选项image
,command
或者mem_limit
,新值替换旧值。
build
和image
在撰写文件版本1 如属build
和image
,使用时编写文件格式的版本1,如果在原始服务中定义了另一个选项,则使用本地服务中的一个选项将导致组合放弃另一个选项。 例如,如果原始服务定义image: webapp
本地服务定义build: .
则结果服务将具有build: .
而不是image
选择。 这是因为build
和image
不能在版本1文件中一起使用。
对于多值的选项 ports
,expose
,external_links
,dns
,dns_search
,和tmpfs
,撰写会连接两组的值:
在environment
,labels
,volumes
和devices
情况下,撰写“合并”的条目连同本地定义的值取的优先级: