1、docker-compose的簡介
docker-compose
作為dokcer
的官方編排工具,它可以讓用戶通過編寫一個簡單的模板文件,快速地創建和管理基於docker
容器的應用集群。實現對docker
容器集群的快速編排。我們知道Dockerfile
模板文件,可以讓用戶很方便地定義一個單獨的應用容器。然而在日常工作中,經常會遇到需要多個容器相互配合來完成某項任務的情況。例如要實現一個web項目,除了web
服務器容器本身,往往還需要加上后端的數據庫服務容器,甚至還包括負載均衡容器等。
而Compose正好可以滿足這樣的需求,它允許用戶通過一個單獨的docker-compose.yml
模板文件(YAML格式
)來定義一組相關聯的應用容器作為一個項目(project
)
Compose中有2個重要的概念:
(1)服務(service):一個應用的容器,實際上可以包含若干運行相同鏡像的容器實例。
(2)項目(project):由一組關聯的應用容器組成的一個完成業務單元,在docker-compose.yml文件中定義。
2、docker-compose安裝
Compose
項目是用Python
語言編寫的,所以compose
可以通過python
的pip
工具進行安裝。安裝過程如下:
[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
3、Compose命令
對於Compose
來說,大部分命令的對象既可以是項目本身,也可以指定為項目中的服務或容器。如果沒有特別說明,命令對象將是項目,這意味着項目中所有的服務都會受到命令的影響。docker-compose
命令的基本使用格式如下:
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的版本信息
4、Compose模板文件
模板文件是使用Compose
的核心,設計的指令關鍵字也有很多,默認的模板文件名稱為docker-compose.yml
,格式為YAML
格式。舉例:
version: "2" service: webapp: image: examplses/web ports: - "80:80" volumes: - "/data"
注意,每個服務都必須通過image
指定鏡像或build
命令(需要Dockerfile
)等來自動構建生成鏡像。如果使用build
指令,在Dockerfile
中設置的選項(例如:CMD、EXPOSE、VOLUME、ENV
等)將會自動被獲取,無需在docker-compose.yml
中再次設置。以下為模板的主要指令和功能:
(1)build指令
指定Dockerfile
所在文件夾的路徑(可以是絕對路勁,或相對docker-compose.yml
文件的路徑。)Compose
將會利用它自動構建這個鏡像,然后使用這個鏡像:
build: /path/to/build/dir
(2)cap_add,cap_drop
指定容器的內核能力(capacity
)分配。例如,讓容器擁有所有能力可以指定為:
cap_add:
- ALL
去掉NET_ADMIN
能力可以指定為:
cap_drop:
- NET_ADMIN
(3)command
覆蓋容器啟動后默認執行的命令:
command: echo "hello world"
(4)cgroup_parent
指定父cgroup組,意味着將繼承該組的資源限制,例如,創建了一個cgroup
組為cgroups_1
:
cgroup_parent: cgroups_1
(5)container_name
指定容器名稱。默認將會使用“項目名稱_服務名稱_序號”這樣的格式。例如:
container_name: docker-web-container
指定容器名稱后,該服務將無法進行擴展,因為Docker不允許多個容器具有相同的名稱。
(6)devices
指定設備映射關系,例如:
devices: - "/dev/ttyUSB1:/dev/ttyUSB0"
(7)dns
自定義DNS服務器。可以是一個值,也可以是一個列表,例如:
dns: 8.8.8.8 dns: - 8.8.8.8 - 114.114.114.114
(8)dns_search
配置DNS搜索域。可以是一個值,也可以是一個列表,例如:
dns_search: example.com dns_search: - domain1.example.com - domain2.example.com
(9)dockerfile
如果需要,指定額外的編譯鏡像的Dockerfile文件,可以通過該指令來指定,例如:
該指令不能和image一起使用,否則Compose不知道根據哪個指令來生成最終的服務鏡像。
dockerfile: Dockerfile-alternate
(10)env_file
從文件中獲取環境變量,可以為單獨的文件路徑或列表。
如果通過docker-compose -f FILE的方式來指定Compose模板文件,則env_file中變量的路徑會基於模板文件路徑,如果有變量名稱和environment指令沖突,則按照慣例,以后者為准:
env_file: .env env_file: - ./common.env - ./apps/web.env - ./opt/secrets.env 環境變量文件中每一行都必須符合格式,支持#開頭的注釋行:
(11)environment
設置環境變量,可以使用數組或字典兩種格式。只給定名稱的變量會自動獲取運行Compose主機上對應變量的值,可以用來防止泄露不必要的數據。例如:
environment: RACK_ENV: development SESSION_SECRET 或者: environment: - RACK_ENV=development - SESSION_SECRET
(12)expose
暴露端口,但不映射到宿主機,只允許能被鏈接的服務訪問。僅可以指定內部端口為參數,如下所示:
expose: - "3000" - "8000"
(13)extends
基於其他模板文件進行擴展。例如我們已經有了一個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
(14)external_links
鏈接到docker-compose.yml外部的容器,甚至可以是非Compose管理的外部容器。參數格式和links類似
external_links: - redis_1 - project_db_1:mysql - project_db_1:postgresql
(15)extra_hosts
類似於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
(16)image
指定為鏡像名稱或鏡像ID,如果鏡像在本地不存在,Compose將會嘗試拉取這個鏡像。
image: centos
image: nginx
(17)labels
為容器添加Docker元數據(metadata)信息。例如,可以為容器添加輔助說明信息:
labels: com.startupteam.description: "webapp for a startup team" com.startupteam.department: "devops department" com,startupteam.release: "rc3 for v1.0"
(18)links
鏈接到其他服務中的容器。使用服務名稱(同時作為別名),或者”服務名稱:服務別名”(如SERVICE:ALIAS),這樣的格式都可以,例如:
links: - db - db:database - redis 使用的別名會將自動在服務容器中的/etc/hosts里創建。例如: 172.17.2.186 db 172.17.2.186 database 172.17.2.187 redis 所連接容器中相應的環境變量也將創建
(19)log_driver
類似於Docker中的–log-driver參數,指定日志驅動類型。目前支持三種日志驅動類型:
log_driver: "json-file" log_driver: "syslog" log_driver: "none"
(20)log_opt
日志驅動的相關參數。例如:
log_driver: "syslog" log_opt: syslog-address: "tcp://192.168.0.42:123"
(21)net
設置網絡模式。參數類似於docker client的–net參數
net: "bridge" net: "none" net: "container:[name or id]" net: "host"
(22)pid
跟主機系統共享進程命名空間。打開該選項的容器之間,以及容器和宿主機系統之間可以通過進程ID來相互訪問和操作:
pid: "host"
(23)ports
暴露端口信息。使用”宿主:容器“的格式,或者僅僅指定容器的端口(宿主機會隨機選擇端口):
ports: - "3000" - "8000:8000" - "49100:22" - "127.0.0.1:8081:8081" 當使用"HOST:CONTAINER"格式來映射端口時,如果你使用的容器端口小於60並且沒有放到引號里,可能會得到錯誤結果,因為YAML會自動解析xx:yy這種數字格式為60進制。為了避免這種問題的出現,建議數字串都用引號包括起來的字符串格式。
(24)security_opt
指定容器模板標簽(label)機制的默認屬性(用戶、角色、類型、級別等)。例如,配置標簽的用戶名和角色名:
security_opt: - label:user:USER - label:role:ROLE
(25)ulimits
指定容器的ulimits限制值,例如,指定最大進程數為65535,指定文件句柄數位20000(軟限制,應用可以隨時修改,不能超過硬限制,只能root用戶提高)。
ulimits: nproc:65535 nofile: soft:20000 hard:40000
(26)volumes
數據卷所掛載的路徑設置。可以設置宿主機路徑(HOST:CONTAINER)或加上訪問模式(HOST:CONTAINER:ro)。該指令中路徑支持相對路徑。例如:
volumes: - /var/lib/mysql - cache/:/tmp/cache - ~/configs:/etc/configs/:ro
(27)volumes_driver
較新版本的Docker支持數據卷的插件驅動。用戶可以先使用第三方驅動創建一個數據卷,然后使用名稱來訪問它。此時,可以通過volumes_driver來指定驅動:
volume_driver: mydriver
(28)volumes_from
從另一個服務或容器掛載它的數據卷:
volumes_from: - service_name - container_name