Docker入门与实战——Docker Compose(多容器应用管理) Docker Compose多容器应用管理1、安装与卸载1.1、pip安装1.2、二进制包1.3、卸载2、Compose模板文件2.1、build2.2、cap_add,cap_drop2.3、cgroup_parent2.4、command2.5、configs2.6、container_name2.7、credential_spec2.8、depends_on2.9、deploy2.10、devices2.11、dns2.12、dns_search2.13、entrypoint2.14、env_file2.15、environment2.16、expose2.17、extends2.18、external_links2.19、extra_hosts2.20、healthcheck2.21、image2.22、init2.23、isolation2.24、labels2.25、25.links2.26、logging2.27、network_mode2.28、networks2.29、pid2.30、ports2.31、profile2.32、restart2.33、secrets2.34、security_opt2.35、stop_grace_period2.36、stop_signal2.37、sysctls2.38、tmpfs2.39、ulimits2.40、userns_mode2.41、volumes2.42、其他指令2.43、读取环境变量2.44、扩展特性3、Compose命令说明3.1、命令对象与格式3.2、命令选项3.3、命令使用说明3.3.1、build3.3.2、config3.3.3、down3.3.4、events3.3.5、exec3.3.6、help3.3.7、images3.3.8、kill3.3.9、logs3.3.10、pause3.3.11、port3.3.12、ps3.3.13、pull3.3.14、push3.3.15、restart3.3.16、rm3.3.17、run3.3.18、scale3.3.19、start3.3.20、stop3.3.21、top3.3.22、unpause3.3.23、up3.3.24、version4、Compose环境变量4.1、Compose中定义的环境变量4.2、在Compose文件中使用环境变量4.3、Compose应用案例一Web负载均衡4.3.1、web子目录4.3.2、haproxy目录4.3.3、docker-compose.yml4.3.4、运行compose项目4.4、Compose应用案例二大数据Spark集群4.4.1、准备工作4.4.2、启动集群4.4.3、执行应用在微服务架构下一个服务通常由多个应用程序组成因此对多应用程序的管理成了一个普遍需求。在Docker应用场景中用户需要灵活地对各种容器资源进行定义和管理。Compose是Docker官方的多应用程序管理工具其重要性不言而喻。使用Compose用户简单编写一个模板文件就可以轻松管理由多个应用程序组成的容器集群。本章将深入介绍Compose项目包括如何安装、卸载Compose如何编写模板文件以及如何使用命令和环境变量并结合具体案例展示如何使用Compose来管理多个应用容器。Compose项目是Docker官方的开源项目旨在创建和管理基于Docker容器的多应用服务定位为“定义和运行多个Docker容器的应用”​其前身是开源项目Fig。从功能上看它类似于OpenStack中的Heat。Compose的源代码目前托管在docker/compose上这是一个由社区支持的项目。本书第一部分已经介绍了使用Dockerfile可以很方便地定义单独的应用容器但在实际工作中经常需要多个容器协同工作来完成某项任务。例如要实现一个Web项目需要用到Web服务容器、数据库服务容器甚至还要用到前端的负载均衡容器等。Compose恰好能够满足这种需求。用户可以使用一个单独的docker-compose.yml模板文件YAML格式来定义一组相关联的应用容器形成一个服务栈。Compose中有几个重要的概念任务(Task)一个容器被称为一个任务。任务拥有独一无二的ID在同一个服务中的多个任务序号依次递增。服务(Service)某个相同应用镜像的容器副本集合一个服务可以横向扩展为多个容器实例。服务栈(Stack)由多个服务组成相互配合完成特定业务如Web应用服务、数据库服务共同构成Web服务栈。通常一个docker-compose.yml模板文件定义了一个服务栈。Compose的默认管理对象是服务栈通过子命令对栈中的多个服务进行便捷的生命周期管理。Compose项目通过调用Docker服务提供的API来管理容器。因此只要所操作的平台支持Docker API就可以在其上利用Compose进行编排管理。1、安装与卸载Compose是由Python编写的项目因此在使用之前需要在系统中安装Python环境。此外为了使Compose正常运行系统还需要安装Docker引擎。关于Docker引擎的安装方法请参考本书之前的章节。对于Linux环境大部分系统的自带软件仓库中都包含了Compose。对于MacOS或Windows系统DockerDesktop中已经包含了Compose通常用户直接安装Compose即可无须进行额外操作。如果要单独安装Compose可以选择使用Python的pip工具进行安装也可以直接下载已经编译好的二进制安装包。前者会安装相关依赖包适合本地环境下的安装使用后者则对系统环境的影响较小更适合在云计算场景中使用。1.1、pip安装这种方式是将Compose当作一个Python应用从PyPI源中安装。执行安装命令安装成功后可以查看docker-compose命令的基本用法1.2、二进制包官方定义、编译好的二进制包可以在https://github.com/docker/compose/releases页面找到。下载这些二进制文件后直接将其放到执行路径下并添加执行权限即可。例如通过如下命令下载指定版本${VERSION}的Compose文件并添加可执行权限可以使用docker-compose version命令来查看版本信息以测试是否安装成功1.3、卸载如果是通过二进制包方式安装的那么删除二进制文件即可命令如下如果是通过Python的pip工具安装的则可以执行如下命令删除2、Compose模板文件模板文件是使用Compose的核心涉及的指令关键字也比较多。但读者无须过于担心大部分指令与docker [container] create | run相关参数的含义类似。默认模板文件的名称为docker-compose.yml格式为YAML目前最新的版本为V3。Compose已经不支持最早的V1版本的模板文件。它的文件结构十分简单每个顶级元素为服务名称次级元素为服务容器的配置信息例如后来的V2和V3版本扩展了Compose的语法同时尽量保持与旧版本兼容除了可以声明网络、存储、配置和秘密信息外添加了版本信息需要将所有服务放到services根下面。目前基于V2和V3的语法Compose还推出了新的模板规范。新的规范中支持使用name来命名整个项目每个项目中可以包括多个服务。例如将上面V1版本的示例改写为新的规范并启用资源限制内容如下注意每个服务都必须通过image指令指定镜像或build指令需要Dockerfile等来自动构建生成镜像。如果使用build指令在Dockerfile中设置的选项例如CMD、EXPOSE、VOLUME、ENV等将会自动被获取无须在docker-compose.yml中再次设置。下面以目前最流行的V3版本为例分别介绍模板文件中各个服务配置指令的用法。2.1、buildbuild指令用于指定Dockerfile所在文件夹的路径可以是绝对路径或者相对docker-compose.yml文件的路径​。Compose将会利用它自动构建应用镜像然后使用这个镜像。例如build指令还可以指定创建镜像的上下文、Dockerfile路径、标签、shm大小、参数、缓存来源和目标等。例如2.2、cap_add,cap_dropcap_add和cap_drop指令用于指定容器的内核能力(capacity)分配在Swarm模式下会被忽略。例如让容器拥有所有能力可以指定为去掉NET_ADMIN能力可以指定为2.3、cgroup_parentcgroup_parent指令用于指定父cgroup组意味着将继承该组的资源限制目前不支持在Swarm模式中使用。例如创建一个cgroup组名称为cgroups_12.4、commandcommand是覆盖容器启动后默认执行的命令可以为字符串格式或JSON数组格式。例如或者2.5、configs在Docker Swarm模式下可以通过configs指令来管理和访问非敏感的配置信息支持从文件读取或外部读取。例如2.6、container_namecontainer_name指令用于指定容器名称。默认将会使用“项目名称_服务名称_序号”这样的格式。目前不支持在Swarm模式中使用。例如需要注意指定容器名称后该服务将无法进行扩展因为Docker不允许多个容器实例重名。2.7、credential_speccredential_spec指令用于配置托管服务账户的凭据规范仅用于使用Windows容器的服务。credential_spec必须以file://file-name或registry://value-name格式提供。在使用file:时引用文件必须存在于Docker数据目录中的CredentialSpecs子目录中。例如使用registry:时从主机上的Windows注册表项HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization\Containers\CredentialSpecs中读取引用文件。2.8、depends_ondepends_on指令用于指定多个服务之间的依赖关系。启动时会先启动被依赖服务。例如可以指定依赖于db服务2.9、deploydeploy指令用于指定部署和运行时的容器相关配置。该指令只在Swarm模式下生效且只支持docker stackdeploy命令部署。例如deploy命令中包括endpoint_mode、labels、mode、placement、replicas、resources、restart_policy、update_config等配置项。(1)endpoint_modeendpoint_mode指定服务端点模式包括两种类型vipSwarm分配一个前端的虚拟地址客户端通过给定地址访问服务无须关心后端的应用容器个数。dnsrrSwarm分配一个域名给服务用户访问域名时会按照轮流顺序返回容器地址。例如(2)labelslabels指定服务的标签。注意标签信息不会影响到服务内的容器。例如(3)modemode定义容器副本模式可以为global每个Swarm节点上只有一个该应用容器。replicated整个集群中存在指定份数的应用容器副本为默认值。例如指定集群中Web应用保持3个副本(4)placementplacement定义容器放置的限制(constraint)和配置(preference)限制可以指定只有符合要求的节点才能运行该应用容器配置可以指定容器的分配策略。例如指定集群中Web应用容器只存在于高安全的节点上并且在带有zone标签的节点上均匀分配(5)replicas当容器副本模式为默认的replicated时replicas用于指定副本的个数。(6)resourcesresources用于指定使用资源的限制包括CPU、内存资源等。例如指定应用使用的CPU份额为10%25%内存为200500MB(7)restart_policyrestart_policy用于指定容器重启的策略。例如指定重启策略为失败时重启等待2s重启最多尝试3次检测状态的等待时间为10s(8)update_config有些情况下需要对容器内容进行更新可以使用update_config设置升级参数包括每次升级多少个容器(parallelism)、升级的延迟(delay)、升级失败后的行动(failure_action)、检测升级后状态的等待时间(monitor)、升级后容忍的最大失败比例(max_failure_ratio)、升级顺序(order)等。例如指定每次更新两个容器更新等待时间为10s先停止旧容器再升级2.10、devicesdevices用于指定设备映射关系不支持Swarm模式。例如2.11、dnsdns用于自定义DNS服务器。可以是一个值也可以是一个列表例如2.12、dns_searchdns_search用于配置DNS搜索域可以是一个值也可以是一个列表2.13、entrypointentrypoint用于覆盖容器中默认的入口命令。注意这样也会取消镜像中指定的入口命令和默认启动命令。例如覆盖为新的入口命令2.14、env_fileenv_file用于从文件中获取环境变量可以为单独的文件路径或列表。如果通过docker-compose-f FILE方式来指定Compose模板文件则env_file中变量的路径会基于模板文件路径。如果变量名称与environment指令冲突则按照惯例以后者为准环境变量文件中每一行必须符合格式支持以#开头的注释行2.15、environmentenvironment用于设置环境变量可以使用数组或字典两种格式。只给定名称的变量会自动获取运行于Compose主机上对应变量的值可以用来防止泄露不必要的数据。例如或者注意如果变量名称或者值中用到true|false、yes|no等表达布尔含义的词汇最好放到引号里避免YAML自动解析某些内容为对应的布尔语义。网址http://yaml.org/type/bool.html中给出了这些特定词汇包括2.16、exposeexpose用于暴露端口但不映射到宿主机只被连接的服务访问仅可以指定内部端口为参数2.17、extendsextends用于基于其他模板文件进行扩展仅支持V2版本。例如已经有了一个webapp服务定义一个基础模板文件为common.yml再编写一个新的development.yml文件使用common.yml中的webapp服务进行扩展后者会自动继承common.yml中的webapp服务及环境变量定义。使用extends时需要注意 - 要避免出现循环依赖例如A依赖BB依赖CC反过来依赖A的情况。 - extends不会继承links和volumes_from中定义的容器和数据卷资源。 一般地推荐在基础模板中只定义一些可以共享的镜像和环境变量在扩展模板中具体指定应用变量、链接、数据卷等信息。2.18、external_linksexternal_links用于链接到docker-compose.yml外部的容器甚至并非Compose管理的外部容器。参数格式与links类似2.19、extra_hostsextra_hosts类似Docker中的–add-host参数指定额外的host名称映射信息。例如上述指令会在启动后的服务容器中的/etc/hosts文件中添加如下两条条目2.20、healthcheckhealthcheck用于指定检测应用健康状态的机制包括检测方法(test)、间隔(interval)、超时(timeout)、重试次数(retries)、启动等待时间(start_period)等。例如指定检测方法为访问8080端口间隔为30s超时为15s重试3次启动后等待30s再做检查2.21、imageimage用于指定镜像名称或镜像ID。如果镜像在本地不存在Compose将会尝试拉取这个镜像。例如2.22、initinit用于在容器内运行一个init进程以转发信号和回收进程。例如2.23、isolationisolation用于配置容器隔离的机制包括default、process和hyperv。2.24、labelslabels用于为容器添加Docker元数据(metadata)信息。例如可以为容器添加辅助说明信息2.25、25.linkslinks用于链接到其他服务中的容器。使用“服务名称”​同时作为别名或“服务名称服务别名”(SERVICE:ALIAS)格式均可使用的别名将会自动在服务容器中的/etc/hosts里创建。例如被链接容器中相应的环境变量也将被创建。注意links命令属于旧的用法可能在后续版本中被移除。2.26、logginglogging用于进行与日志相关的配置包括一系列子配置(1)logging.driver类似Docker中的–log-driver参数logging.driver用于指定日志驱动类型。目前支持三种日志驱动类型(2)logging.optionslogging.options为日志驱动的相关参数。例如或2.27、network_modenetwork_mode用于设置网络模式使用与docker client的–net参数一样的值2.28、networksnetworks表示所加入的网络。需要在顶级的networks字段中定义具体的网络信息。例如指定Web服务的网络为web_net并添加服务在网络中的别名为web_app2.29、pidpid用于设置与主机系统共享进程命名空间。打开该选项的容器之间以及容器和宿主机系统之间可以通过进程ID来相互访问和操作2.30、portsports用于暴露端口信息。可以使用“宿主容器”(HOST:CONTAINER)格式或者仅仅指定容器的端口宿主将会随机选择端口​注意当使用HOST:CONTAINER格式来映射端口时如果使用的容器端口小于60并且没放到引号里可能会得到错误结果因为YAML会自动解析xx:yy这种数字格式为六十进制。为避免出现这种问题建议对数字串都采用引号包括起来的字符串格式。2.31、profileprofile可用于筛选出一组服务从Docker Compose1.28.0开始支持。它允许开发者在docker-compose.yml文件中为每个服务定义一个或多个profile从而实现在不同的环境或情况下启动不同的服务集合。定义服务的profile之后用户可以使用–profile选项来指定要应用哪些profile。例如下面的模板文件中定义了多个服务frontend服务属于prod profilephpmyadmin服务属于test profilebackend和db服务不属于任何profile意味着始终启动可以通过以下命令来启动带有test profile和不带任何profile的服务同样地用户也可以使用–profile选项来指定在执行docker-compose down命令时要停止哪些profile中的服务。2.32、restartrestart用于指定重启策略可以为no不重启​、always总是​、on-failure失败时​、unless-stopped除非停止​。注意在Swarm模式下要使用restart_policy。在生产环境中推荐配置为always或者unless-stopped。例如2.33、secretssecrets用于配置应用的秘密数据可以指定秘密来源、挂载后名称、权限等。例如2.34、security_optsecurity_opt用于指定容器模板标签(label)机制的默认属性用户、角色、类型、级别等​。例如配置标签的用户名和角色名2.35、stop_grace_periodstop_grace_period用于指定应用停止时容器的优雅停止期限。过期后则通过SIGKILL强制退出默认值为10s。2.36、stop_signalstop_signal用于指定停止容器的信号默认值为SIGTERM。2.37、sysctlssysctls用于配置容器内的内核参数Swarm模式中不支持。例如指定连接数为4096和开启TCP的syncookies2.38、tmpfstmpfs用于挂载若干临时文件系统到容器内。例如2.39、ulimitsulimits用于指定容器的ulimits限制值。例如指定最大进程数为65535指定文件句柄数为20000软限制应用时可以随时修改不能超过硬限制和40000系统硬限制只有root用户才可以提高该值​2.40、userns_modeuserns_mode用于指定用户命名空间模式Swarm模式中不支持。例如使用主机上的用户命名空间2.41、volumesvolumes用于设置数据卷所挂载的路径可以设置宿主机路径(HOST:CONTAINER)或加上访问模式(HOST:CONTAINER:ro)。volumes支持driver、driver_opts、external、labels、name等子配置。该指令中的路径支持相对路径。例如或者可以使用更详细的语法格式2.42、其他指令此外还有domainname、hostname、ipc、mac_address、privileged、read_only、shm_size、stdin_open、tty、user、working_dir等指令指令功能基本与docker-run中对应参数的功能一致。例如指定容器中的工作目录或者在指定容器中搜索域名、主机名、mac地址等使用以下指令允许在容器中运行一些特权命令2.43、读取环境变量从1.5.0版本开始Compose模板文件支持动态读取主机的系统环境变量。例如下面的Compose文件将从运行它的环境中读取变量${MONGO_VERSION}的值不指定时则采用默认值3.2​并写入执行的指令中如果直接执行docker-compose up则会启动一个mongo:6.2镜像的容器如果执行MONGO_VERSION6.0 docker-compose up则会启动一个mongo:6.0镜像的容器。2.44、扩展特性从3.4版本开始Compose还支持用户自定义的扩展字段。利用YAML语法里的锚点引用功能来引用自定义字段内容。例如3、Compose命令说明3.1、命令对象与格式对于Compose来说大部分命令的对象既可以是项目本身也可以指定为项目中的服务或者容器。如果没有特别说明命令对象将是项目这意味着项目中所有服务都会受到命令影响。执行docker-compose [COMMAND] --help或者docker-compose help[COMMAND]可以查看具体某个命令的使用格式。Compose命令的基本的使用格式如下3.2、命令选项-f,--file FILE指定使用的Compose模板文件默认为docker-compose.yml可以多次指定。-p,--project-name NAME指定项目名称默认将使用所在目录名称作为项目名。--profile NAME指定启用的配置。-c,--context NAME指定启用的上下文的名称。--verbose输出更多调试信息。--log-level LEVEL设置日志级别(DEBUG、INFO、WARNING、ERROR、CRITICAL)。--ansi(never|always|auto)控制何时打印ANSI控制字符。-v,--version打印版本并退出。-H,--host HOST指定所操作的Docker服务地址。--tls启用TLS如果指定为-tlsverify则默认开启。--tlscacert CA_PATH信任的TLS CA的证书。--tlscert CLIENT_CERT_PATH客户端使用的TLS证书。--tlskey TLS_KEY_PATHTLS的私钥文件路径。--tlsverify使用TLS校验连接对方。--skip-hostname-check不使用TLS证书校验对方的主机名。--project-directory PATH指定工作目录默认为Compose文件所在路径-env-file PATH指定额外的环境变量文件。3.3、命令使用说明3.3.1、build命令格式为docker-composebuild [options]​[SERVICE...]​。该命令用于构建重新构建项目中的服务容器。服务容器一旦构建将会带上一个标记名例如对于Web项目中 的一个db容器可能是web_db。可以随时在项目目录下运行docker-compose build命令来重新构建服务。选项包括--build-arg keyval设置构建时的变量。--compress使用gzip压缩构建的上下文。-m,--memory MEM设置构建容器的内存上限。--no-cache构建镜像过程中不使用Cache这将加长构建过程​。--no-rm不删除构建过程中的临时容器。--pull始终尝试通过pull来获取更新版本的镜像。--parallel并行构建镜像。--progress string设置进度输出类型(auto、plain、tty)。-q,--quiet不输出到标准输出。3.3.2、config命令格式为docker-compose config [options]​用于校验和查看Compose文件的配置信息。支持的选项包括-resolve-image-digests为镜像添加对应的摘要信息。-no-interpolate不修改环境变量。-q,-quiet只检验格式正确与否不输出内容。-profiles输出使用的配置名称。-services输出Compose中所有的服务信息。-volumes输出Compose中所有的挂载卷信息。-hash输出服务配置的hash值。3.3.3、down命令格式为docker-compose down [options]​用于停止服务栈并删除相关资源包括容器、挂载卷、网络、创建镜像等。默认情况下只清除所创建的容器和网络资源。支持的选项包括-rmi type指定删除镜像的类型包括all所有镜像​local仅本地​。-v,-volumes删除挂载数据卷。-remove-orphans清除孤儿容器即未在Compose服务中定义的容器。-t,-timeout TIMEOUT指定超时时间默认为10s。3.3.4、events命令格式为docker-composeevents [options]​[SERVICE...]​用于实时监控容器的事件信息。支持的选项为-json表示以Json对象流格式输出事件信息。3.3.5、exec命令格式为docker-compose exec [options]​[-eKEYVAL...] SERVICE COMMAND [ARGS...]​用于在一个运行中的容器内执行给定命令。支持的选项包括-d在后台运行命令。-privileged以特权角色运行命令。-u,-user USER以给定用户身份运行命令。-T不分配TTY伪终端默认情况下会打开。-indexindex当服务有多个容器实例时指定容器索引默认为第一个。-e,-env KEYVAL设置环境变量。-w,-workdir指定执行命令时的工作目录。3.3.6、help获得一个命令的帮助。3.3.7、images命令格式为docker-compose images[options]​[SERVICE...]​用于列出服务所创建的镜像。支持的选项为-q表示仅显示镜像的ID。3.3.8、kill命令格式为docker-compose kill [options]​[SERVICE...]​该命令通过发送SIGKILL信号来强制停止服务容器支持通过-s参数指定发送的信号例如通过如下指令发送SIGINT信号。$docker-composekill-s SIGINT3.3.9、logs命令格式为docker-compose logs [options]​[SERVICE...]​用于查看服务容器的输出。默认情况下docker-compose将对不同的服务输出使用不同的颜色来区分。可以通过–no-color来关闭颜色。该命令在调试问题时十分有用。支持的选项为-no-color关闭彩色输出。-f,-follow持续跟踪输出日志消息。-t,-timestamps显示时间戳信息。-tailall仅显示指定行数的最新日志消息。-no-log-prefix日志输出不打印前缀。3.3.10、pause命令格式为docker-compose pause [SERVICE...]​用于暂停一个服务容器。3.3.11、port命令格式为docker-compose port [options] SERVICE PRIVATE_PORT用于打印某个容器端口所映射的公共端口。支持的选项为--protocolproto指定端口协议如TCP默认值或者UDP。--indexindex如果同一服务存在多个容器指定命令对象容器的序号默认为1​。3.3.12、ps命令格式为docker-compose ps [options]​[SERVICE...]​用于列出项目中目前的所有容器。支持的选项为-q只打印容器的ID信息。-services显示服务。-filter KEYVAL过滤显示的服务。-a,-all输出包括处于停止状态的容器。3.3.13、pull命令格式为docker-compose pull [options]​[SERVICE...]​用于拉取服务依赖的镜像。支持的选项为--ignore-pull-failures忽略拉取镜像过程中的错误。--no-parallel禁用并行拉取。-q,--quiet拉取时不打印进度信息。--include-deps拉取作为依赖项声明的服务。3.3.14、push命令格式为docker-compose push [options]​[SERVICE...]​用于推送服务创建的镜像到镜像仓库。支持的选项为–ignore-push-failures表示忽略推送镜像过程中的错误。3.3.15、restart命令格式为docker-compose restart [options]​[SERVICE...]​用于重启项目中的服务。支持的选项为-t,–timeout TIMEOUT用于指定重启前停止容器的超时默认为10s​。3.3.16、rm命令格式为docker-compose rm [options]​[SERVICE...]​用于删除所有停止状态的服务容器。推荐先执行docker-compose stop命令来停止容器。支持的选项为-f,--force强制直接删除包括非停止状态的容器。一 般尽量不要使用该选项。-s,--stop删除之前先停止容器。-v删除容器所挂载的数据卷。3.3.17、run命令格式为docker-compose run[options]​[-p PORT...]​[-e KEYVAL...]SERVICE[COMMAND]​[ARGS...]​用于在指定服务上执行一个命令例如这将会启动一个ubuntu服务容器并执行pingdocker.com命令。默认情况下如果存在关联则所有关联的服务将会自动被启动除非这些服务已经在运行中。该命令类似启动容 器后运行指定的命令相关卷、链接等都将会按照配置自动创建。二者有两个不同点给定命令将会覆盖原有的自动运行命令。不会自动创建端口以避免冲突。如果不希望自动启动关联的容器可以使用–no-deps选项例如将不会启动Web容器所关联的其他容器。支持的选项为-d后台运行容器。--name NAME为容器指定一个名字。--entrypoint CMD覆盖默认的容器启动指令。-e KEYVAL设置环境变量值可多次使用选项来设置多个环境变量。-l,--label KEYVAL指定标签。-u,--user指定运行容器的用户名或者uid。--no-deps不自动启动关联的服务容器。--rm运行命令后自动删除容器d模式下将忽略。-p,--publish[​]​映射容器端口到本地主机。--service-ports配置服务端口并映射到本地主机。--use-aliases使用服务的网络别名。-v,--volume[​]​绑定挂载卷。-T不分配伪tty意味着依赖tty的指令将无法运行。3.3.18、scale命令格式为docker-compose scale[options]​[SERVICENUM...]​用于设置指定服务运行的容器个数。可以通过servicenum的参数来设置数量。例如这将启动3个容器运行web服务2个容器运行db服务。一般地当指定数目多于该服务当前实际运行的容器数目时将新创建并启动容器反之将停止容器。支持的选项为-t,–timeout TIMEOUT表示停止容器时的超时默认为10s​。3.3.19、start命令格式为docker-compose start [SERVICE...]​用于启动已经存在的服务容器。3.3.20、stop命令格式为docker-compose stop [options]​[SERVICE...]​用于停止已经处于运行状态的容器但不删除它。通过docker-compose start可以再次启动这些容器。支持的选项为-t,–timeout TIMEOUT表示停止容器时的超时默认为10s​。3.3.21、top命令格式为docker-compose top [SERVICE...]​用于显示 服务栈中正在运行的进程信息。3.3.22、unpause命令格式为docker-compose unpause[SERVICE...]​用于恢复处于暂停状态中的服务。3.3.23、up命令格式为docker-compose up[options]​[SERVICE...]​。该命令十分强大它将尝试自动完成包括构建镜像、​重新创建服务、启动服务并关联服务相关容器的一系列操作。链接的服务都将会被自动启动除非已经处于运行状态。可以说大部分情况下都可以直接通过该命令来启动一个项目。默认情况下docker-compose up启动的容器都在前台控制台将会同时打印所有容器的输出信息可以很方便地进行调试。当通过Ctrl-C停止命令时所有容器将会停止。如果使用docker-compose up -d将会在后台启动并运行所有容器。一般推荐在生产环境下使用该选项。默认情况下如果服务容器已经存在docker-composeup将会尝试停止容器然后重新创建保持使用volumes-from挂载的卷​以保证新启动的服务匹配docker-compose.yml文件的最新内容。如果用户不希望容器被停止并重新创建可以使用docker-compose up–no-recreate。这样将只会启动处于停止状态的容器而忽略已经运行的服务。如果用户只想重新部署某个服务可以使用docker-compose up--no-deps-d SERVICE_NAME来重新创建服务并在后台停止旧服务启动新服务并不会影响到其所依赖的服务。支持的选项为-d在后台运行服务容器。-no-color不使用颜色来区分不同的服务的控制台输出。-quiet-pull拉取镜像时不显示进度信息。-no-deps不启动服务所链接的容器。-force-recreate强制重新创建容器不能与–no-recreate同时使用。-no-recreate如果容器已经存在了则不重新创建不能与–force-recreate同时使用。-no-build不自动构建缺失的服务镜像。-no-start创建服务后不启动它们。-build在启动容器之前构建镜像。-abort-on-container-exit当有容器停止时中止整个服务与-d选项冲突。-attach-dependencies附加到依赖的容器。t,--timeout TIMEOUT停止容器时的超时默认为10s​与-d选项冲突。V,--renew-anon-volumes重新创建匿名卷而不是从先前的容器中获取数据。-remove-orphans删除服务中未定义的孤儿容器。-exit-code-from SERVICE退出时返回指定服务容器的退出符。-scale SERVICENUM扩展指定服务实例到指定数目。-no-log-prefix在日志中不打印前缀。3.3.24、version命令格式为docker-compose version用于输出版本信息。4、Compose环境变量除了命令行参数和环境变量文件外还可以使用环境变量来配置Compose的行为。Compose中定义了一系列环境变量这些变量以COMPOSE_为前缀。4.1、Compose中定义的环境变量1.COMPOSE_PROJECT_NAME设置Compose的项目名称默认是当前工作目录docker-compose.yml文件所在目录的名字。Compose会在每一个启动的容器前添加项目名称。例如一个名称为proj的项目其中的一个Web容器名称可能为proj_web_1。2.COMPOSE_FILE设置要使用的docker-compose.yml的路径。如果不指定默认会先查找当前工作目录下是否存在docker-compose.yml文件如果找不到则继续查找上层目录。3.COMPOSE_PROFILES定义执行compose up时的配置文件这些配置文件可以覆盖和补充Compose文件中定义的服务的属性例如环境变量、镜像、命令等。指定配置文件时标记了对应配置文件的服务和没有带任何配置文件标记的服务会被compose up执行。4.COMPOSE_CONVERT_WINDOWS_PATHS将挂载卷的Windows路径风格转换为UNIX路径风格。5.COMPOSE_PATH_SEPARATOR指定COMPOSE_FILE环境变量中的路径间隔符。6.COMPOSE_IGNORE_ORPHANS指定是否忽略孤儿容器。7.COMPOSE_PARALLEL_LIMIT设置Compose可以执行进程的并发数。4.2、在Compose文件中使用环境变量Compose已经支持从环境变量中读取内容最简单的做法类似Shell语法使用${VAR}如下所示当执行Compose的环境中存在VERSION1.0环境变量定义时上述指令实际上等价于环境变量也可以写入路径下的.env文件中如VERSION1.0同样会被Compose自动读取。另外Compose也支持设置变量的默认值例如${VAR:-default}当${VAR}未定义或为空值时采用default值${VAR-default}当${VAR}未定义时采用default值。4.3、Compose应用案例一Web负载均衡负载均衡器Web应用是十分经典的应用结构。下面笔者将创建一个该结构的Web项目一个Haproxy作为负载均衡器后端挂载三个Web容器。首先创建一个haproxy_web目录作为项目工作目录并在其中分别创建两个子目录web和haproxy。4.3.1、web子目录在web子目录下将放置所需Web应用代码和Dockerfile一会将生成需要的Web镜像。这里用Python程序来实现一个简单的Web应用该应用能响应HTTP请求返回的页面将打印出访问者的IP和响应请求的后端容器的IP。(1)index.py编写一个index.py作为服务器文件代码为(2)index.html生成一个临时的index.html文件其内容会被index.py来更新。生成一个临时的healthcheck.html文件供HAProxy进行健康检查时使用。(3)Dockerfile生成一个Dockerfile部署该Web应用内容为4.3.2、haproxy目录该目录将配置haproxy镜像。在其中生成一个haproxy.cfg文件内容为4.3.3、docker-compose.yml在haproxy_web目录下编写一个docker-compose.yml文件该文件是Compose使用的主模板文件其中指定启动3个Web容器(weba、webb、webc)以及1个haproxy容器4.3.4、运行compose项目现在haproxy_web目录应该显示为下面的样子在该目录下执行sudo docker-compose up命令控制台会整合打印出所有容器的输出信息此时通过浏览器访问本地的80端口会获取到页面信息如图所示。页面信息经过Haproxy自动转发到后端的某个Web容器上刷新页面可以观察到访问的容器地址的变化。访问本地70端口可以查看到Haproxy的统计信息如图所示。查看本地的镜像会发现Compose自动创建的haproxyweb_webahaproxyweb_webbhaproxyweb_webc镜像当然还可以进一步使用consul等方案来实现服务自动发现这样就可以不用手动指定后端的Web容器了更为灵活。4.4、Compose应用案例二大数据Spark集群Spark是由Berkeley开发的分布式计算框架。相对于HadoopSpark可以缓存中间结果到内存提高某些需要迭代计算的场景的效率因此它受到广泛关注。如果用户只熟悉Hadoop也不必担心。Spark的很多设计理念和用法都与Hadoop保持一致或相似并且在使用上完全兼容HDFS。但是Spark的安装并不容易它需要安装包括Java、Scala、HDFS等多个依赖。使用Docker Compose可以快速在本地搭建一套Spark环境方便大家开发Spark应用或者将其扩展到生产环境中。4.4.1、准备工作这里笔者采用热门的sequenceiq/docker-spark镜像这个镜像已经安装了对Spark的完整依赖。由于镜像比较大2 GB以上​推荐先下载镜像到本地(1)docker-compose.yml文件首先新建一个spark_cluster目录并在其中创建一个docker-compose.yml文件。文件内容如下docker-compose.yml中定义了两种类型的服务master和worker。master类型的服务容器将负责管理操作worker则负责具体处理。(2)master服务master服务映射了好几组端口到本地功能分别为4040Spark运行任务时候提供Web界面观测任务的具体执行状况包括执行到哪个阶段、在哪个executor上执行。8042Hadoop的节点管理界面。7077Spark主节点的监听端口用户可以提交应用到这个端口worker节点也可以通过这个端口连接到主节点构成集群。8080Spark的监控界面可以看到所有的worker、应用整体信息。8088Hadoop集群的整体监控界面。下图中给出了master端口示例。(3)worker服务类似master节点启动后执行了/usr/local/spark/sbin/start-slave.shspark://master:7077命令来配置自己为worker节点然后通过ping来避免容器退出。注意启动脚本后需要提供spark://master:7077参数来指定master节点地址。在8081端口提供的Web界面可以看到该worker节点上任务的具体执行情况如图所示。4.4.2、启动集群在spark_cluster目录下执行启动命令可以看到类似如下的输出docker-compose服务运行起来后还可以用scale命令来动态扩展Spark的worker节点数例如4.4.3、执行应用Spark推荐用spark-submit命令来提交执行的命令基本语法为例如可以使用Spark自带样例中计算Pi的应用。在master节点上执行命令最后的参数1000表示要计算的迭代次数为1000次。在任务运行过程中可以用浏览器访问4040端口看到任务被分配到了两个worker节点上执行如图所示。计算过程中也会输出结果如下所示