Compose項目是Docker官方的開源項目,負責實現對Docker容器集羣的快速編排。其代碼目前在https://github.com/docker/compose 上開源。java
Compose定位是定義和運行多個Docker容器的應用,其前身是開源項目Fig。mysql
經過前面內容的介紹,咱們知道使用一個Dockerfile模板文件,可讓用戶很方便的定義一個單獨的應用容器。然而,在平常工做中,常常會碰到須要多個容器相互配合來完成某任務的狀況。例如要實現一個Web項目,除了Web服務容器自己,每每還須要加上後端的數據庫服務容器,甚至還包括負載均衡容器等。linux
Compose剛好知足了這樣的需求。它容許用戶經過一個單獨的docker-compose.yml模板文件來定義一組相關聯的應用容器爲一個項目(project)。nginx
Compose中有兩個重要的概念:git
Compose的默認管理對象是項目,經過子命令對項目中的一組容器進行便捷地生命週期管理。github
Compose項目由Python編寫,實現上調用了Docker服務提供的API來對容器進行管理。web
Compose支持Linux、macOS、Windows10三大平臺。sql
Compose能夠經過Python的包管理工具pip進行安裝,也能夠直接下載編譯好的二進制文件使用,甚至可以直接在Docker容器中運行。docker
Docker for Mac、Docker for Windows自帶docker-compose二進制文件,安裝Docker以後能夠直接使用。數據庫
docker-compose --version
Linux系統須要單獨使用二進制或者pip方式進行安裝。
在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 #賦予可執行權限
若是您計算機的架構是ARM(例如,樹莓派),建議使用pip安裝。
sudo pip install -U docker-compose
場景:最多見的項目是web網站,通常的web網站都會依賴第三方提供的服務(好比:DB和cache),咱們拿dubbo-admin進行講解(dubbo-admin依賴zookeeper)。
從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<xueyao.me@gmail.com> 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
執行docker-compose [COMMAND] --help或者docker-compose help [COMMAND]能夠查看具體某個命令的使用格式。
docker-compose命令的基本的使用格式是:
docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
命令選項
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的核心,涉及到的指令關鍵字也比較多,大部分指令跟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
build
指令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命令時將從該文件中讀取變量。