赞
踩
Compose项目是Docker官方的开源项目,负责实现对基于Docker容器的多应用服务的快速编排。Compose定位是“定义和运行多个Docker容器的应用”。
Compose中的几个重要的概念:
yum install docker-compose
查看一下版本号:
docker-compose version
默认的模板文件名称为docker-compose.yml,格式为YAML格式,目前最新的版本为v3。
模版常用命令
6.3.2.1 version: ““命令
#指定版号,现在我们使用的版本号是3
6.3.2.2 services命令
#代表以下的内容是服务
6.3.2.3 build命令
#指定Dockerfile所在文件夹的路径(可以是绝对路径,或者相对docker-compose.yml文件的路径),并创建一个镜像.
实验1:使用build创建一个镜像
Step1 创建一个dockerfile
vim dockerfile
Step2 创建docker-compose.yml
vim docker-compose.yml
version: ‘3’ #指定版本号为3
services: #表示以下内容为定义服务
hello: #定义一个名为hello的服务
build: . #定义dockerfile在当前目录下
注:命令和参数之间需要加空格
然后使用命令拉起
docker-compose up #需在docker-compose.yml文件所在的目录下执行
会创建一个镜像:
红框中中test_hello就是我们刚创建的镜像,其中test是docker-compose.yml所在的目录名,hello是服务名.
同时也会创建一个容器:
也可以指定一些详细的参数:
Context: /root/dockerlab/compose/test #指定dockerfile文件所在的目录,该目录也是发送到Docker守护程序构建镜像的上下文。
dockerfile: dockerfile #指定dockerfile的文件名
args: #定义两个变量
修改下dockerfile
ARG arges1 #定义一个名为ares1的变量(这个变量的值,将会由上面的docker-compose.yml文件中传入
注意红框的内容,说明这两个变量已成功传递.
6.3.2.4 image命令
#指定一个镜像文件
实验1:指定一个名为centos的镜像文件,并创建一个容器
vim docker-compose.yml
Docker-compose up
6.3.2.5 cap_add,cap_drop命令
#添加/删除容器的权限
这里是增加了一个NET_ADMIN的权限
具体容器权限的含义请参考以下文档:
https://docs.docker.com/engine/reference/run/#/runtime-privilege-and-linux-capabilities
6.3.2.6 command命令
#覆盖容器启动后默认执行的命令
红框中的内容意思是:在容器启动的时候执行bash –c “touch /tmp/1 && ls /tmp/这条命令,也就是先在/tmp下创建一个名为1的文件,再用ls看一下/tmp/中的内容
这个文件已经创建好了.
这里证实了command命令已经生效
那么,如果dockerfile里指定了ENTRYPOINT或CMD(需要回顾一下2.1.7.4),最终容器会执行哪个呢?让我们来再做一个实验:
Dockerfile中指定了一个CMD命令,echo dockerfile
模版文件中指定了一个command命令, echo hello docker-compose
我们来观察一下,最终生成的容器,会执行哪一条命令
这里我们看到,只会执行command的命令,而dockerfile中的CMD命令不会被执行。
6.3.2.7 container_name命令
#指定容器名称。默认将会使用“项目名称_服务名称_序号”这样的格式。目前不支持在Swarm模式中使用。
6.3.2.8entrypoint命令
覆盖容器中默认的入口命令。注意,也会取消掉镜像中指定的入口命令和默认启动命令。
这个是我们学过的第4个容器入口命令了。
我们来回顾一下
dockerfile中的两个入口命令的区别,我们在2.1.7.4小节中已经讲过了。
而在6.3.2.6小节中,我们又验证了command命令的优先级比前两个要高。
那么我们再来看下command和entrypoint的优先级哪下更高
在模版文件中这两个命令都指定一下,我们看看,最终容器会执行哪个?
这里看到,最终执行的是entrypoint命令。
3.2.2.9environment命令
设置环境变量
这里制定了两个环境变量,env1和env2,并在开启的时候显示环境变量。
3.2.2.10extends命令
基于其他模板文件进行扩展。
比如我们已经有一了个compose1.xml模版文件,内容如下:
这里注意,v3格式不支持,extends,所以我们改成v2格式。
然后我们在docker-compose.xml里可以调用这个文件里的内容
file: compose1.xml #调用compose1中的内容
service: hello #调用hello这个服务
是可以执行成功的。
3.2.2.11 devices命令
指定设备映射关系,不支持Swarm模式。
这里是把宿主机的/dev/sdc这个设备映射到容器中的/dev/sdc
在容中内,会出现这个sdc的设备。
3.2.2.12 depends_on 命令
#指定多个服务之间的依赖关系。启动时,会先启动被依赖服务。
以上模版文件中,定义了两个服务:hello1,hello2.
并定义了,hello1依赖于hello2.
我们来执行一下看看:
这里发现在启动hello1这个服务之前,会先启动hello2这个服务。
3.2.2.13 external_links命令
#链接到其它容器
创建一个名为centos1的容器,并将此容器的网络指定为test_default(用docker-compose创建的容器,默认在这个网络下)
docker run -it --name centos1 --hostname centos1 --network test_default centos bash
这里链接到centos1这个容器
最后一行容器启动时执行的命令sleep infinity的意思是让当前的shell永久处理睡眠模式,目的是让容器不要退出。
这个docker-compose up后面的-d,是代表让容器在后台运行
这里我们可以ping通被链接的那个容器名,说明链接成功。
这里被链接的容器要求和本容器处于一个网络下。
3.2.2.14 links命令
#链接到其他服务中的容器。
这里定义了两个服务,hello1这个服务link到了hello2
这样在hello1上就可以直接ping通hello2这个服务名了
3.2.2.15extra_hosts命令
指定额外的host名称映射信息。
这里指定一个主机名为:googledns,IP为8.8.8.8
注意:需要将参数用“”引起来。
这里发现是可能ping通这个googledns的主机名的。
其实就是在容器的/etc/hosts文件里增加了“8.8.8.8 googledns”这一行
3.2.2.16 healthcheck命令
#指定检测应用健康状态的机制,包括检测方法(test)、间隔(interval)、超时(timeout)、重试次数(retries)、启动等待时间(start_period)等。
注意红框内,这里要指定几个选项:
test检测方式(有CMD和CMD-SHELL两种)
这里的意思是crul –f http://localhost:8080这条命令。
Interval 检测间隔时间
timeout超时时间
retries 重试次数
start period 启动后等待多长时间开始检测。
因为我们的容器没开8080端口,所以过一会以后,docker的状态就会变成unhealthy.
3.2.2.17 labels命令
#为容器添加Docker元数据(metadata)信息。例如可以为容器添加辅助说明信息。
用docker-compose config这个命令,来看一下服务的详细信息
3.2.2.18 network_mode命令
设置网络模式。
network_mode: "bridge" #设置网络模式为bridge
network_mode: "host" #设置网络模式为host
network_mode: "none" #设置网络模式为none(禁用所有网络)
network_mode: "service:[service name]" #共享其它服务的网络命名空间
network_mode: "container:[container name/id]" #共享其它容器的网络命名空间
hello1服务的网络模式设为host
hello2 服务的网络模式共享hello1的网络命令空间。
3.2.2.19 networks命令
所加入的网络。需要在顶级的networks字段中定义具体的网络信息。
如果我们在模版文件中什么网络参数都不配置的话,在up的时候,会自动创建一个以project_default命名的网络。
我这边用docker-compose创建了三个项目,就会产生三个网络。
且网段都不一样。
我们也可以在模版文件中指定容器的网络。
实验1:指定一个默认的自定义网络
Step 1创建一个网络(详见5.3小节)
docker network create mynet --subnet 192.168.100.0/24 --gateway 192.168.100.1
这里会创建成功一个名为mynet的网络
Step 2修改模版文件
Step 3确认网络配置
将服务up起来以后,观察容器的网络
docker network inspect mynet
可以看到hello1和hello2这两个容器都在mynet这个网络下了。
如果我们自定义的这个网络名不是default,则需要在每个服务里指定一下。
注意红框中的内容,这个效果是一样的。
实验2 利用模块文件来创建自定义网络
这里在模版文件中创建一个自定义网络,并指定其网段是192.168.200.0/24
这里会产生一个名为test_mynet2的网络,系统会自动在我们定义的网络名前加上project名。
docker network inspect mynet
两个容器都在mynet2这个网络下了。
实验3 设置网络别名aliases
红框中的意思是,hello2这个服务使用mynet2这个网络,并定义了一个别名。
这样我们在hello1这个服务中,可以直接使用这个别名来和hello2通讯。
这个功能有点和3.2.2.14小节那个links命令相似。
3.2.2.20 posts命令
#将宿主机的映射到容器
使用宿主:容器(HOST:CONTAINER)格式,或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。
ports:
- "3000" #宿主机随机一个端口映射到容器的3000端口
- "8000:8000" #宿主机的8000端口映射到容器的8000端口
- "49100:22" #宿主机的49100端口映射到容器的22端口
- "127.0.0.1:8001:8001" #宿主机127.0.0.1:8001端口映射到容器的22端口。
也可以像这样写
ports:
- target:80 #目标端口(容器端口)
published:8080 #发布端口(宿主机端口)
protocol:tcp #协议(TCP/UDP)
mode:ingress #模式:进入
这里将宿主机的8080端口映射到了容器的80端口
可以看到已经映射成功
3.2.2.21 secrets命令
配置应用的秘密数据。
可以指定来源秘密、挂载后名称、权限等。
Step1 创建一个文件名为mypassword.txt的文件
echo 123456 > mpassword.txt
Step2 修改docker-compose.yml文件
第二个红框定义了一个名为mypassword的secret,内容来致于./mypassword.txt这个文件。
第一个红框是调用这个定义好的secret
Step 3:启动服务,并查看效果
docker-compose exec hello1 cat /run/secrets/mypassword
在这个服务的容器中,会出现一个生成一个/run/secrets/mypassword的文件,并且这个文件的内容,就是我们在第一步中创建的那个文件的内容。
3.2.2.22 voloumes命令
数据卷所挂载路径设置。可以设置宿主机路径(HOST:CONTAINER)或加上访问模式(HOST:CONTAINER:ro|rw)
红框中的内容是将容器的/tmp映射到宿主机的/tmp上。
使用docker inspect test_hello1_1这个命令可以看到容的挂载情况
3.2.3.23 docker-compose模版文件命令一览表
命令 | 功能 |
build | 指定dockerfile所在文件夹的路径 |
cap_add,cap_drop | 指定容器的内核能力(capacity)分配 |
command | 覆盖容器启动后默认执行的命令 |
cgroup_parent | 指定父cgroup,意味着将继承该组的资源限制。目前不支持swarm模式 |
container_name | 指定容器名称。目前不支持swarm模式 |
depends_on | 指定多个服务之间的依赖关系 |
dns | 自定义DNS服务器 |
dns_search | 配置DNS搜索域 |
dockerfile | 指定额外的编译镜像的dockerfile文件 |
entrypoint | 覆盖容器中默认的入口命令 |
env_file | 从文件中获取环境变量 |
environment | 设置环境变量 |
expose | 暴露端口,但不映射到宿主机,只被连接的服务访问 |
extends | 基于其它模版文件进行扩展 |
external_links | 链接到docker-compose.yml外部的容器 |
extra_hosts | 指定额外的host名称映射信息 |
healthcheck | 指定检测应用健康状态的机制 |
image | 指定为镜像名称或镜像ID |
isolation | 配置容器隔离的机制 |
labels | 为容器添加docker元数据信息 |
links | 链接到其它服务中的容器 |
logging | 跟日志相关的配置 |
network_mode | 设置网络模式 |
networks | 所加入的网络 |
pid | 跟主机系统共享进程命名空间 |
ports | 暴露端口信息 |
secrets | 配置应用的秘密数据 |
security_opt | 指定容器模版标签(label)机制的默认属性(用户、角色、类型、级别等) |
stop_grace_period | 指定应用停止时,容器的优雅停止限期。过期后则通过SIGKILL强制退出。默认值为10s |
stop_signal | 指定停止容器的信号 |
sysctls | 配置容器内的内核参数。目前不支持swarm模式 |
ulimits | 指定容器的ulimits限制值 |
userns_mode | 指定用户命名空间模式。目前不支持swarm模式 |
volumes | 数据卷所挂载路径设置 |
restart | 指定重启策略 |
deploy | 指定部署和运行时的容器相关配置。该命令只在swarm模式下生效,且只支持docker stack deploy命令部署。 |
docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
-f,--file:指定使用的Compose模板文件,默认为docker-compose.yml
-p,--project-name:指定项目名称,默认将使用所在目录名称作为项目名
--verbose:输出更多调试信息
-v,--version:打印版本信息
-H,--host:指定所要操作的docker服务的主机地址
--tls:启用TLS,如果指定-tlsverify则默认开启
--tlscacert :信任的TLS CA的证书
--tlscert:客户端使用的TLS证书
--tlskey:TLS的私钥文件路径
--tlsverify:使用TLS校验连接对方
--skip-hostname-check:不使用TLS证书校验对方的主机名
--project-directory PATH:指定工作目录,默认为Compose文件所在路径
6.3.3.1compose命令一览表
命令 | 功能 |
build | 构建或重新构建项目中的容器 |
bundle | 创建一个可分发的配置包,包括整个服务栈的所有数据,它人可以利用该文件启动服务栈 |
config | 查看compose文件的配置信息 |
down | 停止服务栈,并删除相关资源,包括容器、挂载卷、网络、创建镜像等,默认情况下,只清除容器和网络资源 |
events | 实时监控容器的事件信息 |
exec | 在一个运行的容器中,执行一个指定的命令 |
help | 获得一个命令的帮助 |
images | 列出服务所创建的镜像 |
kill | 通过发送SIGKILL信号来强制停止容器服务 |
logs | 查看容器服务的输出 |
pause | 暂停一个服务容器 |
port | 打印某个容器端口所映射的公共端口 |
ps | 列出项目中的所有容器 |
pull | 拉取服务依赖的镜像 |
push | 推送服务创建的镜像到镜像仓库 |
restart | 重启项目中的服务 |
rm | 删除所有(停止状态)的容器 |
run | 在指定服务上执行一条命令 |
scale | 设置指定服务运行容器的个数 |
start | 启动已存在的服务容器 |
stop | 停止已处于运行状态的服务容器,但不删除它 |
top | 显示服务栈中正在运行的进程信息 |
unpause | 恢复暂停的服务 |
up | 尝试自动完成一系列的操作,包括构建镜像、创建(重建)服务,启动服务,并关联服务的相关容器等 |
version | 打印版本信息 |
6.3.3.2 build命令
构建(重新构建)项目中的服务容器(只会构建或重新构建容器的镜像文件)。
build [options] [--build-arg key=val...] [SERVICE...]
OPTIONS:
--force-rm:强制删除构建过程中的临时容器;
--no-cache:构建镜像过程中不使用,cache(这将加长构建过程);
--pull:始终尝试通过pull来获取更新版本的镜像;
--m,-memory MEM:指定创建服务所使用的内存限制;
--build-arg key=val:指定服务创建时的参数。
docker-compose build
创建了两个服务容器的镜像。
6.3.3.3 config命令
打印服务栈的配置信息
docker-compose config [options]
options:
resolve-image-digests:为镜像添加对应的摘要信息;
-q,--quiet:只检验格式正确与否,不输出内容;
--services:打印出Compose中所有的服务信息;
--volumes:打印出Compose中所有的挂载卷信息;
这里会将服务栈的信息打印出来。
6.3.3.4 up命令
自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。
默认情况,如果服务容器已经存在,docker-compose up将会尝试停止容器,然后重新创建,以保证新启动的服务匹配docker-compose.yml文件的最新内容。
docker-compose up [options] [--scale SERVICE=NUM...] [SERVICE...]
options:
-d:在后台运行服务容器;
--no-color:不使用颜色来区分不同的服务的控制台输出;
--no-deps:不启动服务所链接的容器;
--force-recreate:强制重新创建容器,不能与——no-recreate同时使用;
--no-recreate:如果容器已经存在了,则不重新创建,不能与——force-recreate同时使用;
--no-build:不自动构建缺失的服务镜像;
--abort-on-container-exit:当有容器停止时中止整个服务,与-d选项冲突。
-t,--timeout TIMEOUT:停止容器时候的超时(默认为10秒),与-d选项冲突;
--remove-orphans:删除服务中未定义的孤儿容器;
--exit-code-from SERVICE:退出时返回指定服务容器的退出符;
--scale SERVICE=NUM:扩展指定服务实例到指定数目。
执行up命令启动服务时,它干了三件事:
6.3.3.5 down命令
停止服务栈,并删除相关资源,包括容器、挂载卷、网络、创建镜像等。
默认情况下只清除所创建的容器和网络资源。
docker-compose down [options]
options:
-rmi type:指定删除镜像的类型,包括all(所有镜像),local(仅本地);
-v,--volumes:删除挂载数据卷;
--remove-orphans:清除孤儿容器,即未在Compose服务中定义的容器;
--t,-timeout TIMEOUT:指定超时时间,默认为10s。
我们看到,执行down命令的时候,做了两件事
如果使用:docker-compose down --rmi all,则会把镜像一块删除。
6.3.3.6 events命令
实时监控容器的事件信息
events [options] [SERVICE...]
options:
--json:以Json对象流格式输出事件信息。
6.3.3.7 exec命令
在一个运行中的容器内执行给定命令。
docker-compose exec [options] [-e KEY=VAL...] SERVICE COMMAND [ARGS...]
options:
-d:在后台运行命令;
--privileged:以特权角色运行命令;
-u,-user USER:以给定用户身份运行命令;
-T:不分配TTY伪终端,默认情况下会打开;
--index=index:当服务有多个容器实例时指定容器索引,默认为第一个;
-e,-env KEY=VAL:设置环境变量。
docker-compose exec hello1 ps aux #在hello1这个服务容器中执行ps aux这个命令
6.3.3.8 images命令
列出服务所创建的镜像。
docker-compose images [options] [SERVICE...]
options:
-q:仅显示镜像的ID。
我们这个项目,有两个服务,两个镜像文件。
6.3.3.9 kill命令
通过发送SIGKILL信号来强制停止服务容器。
docker-compose kill [options] [SERVICE...]
options:
-s:指定信号,默认为SIGINT(相当于按ctrl_c)
还有几种常用的信号:
SIGKILL:强制结束
SIGTERM:正常结束
6.3.3.10 logs命令
查看服务容器的输出。
docker-compose logs [options] [SERVICE...]
options:
-no-color:关闭彩色输出;
-f,-follow:持续跟踪输出日志消息;
-t,-timestamps:显示时间戳信息;
-tail="all":仅显示指定行数的最新日志消息。
6.3.3.11 pause命令和unpause命令
暂停一个服务容器和恢复暂停。
pause [SERVICE...] / unpause [SERVICE]
以上是先肜pause命令暂停hello1这个服务,然后再用unpause这个命令来恢复
6.3.3.12 port命令
打印某个容器端口所映射的公共端口。
port [options] SERVICE PRIVATE_PORT
options:
--protocol=proto:指定端口协议,tcp(默认值)或者udp;
--index=index:如果同一服务存在多个容器,指定命令对象容器的序号(默认为1)。
这里我们可以看到,服务容器的80端口,是映射到宿主机8080端口。
6.3.3.13 ps命令
列出项目中目前的所有容器。
docker-compose ps [options] [SERVICE...]
options:
-q:只打印容器的ID信息。
6.3.3.14 pull命令
为compose文件中定义的服务拉取镜像,但不启动容器。
docker-compose pull [options] [SERVICE...]
options:
--ignore-push-failures:忽略推送镜像过程中的错误;
--parallel:拉取相似的多个镜像;
--quiet:安静模式,拉取的时候不打印进度信息
红框中的内容是指我这个hello1服务,需要从centos:latest这个镜像来创建。
如果我主机本地没有这个镜像的话,使用pull命令,可以从镜像仓中自动拉取这个镜像。
把我本地的centos这个镜像先删掉。
执行docker-compose pull hello1后,发现自动从镜像仓中拉取了centos这个镜像了。
6.3.3.15 push命令
把服务创建的镜像推送到镜像仓。
push [options] [SERVICE...]
options:
--ignore-push-failures:忽略推送镜像过程中的错误;
docker-compose push hello1 #将hello1这个服务创建的镜像推送到镜像仓。
6.3.3.16 restart命令
重启服务;
restart [options] [SERVICE...]
options:
-t, --timeout:指定重启前服务停止超时的时间,单位为秒。
6.3.3.17 rm命令
删除容器服务。
rm [options] [SERVICE...]
options:
-f, --force:强制删除,包括处于运行状态的容器;
-s, --stop:在删除之前停止容器;
-v:同时删除数据卷;
6.3.3.18 run命令
在一个服务上执行一个one-off命令。
docker-compose run [options] [-v VOLUME...] [-p PORT...] [-e KEY=VAL...] [-l KEY=VALUE...] SERVICE [COMMAND] [ARGS...]
options:
-d:在后台运行
--name:指定容器的名称
--entrypoint:覆盖镜像中指定的入口命令;
-e KEY=VAL:设置一个环境变量,可多次使用;
-l,--label:增加或覆盖一个标签;
-u,--user:指定用户名或UID来运行容器;
--no-deps:不启动相关联的服务;
--rm:运行以后删除容器,后台运行模式下将被忽略;
-p,--publish:映射容器到端口到宿主机;
--service-ports:配置服务端口并映射到宿主机;
-v,--volume:挂载一个数据卷;
-T:不分配伪TTL;
-w,--workdir:指定容器内的工作目录。
docker-compose run -d hello1 ping baidu.com
在hello1这个服务上执行”ping baidu.com”这个命令。
它会自动创建一个名为test_hello1_run_1的容器,并执行ping baidu.com命令。
6.3.3.19 start命令
启动已在存在的服务容器。
docker-compose start [SERVICE...]
6.3.3.20 stop命令
停止处于运行状态的服务容器,但是不删除它;
docker-compose stop [options] [SERVICE...]
options:
-t,--timeout:指定一个容器停止超时,默认为10S。
6.3.3.21 top命令
显示服务栈中的进程信息。
docker-compose top [SERVICE...]
6.3.3.22 version命令
打印docker-compose版本信息
docker-compose version [--short]
--short:只显示compose版本号
环境变量可以用来配置compose的行为,详见下表:
变量 | 功能 |
COMPOSE_PROJECT_NAME | 设置项目名称,默认是当前的工作目录(docker-compose.yml文件所在的目录)的名字。 |
COMPOSE_FILE | 设置要使用的docker-compose.yml的路径。如果不指定,默认会先查找当前工作目录下是否存在docker-compose.yml文件,如果找不到,则会继续查找上层目录。 |
COMPOSE_API_VERSION | 某些情况下,compose发出的docker请求,其版本可能在服务端并不支持,可以通过指定API版本来临时解决这个问题。 |
DOCKER_HOST | 设置dockere服务端的监听地址。默认使用unix:///var/run/docker.sock |
DOCKER_TLS_VERIFY | 如果该环境变量不为空,则与docker服务端的所有交互都通过TLS协议进行加密。 |
DOCKER_CERT_PATH | 配置TLS通信所需要的验证文件(包括ca.pem、cert.pem和key.pem)的路径,默认是~/.docker |
COMPOSE_HTTP_TIMEOUT | compose向docker服务端发送请求时的超时,默认值为60s |
COMPOSE_TLS_VERSION | 指定与docker服务进行交互的TLS版本,支持版本为TLSV1(默认值)、TLSV1_1、TLSV1_2 |
COMPOSE_PATH_SEPARATOR | 指定COMPOSE_FILE环境变量中的路径间隔符 |
COMPOSE_IGNORE_ORPHANS | 是否忽略孤儿容器 |
COMPOSE_PARALLEL_LIMIT | 设置compose可以执行进程的并发数 |
COMPOSE_INTERACTIVE_NO_CLI | 尝试不使用docker命令来执行run和exec指令 |
使用这些环境参数,需要在工作目录下创建一个名为.env的文件(注意:必须是这个文件名)
这里将COMPOSE_PROJECT_NAME这个环境变量的值,设为myfirstproject
可以看到,项目名称已经变成myfirstproject了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。