Compose簡介
Compose項目是Docker官方的開源項目,負責實作對Docker容器叢集的快速編排。其代碼目前在
https://github.com/docker/compose上開源。
Compose定位是定義和運作多個Docker容器的應用,其前身是開源項目Fig。
通過前面内容的介紹,我們知道使用一個Dockerfile模闆檔案,可以讓使用者很友善的定義一個單獨的應用容器。然而,在日常工作中,經常會碰到需要多個容器互相配合來完成某任務的情況。例如要實作一個Web項目,除了Web服務容器本身,往往還需要加上後端的資料庫服務容器,甚至還包括負載均衡容器等。
Compose恰好滿足了這樣的需求。它允許使用者通過一個單獨的docker-compose.yml模闆檔案來定義一組相關聯的應用容器為一個項目(project)。
Compose中有兩個重要的概念:
- 服務(service):一個應用的容器,實際上可以包括若幹運作相同鏡像的容器執行個體。
- 項目(project):由一組關聯的應用容器組成的一個完整業務單元。
Compose的預設管理對象是項目,通過子指令對項目中的一組容器進行便捷地生命周期管理。
Compose項目由Python編寫,實作上調用了Docker服務提供的API來對容器進行管理。
安裝和解除安裝
Compose支援Linux、macOS、Windows10三大平台。
Compose可以通過Python的包管理工具pip進行安裝,也可以直接下載下傳編譯好的二進制檔案使用,甚至能夠直接在Docker容器中運作。
Docker for Mac、Docker for Windows自帶docker-compose二進制檔案,安裝Docker之後可以直接使用。
docker-compose --version
Linux系統需要單獨使用二進制或者pip方式進行安裝。
Linux安裝docker-compose
二進制包
在Linux上的安裝十分簡單,從官方GitHub Release處直接下載下傳編譯好的二進制檔案即可。例如,在Linux64位系統上直接下載下傳對應的二進制包。
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose #賦予可執行權限

PIP安裝
如果您計算機的架構是ARM(例如,樹莓派),建議使用pip安裝。
sudo pip install -U docker-compose
使用
場景:最常見的項目是web網站,一般的web網站都會依賴第三方提供的服務(比如:DB和cache),我們拿dubbo-admin進行講解(dubbo-admin依賴zookeeper)。
Compose建構dubbo-admin服務
從github上擷取dubbo-admin的master分支源碼
git clone -b master https://github.com/apache/incubator-dubbo-ops.git
修改admin中的application配置,把zookeeper位址改為zookeeper://zookeeper:2181
使用maven進行編譯打包
mvn clean package -Dmaven.test.skip=true
在dubbo-admin目錄下編寫Dockerfile檔案,内容為
# FROM,表示使用JDK8環境為基礎鏡像,如果鏡像不是本地會從DockerHub進行下載下傳
FROM openjdk:8-jdk-alpine
# 作者
MAINTAINER Simon<[email protected]>
VOLUME /tmp
# ADD,拷貝檔案并且重命名
ADD ./target/dubbo-admin-0.0.1-SNAPSHOT.jar app.jar
# ENTRYPOINT,為了縮短Tomcat啟動時間,添加java.security.egd的系統屬性指向/dev/urandom作為ENTRYPOINT
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
使用docker build -t dubbo-admin:1.0 .指令進行建構。
在項目根目錄下編寫docker-compose.yml檔案,這個是Compose使用的主模闆檔案。
version: '3.4'
services:
zk_server:
image: zookeeper:3.4
ports:
- 2181:2181
dubbo-admin:
image: dubbo-admin:1.0
links:
- zk_server:zookeeper
depends_on:
- zk_server
ports:
- 7001:7001
在docker-compose.yml檔案所在目錄執行:
docker-compose up
在浏覽器中通路
http://伺服器ip:7001 進行驗證,使用者名密碼為:root/root guest/guest
Compose指令說明
指令對象與格式
執行docker-compose [COMMAND] --help或者docker-compose help [COMMAND]可以檢視具體某個指令的使用格式。
docker-compose指令的基本的使用格式是:
docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
指令選項
- -f,--file FILE指定模闆檔案,預設為docker-compose.yml,可以多次指定。
- -p,--project-name NAME指定項目名稱,預設将使用所在目錄名稱作為項目名。
- --x-networking使用Docker的可拔插網絡後端特性
- --x-network-driver DRIVER指定網絡後端的驅動,預設為bridge
- --verbose輸出更多調試資訊。
- -v,--version列印版本并退出。
build
格式為docker-compose build [options] [SERVICE...]。
建構(重新建構)項目中的服務容器。
可以随時在項目目錄下運作docker-compose build來重新建構服務。
選項包括:
* --force-rm 删除建構過程中的臨時容器。
* --no-cache 建構鏡像過程中不使用cache(将加長建構過程)。
* --pull 始終嘗試通過pull來擷取更新版本的鏡像。
logs
格式為docker-compose logs [options] [SERVICE...]。
檢視服務容器的輸出。預設情況下,docker-compose将對不同的服務輸出使用不同的顔色來區分。可以通過--no-color來關閉顔色。
port
格式為docker-compose port [options] SERVICE PRIVATE_PORT。
列印某個容器端口所映射的公共端口。
選項:
--protocol=proto指定端口協定,tcp(預設值)或者udp。
--index=index如果同一服務存在多個容器,指定指令對象容器的序号(預設為1)。
ps
格式為docker-compose ps [options] [SERVICE...]
列出項目中目前的所有容器。
選項:
-q隻列印容器的ID資訊。
pull
格式為docker-compose pull [options] [SERVICE...]。
拉取服務依賴的鏡像。
選項:
--ignore-pull-failures忽略拉取鏡像過程中的錯誤。
restart
格式為docker-compose restart [options] [SERVICE...]
重新開機項目中的服務。
選項:
-t,--timeout TIMEOUT指定重新開機前停止容器的逾時(預設為10秒)。
rm
格式為docker-compose rm [options] [SERVICE...]
删除所有(停止狀态的)服務容器。推薦先執行docker-compose stop指令來停止容器。
選項:
-f,--force強制直接删除,包括非停止狀态的容器。一般盡量不要使用該選項。
-v删除容器所挂載的資料卷。
run
格式為docker-compose run[options] [-p PORT...][-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]
在指定服務上執行一個指令。例如:
docker-compose run ubuntu ping docker.com
scale
格式為docker-compose scal [options] [SERVICE=NUM...]
設定指定服務運作的容器個數。例如:
docker-compose scale web=3 db=2
将啟動3個容器運作web服務,2個容器運作db服務。
up
該指令十分強大,它将嘗試自動完成包括建構鏡像,(重新)建立服務,啟動服務,并關聯服務相關容器的一系列操作。連結的服務都将會被自動啟動,除非已經處于運作狀态。
選項:
-d 在背景運作服務容器。
--no-color 不使用顔色來區分不同的服務的控制台輸出。
--no-deps 不啟動服務所連結的容器。
--force-recreate強制重新建立容器,不能與--no-recreate同時使用。
--no-recreate如果容器已經存在了,則不重新建立,不能與--force-recreate同時使用。
--no-build 不自動建構缺失的服務鏡像。
-t,--timeout TIMEOUT停止容器時候的逾時(預設為10秒)。
其它指令如下:
指令 | 說明 |
---|---|
version | 格式為docker-compose version,列印版本資訊 |
config | 驗證Compose格式是否正确,若正确則顯示配置,若格式錯誤顯示錯誤原因。 |
exec | 進入指定的容器 |
images | 列出Compose檔案中包含的鏡像 |
down | 停止up指令所啟動的容器,并移除網絡。 |
help | 獲得一個指令的幫助 |
kill | 通過發送SIGKILL信号來強制停止服務容器 |
pause | 格式為docker-compose pause [SERVICE...],暫停一個服務容器。 |
push | 推送服務依賴的鏡像到Docker鏡像倉庫 |
start | 格式為docker-compose start[SERVICE...],啟動已經存在的服務容器。 |
stop | 停止已經存在的服務容器。 |
top | 檢視各個服務容器内運作的程序 |
unpause | 格式為docker-compose unpause [SERVICE...],恢複處于暫停狀态中的服務。 |
Compose模闆檔案
模闆檔案是使用Compose的核心,涉及到的指令關鍵字也比較多,大部分指令跟docker run 相關參數的含義都類似。
預設的模闆檔案名稱為docker-compose.yml,格式為YAML格式。
注意每個服務都必須通過image指令指定鏡像或build指令(需要Dockerfile)等來自動建構生成鏡像。
如果使用build指令,在Dockerfile中設定的選項(例如:CMD,EXPOSE,VOLUME,ENV等)将會自動被擷取,無需在docker-compose.yml中再次設定。下面介紹常用指令的用法。
version: '3'
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
指令Dockerfile所在檔案夾的路徑(可以是絕對路徑,或者相對docker-compose.yml檔案的路徑)。
Compose将會利用它自動建構這個鏡像,然後使用這個鏡像。
使用context指令指定Dockerfile所在檔案夾的路徑
使用dockerfile指令指定Dockerfile檔案名
使用arg指令指定建構鏡像時的變量
command
覆寫容器啟動後預設執行的指令。
command:echo "hello world"
Container_name
指令容器名稱。預設将會使用項目名稱_服務名稱_序号這樣的格式。
container_name:docker-web-container
configs
僅用于Swarm mode, 詳細内容後頁面swarm mode會進到。
deploy
僅用于Swarm mode,詳細内容後面swarm mode會進到。
devices
指定裝置映射關系。
devices:
- "/dev/ttyUSB1:/ttyUSB0"
depends_on
解決容器的依賴、啟動先後的問題。
dns
自定義DNS伺服器。可以是一個值,也可以是一個清單。
dns: 8.8.8.8
dns:
- 8.8.8.8
- 114.114.114.114
environment
設定環境變量。你可以使用數組或字典兩種格式。
隻給定名稱的變量會自動擷取運作Compose主機上對應變量的值,可以用來防止洩露不必要的資料。
environment:
RACK_ENV: development
SESSION_SECRET:
environment:
- RACK_ENV=development
- SESSION_SECRET
expose
顯露端口,但不映射到主控端,隻被連接配接的服務通路。僅可以指定内部端口為參數
expose:
- "3000"
- "8000"
extra_hosts
類似Docker中的--add-host參數,指定額外的host名稱映射資訊。
會在啟動後的服務容器中/etc/hosts檔案中添加一條條目。8.8.8.8 googledns
extra_hosts:
- "googledns:8.8.8.8"
healthcheck
通過指令容器是否健康運作。
healthcheck:
test:["CMD","curl","-f","http://localhost"]
interval:1m30s
timeout:10s
retries:3
image
指定為鏡像名稱或鏡像ID。如果鏡像在本地不存在,Compose将會嘗試拉去這個鏡像
image:session-web:latest
lables
為容器添加Docker中繼資料(metadata)資訊。例如可以為容器添加輔助說明資訊。
labels:
com.study.department:"devops department"
com.study.release:"v1.0"
links
連接配接到其他容器。注意:不推薦使用該指令。
應該使用docker network,建立網絡,而docker run --network來連接配接特定網絡。或者使用version:'2'和更高版本的docker-compose.yml直接定義自定義網絡并使用。
network_mode
設定網絡模式。使用和docker run的--network參數一樣的值。
network_mode:"bridge"
network_mode:"host"
network_mode:"none"
networks
配置容器連接配接的網絡。
version:"3"
services:
some-service:
networks:
- some-network
networks:
some-network:
ports
暴露端口資訊。使用宿主端口:容器端口(HOST:CONTAINER)格式,或者僅僅指定容器的端口(宿主将會随機選擇端口)都可以。
ports:
- "3000"
- "8000:8000"
volumes
資料卷所挂載路徑設定,可以設定主控端路徑,同時支援相關路徑。
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro
ulimits
指定容器的ulimits限制值。
例如,指定最大程序數為65535,指定檔案句柄數為20000(軟限制,應用可以随時修改,不能超過硬限制)和40000(系統硬限制,隻能root使用者提高)。
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
此外,還有包括domainname,entrypoint,hostname,ipc,mac_address,privileged,read_only,shm_size,restart,stdin_open,tty,user,working_dir等指令,基本跟docker run中對應參數的功能相同。
指定服務容器啟動後執行的入口檔案
entrypoint: /code/entrypoint.sh
指定容器中運作應用的使用者名
user:nginx
指定容器中工作目錄
working_dir: /code
指定容器中搜尋域名、主機名、mac位址等
domainname:your_website.com
hostname:test
mac_address:08-00-27-00-0C-0A
允許容器中運作一些特權指令
privileged:true
指定容器退出後的重新開機政策為始終重新開機。在生産環境中推薦配置為always或者unless-stopped
restart:alwarys
以隻讀模式挂載容器的root檔案系統,意味着不能對容器内容進行修改
read_only:true
打開标準輸入,可以接受外部輸入
stdin_open:true
模拟一個僞終端
tty:true
Compose模闆檔案支援動态讀取主機的系統環境變量和目前目錄下的.env檔案中的變量。例如,下面的Compose檔案将從運作它的環境中讀取變量${MONGO_VERSION}的值,并寫入執行的指令中。
version: "3"
services:
db:
image: "mongo:${MONGO_VERSION}"
如果執行MONGO_VERSION=3.2 docker-compose up則會啟動一個mongo:3.2鏡像的容器。若目前目錄存在.env檔案,執行docker-compose指令時将從該檔案中讀取變量。