Docker Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排,开源地址:https://github.com/docker/compose

Docker Compose 中的两个重要概念:

  • 服务 (service):一个应用容器,实际上可以运行多个相同镜像的实例。
  • 项目 (project):由一组关联的应用容器组成的一个完整业务单元。

一个项目可以由多个服务关联(容器)而成,并使用docker-compose.yml进行管理。

安装命令:

  1. $ curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
  2. $ chmod +x /usr/local/bin/docker-compose

这种方式安装巨慢无比,我们可以使用 PIP 安装,如果没有 PIP 环境,需要手动安装下:

  1. $ apt-get update
  2. $ apt-get -y install python-pip
  3. $ curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
  4. $ python get-pip.py
  5. $ pip --help
  6. $ pip -V

PIP 安装命令:

  1. $ sudo pip install -U docker-compose

PIP 安装之后,执行 Docker Compose 命令的时候,会出现下面错误:

  1. $ docker-compose up
  2. Cannot open self /usr/local/bin/docker-compose or archive /usr/local/bin/docker-compose.pkg

解决方式,从官方源中手动下载安装包,然后移动到制定目录赋予权限,命令如下:

  1. $ cp -i docker-compose-Linux-x86_64 /usr/local/bin
  2. $ mv docker-compose-Linux-x86_64 docker-compose
  3. $ chmod +x /usr/local/bin/docker-compose

安装好之后,我们就可以使用 Docker Compose 进行容器编排了,我们就拿之前做的 HelloDocker.Sample 项目做为示例。

我们在HelloDocker.Sample.Web项目目录下,创建docker-compose.yml配置文件,示例:

  1. consul:
  2. command: agent -bind=10.9.10.89 -client=0.0.0.0 -node=vagrant-ubuntu-xishuai -retry-join=10.9.2.236
  3. image: consul:latest
  4. ports:
  5. - 8300:8300
  6. - 8400:8400
  7. - 8500:8500
  8. - 8600:53/udp
  9. net: host
  10. fabio:
  11. image: magiconair/fabio:latest
  12. ports:
  13. - 9999:9999
  14. - 9998:9998
  15. net: host
  16. volumes:
  17. - /etc/fabio/fabio.properties:/etc/fabio/fabio.properties
  18. environment:
  19. - SERVICE_9998_TAGS=urlprefix-/fabio
  20. hello-docker:
  21. ports:
  22. - 54917:54917
  23. build: .
  24. net: host

其实看配置就明了了,一个项目中包含三个服务(consul, fabiohell-docker容器),Docker Compose 对这三个服务进行编排部署,我们执行docker-compose up命令,启动项目:

  1. $ docker-compose up -d
  2. Creating hellodockerweb_fabio_1 ...
  3. Creating hellodockerweb_hello-docker_1 ...
  4. Creating hellodockerweb_consul_1 ...
  5. Creating hellodockerweb_fabio_1
  6. Creating hellodockerweb_hello-docker_1
  7. Creating hellodockerweb_consul_1 ... done

我们可以执行docker-compose ps, 查看运行的服务(容器):

  1. $ docker-compose ps
  2. Name Command State Ports
  3. ------------------------------------------------------------------------------
  4. hellodockerweb_consul_1 docker-entrypoint.sh agent ... Up
  5. hellodockerweb_fabio_1 /fabio -cfg /etc/fabio/fab ... Up
  6. hellodockerweb_hello-docker_1 dotnet HelloDocker.Web.dll Up

或者执行docker-compose logs,查看日志:

  1. docker-compose logs
  2. Attaching to hellodockerweb_consul_1, hellodockerweb_hello-docker_1, hellodockerweb_fabio_1
  3. consul_1 | ==> Starting Consul agent...
  4. consul_1 | ==> Consul agent running!
  5. consul_1 | Version: 'v1.0.0'
  6. consul_1 | Node ID: '521358bc-efc0-1a69-4a58-a9bfc8a9b09c'
  7. consul_1 | Node name: 'vagrant-ubuntu-xishuai'
  8. consul_1 | Datacenter: 'dc1' (Segment: '')
  9. consul_1 | Server: false (Bootstrap: false)
  10. consul_1 | Client Addr: [0.0.0.0] (HTTP: 8500, HTTPS: -1, DNS: 8600)
  11. consul_1 | Cluster Addr: 10.9.10.89 (LAN: 8301, WAN: 8302)
  12. consul_1 | Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false
  13. consul_1 |
  14. consul_1 | ==> Log data will now stream in as it occurs:
  15. consul_1 |
  16. consul_1 | 2017/11/21 04:41:25 [INFO] serf: EventMemberJoin: vagrant-ubuntu-xishuai 10.9.10.89
  17. consul_1 | 2017/11/21 04:41:25 [INFO] agent: Started DNS server 0.0.0.0:8600 (tcp)
  18. consul_1 | 2017/11/21 04:41:25 [INFO] agent: Started DNS server 0.0.0.0:8600 (udp)
  19. consul_1 | 2017/11/21 04:41:25 [INFO] agent: Started HTTP server on [::]:8500 (tcp)
  20. consul_1 | 2017/11/21 04:41:25 [INFO] agent: Retry join LAN is supported for: aws azure gce softlayer
  21. consul_1 | 2017/11/21 04:41:25 [INFO] agent: Joining LAN cluster...
  22. consul_1 | 2017/11/21 04:41:25 [INFO] agent: (LAN) joining: [10.9.2.236]
  23. consul_1 | 2017/11/21 04:41:25 [WARN] manager: No servers available
  24. consul_1 | 2017/11/21 04:41:25 [ERR] agent: failed to sync remote state: No known Consul servers
  25. consul_1 | 2017/11/21 04:41:25 [INFO] serf: EventMemberJoin: agent_1 10.9.2.236
  26. consul_1 | 2017/11/21 04:41:25 [INFO] serf: EventMemberJoin: windows64-xishuai 10.9.10.187
  27. consul_1 | 2017/11/21 04:41:25 [INFO] agent: (LAN) joined: 1 Err: <nil>
  28. consul_1 | 2017/11/21 04:41:25 [INFO] agent: Join LAN completed. Synced with 1 initial agents
  29. consul_1 | 2017/11/21 04:41:25 [INFO] consul: adding server agent_1 (Addr: tcp/10.9.2.236:8300) (DC: dc1)
  30. consul_1 | 2017/11/21 04:41:34 [INFO] agent: Synced service 'fabio-vagrant-ubuntu-trusty-9998'
  31. hello-docker_1 | warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
  32. hello-docker_1 | No XML encryptor configured. Key {3d8c2a18-ed43-4df9-980f-8573175ebecf} may be persisted to storage in unencrypted form.
  33. hello-docker_1 | Hosting environment: Production
  34. hello-docker_1 | Content root path: /app
  35. hello-docker_1 | Now listening on: http://[::]:54917
  36. hello-docker_1 | Application started. Press Ctrl+C to shut down.
  37. fabio_1 | 2017/11/21 04:41:25 [INFO] Setting log level to INFO
  38. fabio_1 | 2017/11/21 04:41:25 [INFO] Runtime config
  39. fabio_1 | {
  40. fabio_1 | "Proxy": {
  41. fabio_1 | "Strategy": "rnd",
  42. fabio_1 | "Matcher": "prefix",
  43. fabio_1 | "NoRouteStatus": 404,
  44. fabio_1 | "MaxConn": 10000,
  45. fabio_1 | "ShutdownWait": 0,
  46. fabio_1 | "DialTimeout": 30000000000,
  47. fabio_1 | "ResponseHeaderTimeout": 0,
  48. fabio_1 | "KeepAliveTimeout": 0,
  49. fabio_1 | "FlushInterval": 1000000000,
  50. fabio_1 | "LocalIP": "10.0.2.15",
  51. fabio_1 | "ClientIPHeader": "",
  52. fabio_1 | "TLSHeader": "",
  53. fabio_1 | "TLSHeaderValue": "",
  54. fabio_1 | "GZIPContentTypes": null,
  55. fabio_1 | "RequestID": ""
  56. fabio_1 | },
  57. fabio_1 | "Registry": {
  58. fabio_1 | "Backend": "consul",
  59. fabio_1 | "Static": {
  60. fabio_1 | "Routes": ""
  61. fabio_1 | },
  62. fabio_1 | "File": {
  63. fabio_1 | "Path": ""
  64. fabio_1 | },
  65. consul_1 | 2017/11/21 04:41:34 [WARN] agent: check 'service:8a600176-4c58-4edc-95af-71fc27345954' has deregister interval below minimum of 1m0s
  66. consul_1 | 2017/11/21 04:41:34 [INFO] agent: Synced service '8a600176-4c58-4edc-95af-71fc27345954'
  67. consul_1 | 2017/11/21 04:41:34 [INFO] agent: Synced service 'fabio-vagrant-ubuntu-trusty-9998'
  68. consul_1 | 2017/11/21 04:41:35 [INFO] agent: Synced check 'service:fabio-vagrant-ubuntu-trusty-9998'
  69. consul_1 | 2017/11/21 04:41:40 [INFO] agent: Synced check 'service:8a600176-4c58-4edc-95af-71fc27345954'
  70. consul_1 | ==> Newer Consul version available: 1.0.1 (currently running: 1.0.0)
  71. consul_1 | 2017/11/21 04:41:57 [WARN] memberlist: Refuting a suspect message (from: agent_1)
  72. fabio_1 | "Consul": {
  73. fabio_1 | "Addr": "10.9.10.89:8500",
  74. fabio_1 | "Scheme": "http",
  75. fabio_1 | "Token": "",
  76. fabio_1 | "KVPath": "/fabio/config",
  77. fabio_1 | "TagPrefix": "urlprefix-",
  78. fabio_1 | "Register": true,
  79. fabio_1 | "ServiceAddr": "10.9.10.89:9998",
  80. fabio_1 | "ServiceName": "fabio",
  81. fabio_1 | "ServiceTags": null,
  82. fabio_1 | "ServiceStatus": [
  83. fabio_1 | "passing"
  84. fabio_1 | ],
  85. fabio_1 | "CheckInterval": 1000000000,
  86. fabio_1 | "CheckTimeout": 3000000000,
  87. fabio_1 | "CheckScheme": "http",
  88. fabio_1 | "CheckTLSSkipVerify": false
  89. fabio_1 | },
  90. fabio_1 | "Timeout": 10000000000,
  91. fabio_1 | "Retry": 500000000
  92. fabio_1 | },
  93. fabio_1 | "Listen": [
  94. fabio_1 | {
  95. fabio_1 | "Addr": ":9999",
  96. fabio_1 | "Proto": "http",
  97. fabio_1 | "ReadTimeout": 0,
  98. fabio_1 | "WriteTimeout": 0,
  99. fabio_1 | "CertSource": {
  100. fabio_1 | "Name": "",
  101. fabio_1 | "Type": "",
  102. fabio_1 | "CertPath": "",
  103. fabio_1 | "KeyPath": "",
  104. fabio_1 | "ClientCAPath": "",
  105. fabio_1 | "CAUpgradeCN": "",
  106. fabio_1 | "Refresh": 0,
  107. fabio_1 | "Header": null
  108. fabio_1 | },
  109. fabio_1 | "StrictMatch": false,
  110. fabio_1 | "TLSMinVersion": 0,
  111. fabio_1 | "TLSMaxVersion": 0,
  112. fabio_1 | "TLSCiphers": null
  113. fabio_1 | }
  114. fabio_1 | ],
  115. fabio_1 | "Log": {
  116. fabio_1 | "AccessFormat": "common",
  117. fabio_1 | "AccessTarget": "",
  118. fabio_1 | "RoutesFormat": "delta",
  119. fabio_1 | "Level": "INFO"
  120. fabio_1 | },
  121. fabio_1 | "Metrics": {
  122. fabio_1 | "Target": "",
  123. fabio_1 | "Prefix": "{{clean .Hostname}}.{{clean .Exec}}",
  124. fabio_1 | "Names": "{{clean .Service}}.{{clean .Host}}.{{clean .Path}}.{{clean .TargetURL.Host}}",
  125. fabio_1 | "Interval": 30000000000,
  126. fabio_1 | "Timeout": 10000000000,
  127. fabio_1 | "Retry": 500000000,
  128. fabio_1 | "GraphiteAddr": "",
  129. fabio_1 | "StatsDAddr": "",
  130. fabio_1 | "Circonus": {
  131. fabio_1 | "APIKey": "",
  132. fabio_1 | "APIApp": "fabio",
  133. fabio_1 | "APIURL": "",
  134. fabio_1 | "CheckID": "",
  135. fabio_1 | "BrokerID": ""
  136. fabio_1 | }
  137. fabio_1 | },
  138. fabio_1 | "UI": {
  139. fabio_1 | "Listen": {
  140. fabio_1 | "Addr": ":9998",
  141. fabio_1 | "Proto": "http",
  142. fabio_1 | "ReadTimeout": 0,
  143. fabio_1 | "WriteTimeout": 0,
  144. fabio_1 | "CertSource": {
  145. fabio_1 | "Name": "",
  146. fabio_1 | "Type": "",
  147. fabio_1 | "CertPath": "",
  148. fabio_1 | "KeyPath": "",
  149. fabio_1 | "ClientCAPath": "",
  150. fabio_1 | "CAUpgradeCN": "",
  151. fabio_1 | "Refresh": 0,
  152. fabio_1 | "Header": null
  153. fabio_1 | },
  154. fabio_1 | "StrictMatch": false,
  155. fabio_1 | "TLSMinVersion": 0,
  156. fabio_1 | "TLSMaxVersion": 0,
  157. fabio_1 | "TLSCiphers": null
  158. fabio_1 | },
  159. fabio_1 | "Color": "light-green",
  160. fabio_1 | "Title": "",
  161. fabio_1 | "Access": "rw"
  162. fabio_1 | },
  163. fabio_1 | "Runtime": {
  164. fabio_1 | "GOGC": 800,
  165. fabio_1 | "GOMAXPROCS": 1
  166. fabio_1 | },
  167. fabio_1 | "ProfileMode": "",
  168. fabio_1 | "ProfilePath": "/tmp"
  169. fabio_1 | }
  170. fabio_1 | 2017/11/21 04:41:25 [INFO] Version 1.5.3 starting
  171. fabio_1 | 2017/11/21 04:41:25 [INFO] Go runtime is go1.9.2
  172. fabio_1 | 2017/11/21 04:41:25 [INFO] Metrics disabled
  173. fabio_1 | 2017/11/21 04:41:25 [INFO] Setting GOGC=800
  174. fabio_1 | 2017/11/21 04:41:25 [INFO] Setting GOMAXPROCS=1
  175. fabio_1 | 2017/11/21 04:41:25 [WARN] Error initializing backend. Get http://10.9.10.89:8500/v1/agent/self: dial tcp 10.9.10.89:8500: getsockopt: connection refused
  176. fabio_1 | 2017/11/21 04:41:25 [INFO] consul: Connecting to "10.9.10.89:8500" in datacenter "dc1"
  177. fabio_1 | 2017/11/21 04:41:25 [INFO] Admin server access mode "rw"
  178. fabio_1 | 2017/11/21 04:41:25 [INFO] Admin server listening on ":9998"
  179. fabio_1 | 2017/11/21 04:41:25 [INFO] Waiting for first routing table
  180. fabio_1 | 2017/11/21 04:41:25 [INFO] consul: Using dynamic routes
  181. fabio_1 | 2017/11/21 04:41:25 [INFO] consul: Using tag prefix "urlprefix-"
  182. fabio_1 | 2017/11/21 04:41:25 [INFO] consul: Watching KV path "/fabio/config"
  183. fabio_1 | 2017/11/21 04:41:34 [INFO] consul: Manual config changed to #3821244
  184. fabio_1 | 2017/11/21 04:41:34 [INFO] HTTP proxy listening on :9999
  185. fabio_1 | 2017/11/21 04:41:34 [INFO] Access logging disabled
  186. fabio_1 | 2017/11/21 04:41:34 [INFO] Using routing strategy "rnd"
  187. fabio_1 | 2017/11/21 04:41:34 [INFO] Using route matching "prefix"
  188. fabio_1 | 2017/11/21 04:41:34 [INFO] consul: Health changed to #3821756
  189. fabio_1 | 2017/11/21 04:41:34 [INFO] consul: Registered fabio with id "fabio-vagrant-ubuntu-trusty-9998"
  190. fabio_1 | 2017/11/21 04:41:34 [INFO] consul: Registered fabio with address "10.9.10.89"
  191. fabio_1 | 2017/11/21 04:41:34 [INFO] consul: Registered fabio with tags ""
  192. fabio_1 | 2017/11/21 04:41:34 [INFO] consul: Registered fabio with health check to "http://[10.9.10.89]:9998/health"
  193. fabio_1 | 2017/11/21 04:41:35 [INFO] Config updates
  194. fabio_1 | + route add test /test http://10.9.2.236:23421/
  195. fabio_1 | 2017/11/21 04:41:35 [INFO] consul: Health changed to #3821762
  196. fabio_1 | 2017/11/21 04:41:40 [INFO] consul: Health changed to #3821765
  197. fabio_1 | 2017/11/21 04:41:42 [INFO] Config updates
  198. fabio_1 | + hello-docker /hello-docker http://10.9.10.89:54917/
  199. fabio_1 | + route add

我们可以查看 Consul UI 中的服务是否运行正常:

或者查看 Fabio UI 中的服务是否存在(通过健康检查后会出现):

YAML 配置命令

配置 说明
build 指定 Dockerfile 所在的目录地址,用于构建镜像,并使用此镜像创建容器,比如上面配置的build: .
command 容器的执行命令
dns 自定义 dns 服务器
expose 暴露端口配置,但不映射到宿主机,只被连接的服务访问
extends docker-compose.yml的扩展,配置在服务中
image 使用的镜像名称或镜像 ID
links 链接到其它服务中的容器(一般桥接网络模式使用)
net 设置容器的网络模式(四种:bridge, none, container:[name or id]host
ports 暴露端口信息,主机和容器的端口映射
volumes 数据卷所挂载路径设置

Docker Compose 常用命令

命令 说明
docker-compose build 构建项目中的镜像,--force-rm:删除构建过程中的临时容器;--no-cache:不使用缓存构建;--pull:获取最新版本的镜像
docker-compose up -d 构建镜像、创建服务和启动项目,-d表示后台运行
docker-compose run ubuntu ls -d 指定服务上运行一个命令,-d表示后台运行
docker-compose logs 查看服务容器输出日志
docker-compose ps 列出项目中所有的容器
docker-compose pause [service_name] 暂停一个服务容器
docker-compose unpause [service_name] 恢复已暂停的一个服务容器
docker-compose restart 重启项目中的所有服务容器(也可以指定具体的服务)
docker-compose stop 停止运行项目中的所有服务容器(也可以指定具体的服务)
docker-compose start 启动已经停止项目中的所有服务容器(也可以指定具体的服务)
docker-compose rm 删除项目中的所有服务容器(也可以指定具体的服务),-f:强制删除(包含运行的)
docker-compose kill 强制停止项目中的所有服务容器(也可以指定具体的服务)

参考资料:

Docker 三剑客之 Compose的更多相关文章

  1. Docker三剑客之compose

    简介 Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排.从功能上看,跟 OpenStack 中的 Heat 十分类似.其代码目前在 https://g ...

  2. Docker三剑客之 Compose

    简介 Docker-Compose 是 Docker 的一种编排服务,是一个用于在 Docker 上定义并运行复杂应用的工具,可以让用户在集群中部署分布式应用. 通过 Docker-Compose 用 ...

  3. Docker三剑客之Docker Compose

    一.什么是Docker Compose Compose 项目是Docker官方的开源项目,负责实现Docker容器集群的快速编排,开源代码在https://github.com/docker/comp ...

  4. Docker 三剑客之 Docker Swarm

    上一篇:Docker 三剑客之 Docker Compose 阅读目录: Docker Machine 创建 Docker 主机 Docker Swarm 配置集群节点 Docker Service ...

  5. Docker(五):Docker 三剑客之 Docker Machine

    上篇文章Docker(四):Docker 三剑客之 Docker Compose介绍了 Docker Compose,这篇文章我们来了解 Docker Machine . Docker Machine ...

  6. Docker三剑客之Docker Swarm

    一.什么是Docker Swarm Swarm是Docker公司推出的用来管理docker集群的平台,几乎全部用GO语言来完成的开发的,代码开源在https://github.com/docker/s ...

  7. Docker 三剑客

    Docker三剑客: Docker-Machine Docker Machine is a tool that lets you install Docker Engine on virtual ho ...

  8. Docker(六):Docker 三剑客之 Docker Swarm

    实践中会发现,生产环境中使用单个 Docker 节点是远远不够的,搭建 Docker 集群势在必行.然而,面对 Kubernetes, Mesos 以及 Swarm 等众多容器集群系统,我们该如何选择 ...

  9. Docker 三剑客之 Docker Swarm(基于 overlay 组网通信)

    相关文章:Docker 三剑客之 Docker Swarm 这一篇主要是对 Docker Swarm 的完善,增加基于 overlay 组网通信,以便 Docker 容器可以跨主机访问. 不同主机间的 ...

随机推荐

  1. python pip安装方法

    1.python安装,最好是按照32位的版本,64位版本有的时候出现奇怪问题. 2.python安装完成后,需要在系统的环境变量"path"中增加路径设置. 3.一般情况下,使用p ...

  2. Echarts数据可视化series-scatter散点图,开发全解+完美注释

    全栈工程师开发手册 (作者:栾鹏) Echarts数据可视化开发代码注释全解 Echarts数据可视化开发参数配置全解 6大公共组件详解(点击进入): title详解. tooltip详解.toolb ...

  3. 51nod 1595 回文度 | 马拉车Manacher DP

    51nod 1595 回文度 题目描述 如果长度为n的字符串是一个回文串,同时它的长度为floor(n/2)的前缀和后缀是K-1度回文串,则这个字符串被称为K度回文串.根据定义,任何字符串(即使是空字 ...

  4. Set 和 Map 数据结构

    Set Set 对象允许你存储任何类型的 唯一值, 无论是 原始值(一共6种,string, number, boolean, undefined, null,和 es6 新增的 symbol) 还是 ...

  5. [js高手之路] 设计模式系列课程 - jQuery的extend插件机制

    这里在之前的文章[js高手之路] 设计模式系列课程 - jQuery的链式调用与灵活的构造函数基础上增加一个extend浅拷贝,可以为对象方便的扩展属性和方法, jquery的插件扩展机制,大致就是这 ...

  6. win10 uwp 打包第三方字体到应用

    有时候我们会把一些特殊字体打包到软件,因为如果找不到我们的字体会变为默认,现在很多字体图标我们用得好,有时候我们的应用会用很漂亮的字体,需要我们自己打包,因为用户一般是没有字体. UWP使用第三方字体 ...

  7. 【NOIP2016 Day1 T2】天天爱跑步

    题目传送门:https://www.luogu.org/problemnew/show/P1600 感觉这两天在处理边界问题上有点神志不清......为了从80的暴力变成100,花了整整一个下午+一个 ...

  8. (转)Java开发中的23种设计模式详解

    原文出自:http://blog.csdn.net/zhangerqing 一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型 ...

  9. sublime中安装package control总是失败

    今天下载了个sublime编辑器,要运行vue文件,想让vue也能高亮显示,在网上搜了一下如何安装.但总是提示控制器没有安装Package Control:There are no packages ...

  10. 如何用CropBox实现头像裁剪并与java后台交互

    如何用CropBox实现头像裁剪并与java后台交互 参考网站:https://developer.mozilla.org/zh-CN/docs/Web/API/Blob 参考: http://blo ...