docker-compose
做爲dokcer
的官方編排工具,它可讓用戶經過編寫一個簡單的模板文件,快速地建立和管理基於docker
容器的應用集羣。實現對docker
容器集羣的快速編排。咱們知道Dockerfile
模板文件,可讓用戶很方便地定義一個單獨的應用容器。然而在平常工做中,常常會遇到須要多個容器相互配合來完成某項任務的狀況。例如要實現一個web項目,除了web
服務器容器自己,每每還須要加上後端的數據庫服務容器,甚至還包括負載均衡容器等。
而Compose正好能夠知足這樣的需求,它容許用戶經過一個單獨的docker-compose.yml
模板文件(YAML格式
)來定義一組相關聯的應用容器做爲一個項目(project
)
Compose中有2個重要的概念:
(1)服務(service):一個應用的容器,實際上能夠包含若干運行相同鏡像的容器實例。
(2)項目(project):由一組關聯的應用容器組成的一個完成業務單元,在docker-compose.yml文件中定義。python
Compose
項目是用Python
語言編寫的,因此compose
能夠經過python
的pip
工具進行安裝。安裝過程以下:mysql
[root@localhost ~]# yum install -y python-pip [root@localhost ~]# pip install -U docker-compose [root@localhost ~]# docker-compose version docker-compose version 1.21.0, build 5920eb0 docker-py version: 3.2.1 CPython version: 2.7.5 OpenSSL version: OpenSSL 1.0.1e-fips 11 Feb 2013
對於Compose
來講,大部分命令的對象既能夠是項目自己,也能夠指定爲項目中的服務或容器。若是沒有特別說明,命令對象將是項目,這意味着項目中全部的服務都會受到命令的影響。docker-compose
命令的基本使用格式以下:nginx
Usage: docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...] docker-compose -h|--help Options: -f, --file FILE 指定使用的Compose模板文件,默認爲docker-compose.yml,可屢次指定; -p, --project-name NAME 指定項目名稱,默認將使用所在目錄名稱做爲項目名 ; --verbose 輸出更多調試信息; -v, --version 打印版本信息; Commands: build 構建項目中的服務容器 help 得到一個命令的幫助 images 列出全部鏡像 kill 經過發送SIGKILL信號來強制中止服務容器 logs 查看服務器容器的輸出 pause 暫停一個服務容器 port 打印某個容器的端口所映射的公共端口 ps 列出項目中目前的全部容器 pull 拉取服務依賴的鏡像 push 推送服務依賴的鏡像 restart 重啓項目中的服務 rm 刪除全部的服務器容器(中止狀態中的) run 在指定服務上執行一個命令 scale 設置指定服務運行的容器個數 start 啓動已經存在的服務容器 stop 中止已經處於運行狀態的容器,但不刪除它 top 展現運行的進程 unpause 恢復處於暫停狀態中的服務 up 自動完成包括構建鏡像、建立服務、啓動服務並關聯服務相關容器的一系列操做 version 打印docker-compose的版本信息
模板文件是使用Compose
的核心,設計的指令關鍵字也有不少,默認的模板文件名稱爲docker-compose.yml
,格式爲YAML
格式。舉例:web
version: "2" service: webapp: image: examplses/web ports: - "80:80" volumes: - "/data"
注意,每一個服務都必須經過image
指定鏡像或build
命令(須要Dockerfile
)等來自動構建生成鏡像。若是使用build
指令,在Dockerfile
中設置的選項(例如:CMD、EXPOSE、VOLUME、ENV
等)將會自動被獲取,無需在docker-compose.yml
中再次設置。如下爲模板的主要指令和功能:redis
指定Dockerfile
所在文件夾的路徑(能夠是絕對路勁,或相對docker-compose.yml
文件的路徑。)Compose
將會利用它自動構建這個鏡像,而後使用這個鏡像:sql
build: /path/to/build/dir
指定容器的內核能力(capacity
)分配。例如,讓容器擁有全部能力能夠指定爲:docker
cap_add:
- ALL
去掉NET_ADMIN
能力能夠指定爲:數據庫
cap_drop:
- NET_ADMIN
覆蓋容器啓動後默認執行的命令:json
command: echo "hello world"
指定父cgroup組,意味着將繼承該組的資源限制,例如,建立了一個cgroup
組爲cgroups_1
:後端
cgroup_parent: cgroups_1
指定容器名稱。默認將會使用「項目名稱_服務名稱_序號」這樣的格式。例如:
container_name: docker-web-container
指定容器名稱後,該服務將沒法進行擴展,由於Docker不容許多個容器具備相同的名稱。
指定設備映射關係,例如:
devices: - "/dev/ttyUSB1:/dev/ttyUSB0"
自定義DNS服務器。能夠是一個值,也能夠是一個列表,例如:
dns: 8.8.8.8 dns: - 8.8.8.8 - 114.114.114.114
配置DNS搜索域。能夠是一個值,也能夠是一個列表,例如:
dns_search: example.com dns_search: - domain1.example.com - domain2.example.com
若是須要,指定額外的編譯鏡像的Dockerfile文件,能夠經過該指令來指定,例如:
該指令不能和image一塊兒使用,不然Compose不知道根據哪一個指令來生成最終的服務鏡像。
dockerfile: Dockerfile-alternate
從文件中獲取環境變量,能夠爲單獨的文件路徑或列表。
若是經過docker-compose -f FILE的方式來指定Compose模板文件,則env_file中變量的路徑會基於模板文件路徑,若是有變量名稱和environment指令衝突,則按照慣例,之後者爲準:
env_file: .env env_file: - ./common.env - ./apps/web.env - ./opt/secrets.env 環境變量文件中每一行都必須符合格式,支持#開頭的註釋行:
設置環境變量,可使用數組或字典兩種格式。只給定名稱的變量會自動獲取運行Compose主機上對應變量的值,能夠用來防止泄露沒必要要的數據。例如:
environment: RACK_ENV: development SESSION_SECRET 或者: environment: - RACK_ENV=development - SESSION_SECRET
暴露端口,但不映射到宿主機,只容許能被連接的服務訪問。僅能夠指定內部端口爲參數,以下所示:
expose: - "3000" - "8000"
基於其餘模板文件進行擴展。例如咱們已經有了一個webapp服務,定義一個基礎模板文件爲common.yml,以下所示:
# common.yml webapp: build: ./webapp environment: - DEBUG=false - SEND_EMAILS=false
再編寫一個新的development.yml文件,使用common.yml中的webapp服務進行擴展:
#development.yml web: extends: file: common.yml service: webapp ports: - "8000:8000" links: - db environment: - DEBUG=true db: image: postgres
連接到docker-compose.yml外部的容器,甚至能夠是非Compose管理的外部容器。參數格式和links相似
external_links: - redis_1 - project_db_1:mysql - project_db_1:postgresql
相似於Docker中的–add-host參數,指定額外的host名稱映射信息,例如:
extra_hosts: - "googledns:8.8.8.8" - "dockerhub:52.1.157.61" 會在啓動後的服務容器中/etc/hosts文件中添加如下2個條目: 8.8.8.8 googledns 52.1.157.61 dockerhub
指定爲鏡像名稱或鏡像ID,若是鏡像在本地不存在,Compose將會嘗試拉取這個鏡像。
image: centos
image: nginx
爲容器添加Docker元數據(metadata)信息。例如,能夠爲容器添加輔助說明信息:
labels: com.startupteam.description: "webapp for a startup team" com.startupteam.department: "devops department" com,startupteam.release: "rc3 for v1.0"
連接到其餘服務中的容器。使用服務名稱(同時做爲別名),或者」服務名稱:服務別名」(如SERVICE:ALIAS),這樣的格式均可以,例如:
links: - db - db:database - redis 使用的別名會將自動在服務容器中的/etc/hosts裏建立。例如: 172.17.2.186 db 172.17.2.186 database 172.17.2.187 redis 所鏈接容器中相應的環境變量也將建立
相似於Docker中的–log-driver參數,指定日誌驅動類型。目前支持三種日誌驅動類型:
log_driver: "json-file" log_driver: "syslog" log_driver: "none"
日誌驅動的相關參數。例如:
log_driver: "syslog" log_opt: syslog-address: "tcp://192.168.0.42:123"
設置網絡模式。參數相似於docker client的–net參數
net: "bridge" net: "none" net: "container:[name or id]" net: "host"
跟主機系統共享進程命名空間。打開該選項的容器之間,以及容器和宿主機系統之間能夠經過進程ID來相互訪問和操做:
pid: "host"
暴露端口信息。使用」宿主:容器「的格式,或者僅僅指定容器的端口(宿主機會隨機選擇端口):
ports: - "3000" - "8000:8000" - "49100:22" - "127.0.0.1:8081:8081" 當使用"HOST:CONTAINER"格式來映射端口時,若是你使用的容器端口小於60而且沒有放到引號裏,可能會獲得錯誤結果,由於YAML會自動解析xx:yy這種數字格式爲60進制。爲了不這種問題的出現,建議數字串都用引號包括起來的字符串格式。
指定容器模板標籤(label)機制的默認屬性(用戶、角色、類型、級別等)。例如,配置標籤的用戶名和角色名:
security_opt: - label:user:USER - label:role:ROLE
指定容器的ulimits限制值,例如,指定最大進程數爲65535,指定文件句柄數位20000(軟限制,應用能夠隨時修改,不能超過硬限制,只能root用戶提升)。
ulimits: nproc:65535 nofile: soft:20000 hard:40000
數據卷所掛載的路徑設置。能夠設置宿主機路徑(HOST:CONTAINER)或加上訪問模式(HOST:CONTAINER:ro)。該指令中路徑支持相對路徑。例如:
volumes: - /var/lib/mysql - cache/:/tmp/cache - ~/configs:/etc/configs/:ro
較新版本的Docker支持數據卷的插件驅動。用戶能夠先使用第三方驅動建立一個數據卷,而後使用名稱來訪問它。此時,能夠經過volumes_driver來指定驅動:
volume_driver: mydriver
從另外一個服務或容器掛載它的數據卷:
volumes_from: - service_name - container_name