Docker Compose 起源
使用 Docker 的時候,定義 Dockerfile 文件,然后使用docker build、docker run等命令操作容器。然而微服務架構的應用系統(tǒng)一般包含若干個微服務,每個微服務一般都會部署多個實例,如果每個微服務都要手動啟停,那么效率之低,維護量之大可想而知
使用 Docker Compose 可以輕松、高效的管理容器,它是一個用于定義和運行多容器 Docker 的應用程序工具
Docker Compose 簡介
Docker Compose是一個用來定義和運行復雜應用的Docker工具。一個使用Docker容器的應用,通常由多個容器組成。使用Docker Compose不再需要使用shell腳本來啟動容器。
Compose 通過一個配置文件來管理多個Docker容器,在配置文件中,所有的容器通過services來定義,然后使用docker-compose腳本來啟動,停止和重啟應用,和應用中的服務以及所有依賴服務的容器,非常適合組合使用多個容器進行開發(fā)的場景。
Docker Compose 安裝
Github安裝
下載:
sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
添加執(zhí)行權限:
sudo chmod +x /usr/local/bin/docker-compose
檢查安裝是否成功:
docker-compose --version

pip 安裝
sudo pip install docker-compose
Compose 文件
Compose文件是一個定義服務,網(wǎng)絡和卷的YAML文件。 Compose文件的默認文件名為docker-compose.yml(.yml或.yaml擴展名均可)。
與docker運行一樣,默認情況下,Dockerfile中指定的選項(例如,CMD,EXPOSE,VOLUME,ENV)都被遵守,你不需要在docker-compose.yml中再次指定它們。
Docker Compse 文件示例
version: "3"
services:
redis:
image: redis:alpine
ports:
- "6379"
networks:
- frontend
deploy:
replicas: 2
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
db:
image: postgres:9.4
volumes:
- db-data:/var/lib/postgresql/data
networks:
- backend
deploy:
placement:
constraints: [node.role == manager]
vote:
image: dockersamples/examplevotingapp_vote:before
ports:
- 5000:80
networks:
- frontend
depends_on:
- redis
deploy:
replicas: 2
update_config:
parallelism: 2
restart_policy:
condition: on-failure
result:
image: dockersamples/examplevotingapp_result:before
ports:
- 5001:80
networks:
- backend
depends_on:
- db
deploy:
replicas: 1
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
worker:
image: dockersamples/examplevotingapp_worker
networks:
- frontend
- backend
deploy:
mode: replicated
replicas: 1
labels: [APP=VOTING]
restart_policy:
condition: on-failure
delay: 10s
max_attempts: 3
window: 120s
placement:
constraints: [node.role == manager]
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
stop_grace_period: 1m30s
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
networks:
frontend:
backend:
volumes:
db-data:
Docker Compose 語法
build
指定 Dockerfile 所在文件夾的路徑。 Compose 將會利用它自動構建這個鏡像,然后使用這個鏡像。
build: /path/to/build/dir
還可以攜帶args參數(shù)
version: '2'
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
webapp服務將會通過./dir目錄下的Dockerfile-alternate文件構建容器鏡像。
如果你同時指定image和build,則compose會通過build指定的目錄構建容器鏡像,而構建的鏡像名為image中指定的鏡像名和標簽。
image
指定啟動容器的鏡像,可以是鏡像倉庫/標簽或者鏡像id(或者id的前一部分)
image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd
如果鏡像不存在,Compose將嘗試從官方鏡像倉庫將其pull下來,如果你還指定了build,在這種情況下,它將使用指定的build選項構建它,并使用image指定的名字和標記對其進行標記。
container_name
指定一個自定義容器名稱,而不是生成的默認名稱。
container_name: my-web-container
由于Docker容器名稱必須是唯一的,因此如果指定了自定義名稱,則無法將服務擴展到多個容器。
volumes
卷掛載路徑設置??梢栽O置宿主機路徑 (HOST:CONTAINER) 或加上訪問模式 (HOST:CONTAINER:ro),掛載數(shù)據(jù)卷的默認權限是讀寫(rw),可以通過ro指定為只讀。
你可以在主機上掛載相對路徑,該路徑將相對于當前正在使用的Compose配置文件的目錄進行擴展。 相對路徑應始終以 . 或者..開始。
volumes:
# 只需指定一個路徑,讓引擎創(chuàng)建一個卷
- /var/lib/mysql
# 指定絕對路徑映射
- /opt/data:/var/lib/mysql
# 相對于當前compose文件的相對路徑
- ./cache:/tmp/cache
# 用戶家目錄相對路徑
- ~/configs:/etc/configs/:ro
# 命名卷
- datavolume:/var/lib/mysql
command
覆蓋容器啟動后默認執(zhí)行的命令。
command: bundle exec thin -p 3000
該命令也可以是一個類似于dockerfile的列表:
command: ["bundle", "exec", "thin", "-p", "3000"]
links
鏈接到另一個服務中的容器。 請指定服務名稱和鏈接別名(SERVICE:ALIAS),或者僅指定服務名稱。
web:
links:
- db
- db:database
- redis
在當前的web服務的容器中可以通過鏈接的db服務的別名database訪問db容器中的數(shù)據(jù)庫應用,如果沒有指定別名,則可直接使用服務名訪問。
鏈接不需要啟用服務進行通信 - 默認情況下,任何服務都可以以該服務的名稱到達任何其他服務。 (實際是通過設置/etc/hosts的域名解析,從而實現(xiàn)容器間的通信。故可以像在應用中使用localhost一樣使用服務的別名鏈接其他容器的服務,前提是多個服務容器在一個網(wǎng)絡中可路由聯(lián)通)
links也可以起到和depends_on相似的功能,即定義服務之間的依賴關系,從而確定服務啟動的順序。
external_links
鏈接到docker-compose.yml外部的容器,甚至并非 Compose 管理的容器。參數(shù)格式跟 links 類似。
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
expose
暴露端口,但不映射到宿主機,只被連接的服務訪問。
僅可以指定內部端口為參數(shù)
expose:
- "3000"
- "8000"
ports
暴露端口信息。
常用的簡單格式:使用宿主:容器 (HOST:CONTAINER)格式或者僅僅指定容器的端口(宿主將會隨機選擇端口)都可以。
restart
no是默認的重啟策略,在任何情況下都不會重啟容器。 指定為always時,容器總是重新啟動。 如果退出代碼指示出現(xiàn)故障錯誤,則on-failure將重新啟動容器。
restart: "no"
restart: always
restart: on-failure
restart: unless-stopped
environment
添加環(huán)境變量。 你可以使用數(shù)組或字典兩種形式。 任何布爾值:true,false,yes,no需要用引號括起來,以確保它們不被YML解析器轉換為True或False。
只給定名稱的變量會自動獲取它在 Compose 主機上的值,可以用來防止泄露不必要的數(shù)據(jù)。
environment:
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET:
environment:
- RACK_ENV=development
- SHOW=true
- SESSION_SECRET
pid
將PID模式設置為主機PID模式。 這就打開了容器與主機操作系統(tǒng)之間的共享PID地址空間。 使用此標志啟動的容器將能夠訪問和操作裸機的命名空間中的其他容器,反之亦然。即打開該選項的容器可以相互通過進程 ID 來訪問和操作。
pid: "host"
pid
將PID模式設置為主機PID模式。 這就打開了容器與主機操作系統(tǒng)之間的共享PID地址空間。 使用此標志啟動的容器將能夠訪問和操作裸機的命名空間中的其他容器,反之亦然。即打開該選項的容器可以相互通過進程 ID 來訪問和操作。
pid: "host"
net
設置網(wǎng)絡模式。使用和 docker client 的--net 參數(shù)一樣的值。
net: "bridge"
net: "none"
net: "container:[name or id]"
net: "host"
Docker Compose 命令
ps
列出所有運行容器
docker-compose ps
logs
查看服務日志輸出
docker-compose logs
port
打印綁定的公共端口,下面命令可以輸出eureka 服務 8761 端口所綁定的公共端口
docker-compose port eureka 8761
build
構建或者重新構建服務
docker-compose build
start
啟動指定服務已存在的容器
docker-compose start eureka
stop
停止已運行的服務的容器
docker-compose stop eureka
rm
刪除指定服務的容器
docker-compose rm eureka
up
構建、啟動容器
docker-compose up
kill
通過發(fā)送 SIGKILL 信號來停止指定服務的容器
docker-compose kill eureka
pull
下載服務鏡像
scale
設置指定服務運氣容器的個數(shù),以 service=num 形式指定
docker-compose scale user=3 movie=3
run
在一個服務上執(zhí)行一個命令
docker-compose run web bash