1. 程式人生 > >Docker 三劍客之 Docker Compose

Docker 三劍客之 Docker Compose

Docker Compose 專案是 Docker 官方的開源專案,負責實現對 Docker 容器叢集的快速編排,開源地址:https://github.com/docker/compose

Docker Compose 中的兩個重要概念:

  • 服務 (service):一個應用容器,實際上可以執行多個相同映象的例項。
  • 專案 (project):由一組關聯的應用容器組成的一個完整業務單元。

一個專案可以由多個服務關聯(容器)而成,並使用docker-compose.yml進行管理。

安裝命令:

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

這種方式安裝巨慢無比,我們可以使用 PIP 安裝,如果沒有 PIP 環境,需要手動安裝下:

$ apt-get update
$ apt-get -y install python-pip

或

$ curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
$ python get-pip.py

$ pip --help
$ pip -V

PIP 安裝命令:

$ sudo pip install -U docker-compose

PIP 安裝之後,執行 Docker Compose 命令的時候,會出現下面錯誤:

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

解決方式,從官方源中手動下載安裝包,然後移動到制定目錄賦予許可權,命令如下:

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

安裝好之後,我們就可以使用 Docker Compose 進行容器編排了,我們就拿之前做的 HelloDocker.Sample 專案做為示例。

我們在HelloDocker.Sample.Web專案目錄下,建立docker-compose.yml配置檔案,示例:

consul:
  command: agent -bind=10.9.10.89 -client=0.0.0.0 -node=vagrant-ubuntu-xishuai -retry-join=10.9.2.236
  image: consul:latest
  ports:
    - 8300:8300
    - 8400:8400
    - 8500:8500
    - 8600:53/udp
  net: host
fabio:
  image: magiconair/fabio:latest
  ports:
    - 9999:9999
    - 9998:9998
  net: host
  volumes:
    - /etc/fabio/fabio.properties:/etc/fabio/fabio.properties
  environment:
  - SERVICE_9998_TAGS=urlprefix-/fabio
hello-docker:
  ports:
    - 54917:54917
  build: .
  net: host

其實看配置就明瞭了,一個專案中包含三個服務(consul, fabiohell-docker容器),Docker Compose 對這三個服務進行編排部署,我們執行docker-compose up命令,啟動專案:

$ docker-compose up -d
Creating hellodockerweb_fabio_1 ... 
Creating hellodockerweb_hello-docker_1 ... 
Creating hellodockerweb_consul_1 ... 
Creating hellodockerweb_fabio_1
Creating hellodockerweb_hello-docker_1
Creating hellodockerweb_consul_1 ... done

我們可以執行docker-compose ps, 檢視執行的服務(容器):

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

或者執行docker-compose logs,檢視日誌:

docker-compose logs
Attaching to hellodockerweb_consul_1, hellodockerweb_hello-docker_1, hellodockerweb_fabio_1
consul_1        | ==> Starting Consul agent...
consul_1        | ==> Consul agent running!
consul_1        |            Version: 'v1.0.0'
consul_1        |            Node ID: '521358bc-efc0-1a69-4a58-a9bfc8a9b09c'
consul_1        |          Node name: 'vagrant-ubuntu-xishuai'
consul_1        |         Datacenter: 'dc1' (Segment: '')
consul_1        |             Server: false (Bootstrap: false)
consul_1        |        Client Addr: [0.0.0.0] (HTTP: 8500, HTTPS: -1, DNS: 8600)
consul_1        |       Cluster Addr: 10.9.10.89 (LAN: 8301, WAN: 8302)
consul_1        |            Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false
consul_1        | 
consul_1        | ==> Log data will now stream in as it occurs:
consul_1        | 
consul_1        |     2017/11/21 04:41:25 [INFO] serf: EventMemberJoin: vagrant-ubuntu-xishuai 10.9.10.89
consul_1        |     2017/11/21 04:41:25 [INFO] agent: Started DNS server 0.0.0.0:8600 (tcp)
consul_1        |     2017/11/21 04:41:25 [INFO] agent: Started DNS server 0.0.0.0:8600 (udp)
consul_1        |     2017/11/21 04:41:25 [INFO] agent: Started HTTP server on [::]:8500 (tcp)
consul_1        |     2017/11/21 04:41:25 [INFO] agent: Retry join LAN is supported for: aws azure gce softlayer
consul_1        |     2017/11/21 04:41:25 [INFO] agent: Joining LAN cluster...
consul_1        |     2017/11/21 04:41:25 [INFO] agent: (LAN) joining: [10.9.2.236]
consul_1        |     2017/11/21 04:41:25 [WARN] manager: No servers available
consul_1        |     2017/11/21 04:41:25 [ERR] agent: failed to sync remote state: No known Consul servers
consul_1        |     2017/11/21 04:41:25 [INFO] serf: EventMemberJoin: agent_1 10.9.2.236
consul_1        |     2017/11/21 04:41:25 [INFO] serf: EventMemberJoin: windows64-xishuai 10.9.10.187
consul_1        |     2017/11/21 04:41:25 [INFO] agent: (LAN) joined: 1 Err: <nil>
consul_1        |     2017/11/21 04:41:25 [INFO] agent: Join LAN completed. Synced with 1 initial agents
consul_1        |     2017/11/21 04:41:25 [INFO] consul: adding server agent_1 (Addr: tcp/10.9.2.236:8300) (DC: dc1)
consul_1        |     2017/11/21 04:41:34 [INFO] agent: Synced service 'fabio-vagrant-ubuntu-trusty-9998'
hello-docker_1  | warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
hello-docker_1  |       No XML encryptor configured. Key {3d8c2a18-ed43-4df9-980f-8573175ebecf} may be persisted to storage in unencrypted form.
hello-docker_1  | Hosting environment: Production
hello-docker_1  | Content root path: /app
hello-docker_1  | Now listening on: http://[::]:54917
hello-docker_1  | Application started. Press Ctrl+C to shut down.
fabio_1         | 2017/11/21 04:41:25 [INFO] Setting log level to INFO
fabio_1         | 2017/11/21 04:41:25 [INFO] Runtime config
fabio_1         | {
fabio_1         |     "Proxy": {
fabio_1         |         "Strategy": "rnd",
fabio_1         |         "Matcher": "prefix",
fabio_1         |         "NoRouteStatus": 404,
fabio_1         |         "MaxConn": 10000,
fabio_1         |         "ShutdownWait": 0,
fabio_1         |         "DialTimeout": 30000000000,
fabio_1         |         "ResponseHeaderTimeout": 0,
fabio_1         |         "KeepAliveTimeout": 0,
fabio_1         |         "FlushInterval": 1000000000,
fabio_1         |         "LocalIP": "10.0.2.15",
fabio_1         |         "ClientIPHeader": "",
fabio_1         |         "TLSHeader": "",
fabio_1         |         "TLSHeaderValue": "",
fabio_1         |         "GZIPContentTypes": null,
fabio_1         |         "RequestID": ""
fabio_1         |     },
fabio_1         |     "Registry": {
fabio_1         |         "Backend": "consul",
fabio_1         |         "Static": {
fabio_1         |             "Routes": ""
fabio_1         |         },
fabio_1         |         "File": {
fabio_1         |             "Path": ""
fabio_1         |         },
consul_1        |     2017/11/21 04:41:34 [WARN] agent: check 'service:8a600176-4c58-4edc-95af-71fc27345954' has deregister interval below minimum of 1m0s
consul_1        |     2017/11/21 04:41:34 [INFO] agent: Synced service '8a600176-4c58-4edc-95af-71fc27345954'
consul_1        |     2017/11/21 04:41:34 [INFO] agent: Synced service 'fabio-vagrant-ubuntu-trusty-9998'
consul_1        |     2017/11/21 04:41:35 [INFO] agent: Synced check 'service:fabio-vagrant-ubuntu-trusty-9998'
consul_1        |     2017/11/21 04:41:40 [INFO] agent: Synced check 'service:8a600176-4c58-4edc-95af-71fc27345954'
consul_1        | ==> Newer Consul version available: 1.0.1 (currently running: 1.0.0)
consul_1        |     2017/11/21 04:41:57 [WARN] memberlist: Refuting a suspect message (from: agent_1)
fabio_1         |         "Consul": {
fabio_1         |             "Addr": "10.9.10.89:8500",
fabio_1         |             "Scheme": "http",
fabio_1         |             "Token": "",
fabio_1         |             "KVPath": "/fabio/config",
fabio_1         |             "TagPrefix": "urlprefix-",
fabio_1         |             "Register": true,
fabio_1         |             "ServiceAddr": "10.9.10.89:9998",
fabio_1         |             "ServiceName": "fabio",
fabio_1         |             "ServiceTags": null,
fabio_1         |             "ServiceStatus": [
fabio_1         |                 "passing"
fabio_1         |             ],
fabio_1         |             "CheckInterval": 1000000000,
fabio_1         |             "CheckTimeout": 3000000000,
fabio_1         |             "CheckScheme": "http",
fabio_1         |             "CheckTLSSkipVerify": false
fabio_1         |         },
fabio_1         |         "Timeout": 10000000000,
fabio_1         |         "Retry": 500000000
fabio_1         |     },
fabio_1         |     "Listen": [
fabio_1         |         {
fabio_1         |             "Addr": ":9999",
fabio_1         |             "Proto": "http",
fabio_1         |             "ReadTimeout": 0,
fabio_1         |             "WriteTimeout": 0,
fabio_1         |             "CertSource": {
fabio_1         |                 "Name": "",
fabio_1         |                 "Type": "",
fabio_1         |                 "CertPath": "",
fabio_1         |                 "KeyPath": "",
fabio_1         |                 "ClientCAPath": "",
fabio_1         |                 "CAUpgradeCN": "",
fabio_1         |                 "Refresh": 0,
fabio_1         |                 "Header": null
fabio_1         |             },
fabio_1         |             "StrictMatch": false,
fabio_1         |             "TLSMinVersion": 0,
fabio_1         |             "TLSMaxVersion": 0,
fabio_1         |             "TLSCiphers": null
fabio_1         |         }
fabio_1         |     ],
fabio_1         |     "Log": {
fabio_1         |         "AccessFormat": "common",
fabio_1         |         "AccessTarget": "",
fabio_1         |         "RoutesFormat": "delta",
fabio_1         |         "Level": "INFO"
fabio_1         |     },
fabio_1         |     "Metrics": {
fabio_1         |         "Target": "",
fabio_1         |         "Prefix": "{{clean .Hostname}}.{{clean .Exec}}",
fabio_1         |         "Names": "{{clean .Service}}.{{clean .Host}}.{{clean .Path}}.{{clean .TargetURL.Host}}",
fabio_1         |         "Interval": 30000000000,
fabio_1         |         "Timeout": 10000000000,
fabio_1         |         "Retry": 500000000,
fabio_1         |         "GraphiteAddr": "",
fabio_1         |         "StatsDAddr": "",
fabio_1         |         "Circonus": {
fabio_1         |             "APIKey": "",
fabio_1         |             "APIApp": "fabio",
fabio_1         |             "APIURL": "",
fabio_1         |             "CheckID": "",
fabio_1         |             "BrokerID": ""
fabio_1         |         }
fabio_1         |     },
fabio_1         |     "UI": {
fabio_1         |         "Listen": {
fabio_1         |             "Addr": ":9998",
fabio_1         |             "Proto": "http",
fabio_1         |             "ReadTimeout": 0,
fabio_1         |             "WriteTimeout": 0,
fabio_1         |             "CertSource": {
fabio_1         |                 "Name": "",
fabio_1         |                 "Type": "",
fabio_1         |                 "CertPath": "",
fabio_1         |                 "KeyPath": "",
fabio_1         |                 "ClientCAPath": "",
fabio_1         |                 "CAUpgradeCN": "",
fabio_1         |                 "Refresh": 0,
fabio_1         |                 "Header": null
fabio_1         |             },
fabio_1         |             "StrictMatch": false,
fabio_1         |             "TLSMinVersion": 0,
fabio_1         |             "TLSMaxVersion": 0,
fabio_1         |             "TLSCiphers": null
fabio_1         |         },
fabio_1         |         "Color": "light-green",
fabio_1         |         "Title": "",
fabio_1         |         "Access": "rw"
fabio_1         |     },
fabio_1         |     "Runtime": {
fabio_1         |         "GOGC": 800,
fabio_1         |         "GOMAXPROCS": 1
fabio_1         |     },
fabio_1         |     "ProfileMode": "",
fabio_1         |     "ProfilePath": "/tmp"
fabio_1         | }
fabio_1         | 2017/11/21 04:41:25 [INFO] Version 1.5.3 starting
fabio_1         | 2017/11/21 04:41:25 [INFO] Go runtime is go1.9.2
fabio_1         | 2017/11/21 04:41:25 [INFO] Metrics disabled
fabio_1         | 2017/11/21 04:41:25 [INFO] Setting GOGC=800
fabio_1         | 2017/11/21 04:41:25 [INFO] Setting GOMAXPROCS=1
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
fabio_1         | 2017/11/21 04:41:25 [INFO] consul: Connecting to "10.9.10.89:8500" in datacenter "dc1"
fabio_1         | 2017/11/21 04:41:25 [INFO] Admin server access mode "rw"
fabio_1         | 2017/11/21 04:41:25 [INFO] Admin server listening on ":9998"
fabio_1         | 2017/11/21 04:41:25 [INFO] Waiting for first routing table
fabio_1         | 2017/11/21 04:41:25 [INFO] consul: Using dynamic routes
fabio_1         | 2017/11/21 04:41:25 [INFO] consul: Using tag prefix "urlprefix-"
fabio_1         | 2017/11/21 04:41:25 [INFO] consul: Watching KV path "/fabio/config"
fabio_1         | 2017/11/21 04:41:34 [INFO] consul: Manual config changed to #3821244
fabio_1         | 2017/11/21 04:41:34 [INFO] HTTP proxy listening on :9999
fabio_1         | 2017/11/21 04:41:34 [INFO] Access logging disabled
fabio_1         | 2017/11/21 04:41:34 [INFO] Using routing strategy "rnd"
fabio_1         | 2017/11/21 04:41:34 [INFO] Using route matching "prefix"
fabio_1         | 2017/11/21 04:41:34 [INFO] consul: Health changed to #3821756
fabio_1         | 2017/11/21 04:41:34 [INFO] consul: Registered fabio with id "fabio-vagrant-ubuntu-trusty-9998"
fabio_1         | 2017/11/21 04:41:34 [INFO] consul: Registered fabio with address "10.9.10.89"
fabio_1         | 2017/11/21 04:41:34 [INFO] consul: Registered fabio with tags ""
fabio_1         | 2017/11/21 04:41:34 [INFO] consul: Registered fabio with health check to "http://[10.9.10.89]:9998/health"
fabio_1         | 2017/11/21 04:41:35 [INFO] Config updates
fabio_1         | + route add test /test http://10.9.2.236:23421/
fabio_1         | 2017/11/21 04:41:35 [INFO] consul: Health changed to #3821762
fabio_1         | 2017/11/21 04:41:40 [INFO] consul: Health changed to #3821765
fabio_1         | 2017/11/21 04:41:42 [INFO] Config updates
fabio_1         | + hello-docker /hello-docker http://10.9.10.89:54917/
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三劍客docker-compose

stopped fig gecko osi epo 項目 tor html gen 三劍客簡介 docker-machine docker技術是基於Linux內核的cgroup技術實現的,那麽問題來了,在非Linux平臺上是否就不能使用docker技術了呢?答案是可以的,不

docker——三劍客Docker Compose

編排(Orchestration)功能是複雜系統實現靈活可操作性的關鍵。特別是在Docker應用場景中,編排意味著使用者可以靈活的對各種容器資源實現定義和管理。作為Docker官方編排工具,Compose的重要性不言而喻,它可以讓使用者通過編寫一個簡單模板檔案,快速地建立和管理基於Docker容器地應用叢集。

Docker(四):Docker 三劍客 Docker Compose

前兩篇文章我們介紹了 Dockerfile 的使用Docker(二):Dockerfile 使用介紹,我們知道使用一個 Dockerfile 模板檔案可以定義一個單獨的應用容器,如果需要定義多個容器就需要服務編排。服務編排有很多種技術方案,今天給大家介紹 Docker 官方產品 Docker Compose

docker三劍客docker-compose(記官方案例)

簡介 Compose專案來源於之前的fig專案,使用python語言編寫,與docker/swarm配合度很高。 Compose 是 Docker 容器進行編排的工具,定義和執行多容器的應

Docker 三劍客 Docker Compose

Docker Compose 專案是 Docker 官方的開源專案,負責實現對 Docker 容器叢集的快速編排,開源地址:https://github.com/docker/compose Docker Compose 中的兩個重要概念: 服務 (service):一個應用容器,實際上可以執行多個相同映象

docker三劍客docker-machine

eval source grub info mod machine directory document driver #安裝docker-machine [email protected]/* */:~$ pwd /home/cupid [email

docker三劍客docker swarm

sock war unix 發現 p地址 replica 機制 工作 behavior Swarm是什麽 Swarm這個項目名稱特別貼切。在Wiki的解釋中,Swarm behavior是指動物的群集行為。比如我們常見的蜂群,魚群,秋天往南飛的雁群都可以稱作Swarm b

Docker(六):Docker 三劍客 Docker Swarm

lib ini 節點數 box 流量 虛擬 .html 刪除 解釋 實踐中會發現,生產環境中使用單個 Docker 節點是遠遠不夠的,搭建 Docker 集群勢在必行。然而,面對 Kubernetes, Mesos 以及 Swarm 等眾多容器集群系統,我們該如何選擇呢?它

Docker 三劍客Docker Swarm

ons type src cati word rpm man mtp break Docker Swarm 介紹創建Docker Swarm集群1、使用docker machine ssh連接到想要成為manager node的那臺docker宿主機上。$ docker-m

docker——三劍客Docker Machine

Docker Machine是Docker官方三劍客專案之一,負責使用Docker的第一步,在多種平臺上快速安裝Docker環境。它支援多種平臺,讓使用者在很短時間內搭建一套Docker主機叢集。Machine專案是Docker官方的開源專案,負責實現對Docker主機本身進行管理。Machine專案主要由G

Docker(五):Docker 三劍客 Docker Machine

Docker Machine 介紹 Docker Machine 是 Docker 官方編排(Orchestration)專案之一,負責在多種平臺上快速安裝 Docker 環境。 Docker Machine 是一個工具,它允許你在虛擬宿主機上安裝 Docker Engine ,並使用 docker-mac

Docker 三劍客 Docker Swarm(基於 overlay 組網通訊)

這一篇主要是對 Docker Swarm 的完善,增加基於 overlay 組網通訊,以便 Docker 容器可以跨主機訪問。 不同主機間的容器之間通訊方式,大概有三種: 使用埠對映:直接把容器的服務埠對映到主機上,主機直接通過映射出來的埠通訊。 把容器放到主機所在的網段:修改 docker 的 ip 分

Docker 三劍客 Docker Swarm

閱讀目錄: Docker Machine 建立 Docker 主機 Docker Swarm 配置叢集節點 Docker Service 部署單個叢集服務 Docker Stack 部署多個叢集服務,以及 GUI 管理頁面 docker-machine、docker swarm、docker node、d

docker三劍客之一docker compose

http 定義 mpat com dir 服務 stopped start 包括 compose有兩個重要的概念: 服務(service):一個應用的容器,實際上可以包括若幹運行相同鏡像的容器實例 項目(project):由一組關聯的應用容器組成的一個完整業務單元,在d

Docker $ Docker 三劍客Docker-Compose

一.Docker-Compose 簡介 簡介 1.Docker官方三劍客專案之一。 2.負責快速部署分散式應用。 3.定義和執行多個Docker容器應用。 4.微服務一般有多個例項,為了提高效率,使用Compose管理容器,無需每個微服務都要手動啟停。 功能

Docker $ Docker三劍客Docker-Compose

一.Docker-Compose 簡介 簡介 1.Docker官方三劍客專案之一。 2.負責快速部署分散式應用。 3.定義和執行多個Docker容器應用。 功能 1.有時候,我們的一個專案由多個服

Docker學習docker-compose

img 查看 直接 uname chm 存在 copy vol 最新 docker-compose 安裝 1.Mac/Windows: 安裝docker的時候附帶安裝了。 2.Linux: curl https://github.com/docker/compose Lin

Docker學習Docker容器基本使用

rest 刪除 圖片 -c 容器 run bcd user git Docker學習之Docker容器基本使用 新建容器並啟動 命令格式:docker run --options repository:tag 後臺運行 命令格式:-d 已存在的容器相關操作 啟動:docke

docker 系列 docker安裝

fss color 目前 ram 依賴包 san attribute -i 後臺服務 Docker支持以下的CentOS版本 CentOS 7 (64-bit) CentOS 6.5 (64-bit) 或更高的版本 前提條件 目前,CentOS 僅發行版本中的內核支持

Docker入門docker的安裝

Docker初體驗 Docker 簡介 Docker有兩個版本: 社群版(CE) 企業版(EE) Docker Community Edition(CE)非常適合希望開始使用Docker並嘗試使用基於容器的應用程式的個人開發人員和小型團隊。 Docker企業版(EE)專為企業