本篇介紹 docker 官方三劍客之一的 docker-compose。
注:環境為 CentOS7,docker 19.03。
docker-compose
docker-compose 的前身是開源的 docker 容器集群編排工具 Fig,2014年7月,Fig 被 Docker 收購並更名成為 docker-compose。
之前我們已經學習了關於 docker 的 dockerfile,使用它可以讓用戶快速生成一個需要的鏡像,進而生成容器,快速配置一個應用。但是雲計算的使用更多是面對龐大的用戶群體,這樣一來所發布的容器數量必然不少。而單機的 dockerfile 相比起來就相形見絀了。因此,像 Fig 這樣的工具就孕育而生了。如果說 dockerfile 重現一個容器,那 docker-componse 就是重現容器的配置和集群了。
在 docker 中,“編排”和“部署”這兩個詞是時常出現的,那么它們具體指什么呢?
- 編排(orchestration):它根據被部署的對象之間的耦合關系,以及被部署對象對環境的依賴,制定部署流程中各個動作的執行順序,部署過程中所需要的依賴文件和被部署文件的存儲位置和獲取方式,以及如何驗證部署成功。這些信息都會在編排工具中以指定的格式(比如配置文件或者特定的代碼)來要求運維人員定義並保存起來,從而保證這個流程能夠隨時在全新的環境中可靠有序地重現出來。
- 部署(deployment),它是指按照編排所指定地內容和流程,在目標機器上執行編排指定環境初始化,存放指定地依賴和文件,運行指定地部署動作,最終按照編排中地規則來確定部署成功。
總地來說,編排制定流程,部署執行流程,協同完成容器雲的創建。
安裝 docker-compose
dcoekr-componse 的安裝方式如下:
# curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# chomd +x /usr/local/bin/docker-compose
docker-compose 簡單實例
下面我們來用一個簡單實例來說明 docker-compose 的用法:
1.創建一個 docker-compose 的目錄
# mkdir composetest
# cd composetest
2.在目錄中創建 app.py 並添加以下代碼:
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)
3.在目錄下創建 python 代碼的依賴文件 requirements.txt 並添加依賴項:
redis
flask
4.創建 Dockerfile 文件
# 以 python:3.7-alpine 為基礎鏡像,創建鏡像
FROM python:3.7-alpine
# 設置工作目錄為 /code
WORKDIR /code
# 設置環境變量
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
# alpine 安裝軟件包
RUN apk add --no-cache gcc musl-dev linux-headers
# 從主機上復制 python 的依賴文件
COPY requirements.txt requirements.txt
# 安裝依賴
RUN pip install -r requirements.txt
# 復制 composetest 目錄中的所有文件到工作目錄中
COPY . .
# 運行 python 應用
CMD ["flask", "run"]
5.定義 docker-compose.yml 文件
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
6.從 docker-compose 構建並啟動應用
# docker-compose up
執行成功后,服務會啟動並綁定端口 5000。
docker-compose 模板語法
目前 docker-compose 模板已經更新到 v3 版本,支持眾多指令:
1.build
指定 Dockerfile 所在⽂件夾的路徑(可以是絕對路徑, 或者相對dockercompose.yml⽂件的路徑) 。 Compose將會利⽤它⾃動構建應⽤鏡像, 然后使⽤這個鏡像, 例如:
version: '3'
services:
app:
build: /path/to/build/dirbuild
指令還可以指定創建鏡像的上下⽂、 Dockerfile路徑、 標簽、 Shm⼤⼩、 參數和緩存來源等, 例如:
version: '3'
services:
app:
build:
context: /path/to/build/dir
dockerfile: Dockerfile-app
labels:
version: "2.0"
released: "true"
shm_size: '2gb'
args:
key: value
name: myApp
cache_from:
- myApp:1.0
2.cap_add, cap_drop
指定容器的內核能⼒(capacity) 分配。 例如, 讓容器擁有所有能⼒可以指定為:
cap_add:
- ALL
去掉NET_ADMIN能⼒可以指定為:
cap_drop:
- NET_ADMIN
3.command
覆蓋容器啟動后默認執⾏的命令, 可以為字符串格式或JSON數組格式。 例如:
command: echo "hello world"
或者:
command: ["bash", "-c", "echo", "hello world"]
4.configs
在Docker Swarm模式下, 可以通過configs來管理和訪問⾮敏感的配置信息。 ⽀持從⽂件讀取或外部讀取。 例如:
version: "3.3"
services:
app:
image: myApp:1.0
deploy:
replicas: 1
configs:
- file_config
- external_config
configs:
file_config:
file: ./config_file.cfg
external_config:
external: true
5.cgroup_parent
指定⽗cgroup組, 意味着將繼承該組的資源限制。 ⽬前不⽀持在Swarm模式中使⽤。 例如, 創建了⼀個cgroup組名稱為cgroups_1:
cgroup_parent: cgroups_1
6.container_name
指定容器名稱。 默認將會使⽤“項⽬名稱_服務名稱_序號”這樣的格式。 ⽬前不⽀持在Swarm模式中使⽤。 例如:
container_name: docker-web-container
注意, 指定容器名稱后, 該服務將⽆法進⾏擴展, 因為Docker不允許多個容器實例重名。
7.devices指定設備映射關系, 不⽀持Swarm模式。 例如:
devices:
- "/dev/ttyUSB1:/dev/ttyUSB0"
8.depends_on
指定多個服務之間的依賴關系。 啟動時, 會先啟動被依賴服務。 例
如, 可以指定依賴於db服務:
depends_on: db
9.dns
⾃定義DNS服務器。 可以是⼀個值, 也可以是⼀個列表。 例如:
dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
10.dns_search
配置DNS搜索域。 可以是⼀個值, 也可以是⼀個列表。 例如:
dns_search: example.com
dns_search:
- domain1.example.com
- domain2.example.com
11.dockerfile
如果需要, 指定額外的編譯鏡像的Dockefile⽂件, 可以通過該指令來指定。 例如:
dockerfile: Dockerfile-alternate
注意:該指令不能跟image同時使⽤, 否則Compose將不知道根據哪個指令來⽣成最終的服務鏡像。
12.entrypoint
覆蓋容器中默認的⼊⼜命令。 注意, 也會取消掉鏡像中指定的⼊⼜命令和默認啟動命令。 例如, 覆蓋為新的⼊⼜命令:
entrypoint: python app.py
13.env_file
從⽂件中獲取環境變量, 可以為單獨的⽂件路徑或列表。 如果通過 docker-compose-f FILE⽅式來指定Compose模板⽂件, 則env_file中變量的路徑會基於模板⽂件路徑。 如果有變量名稱與environment指令沖突, 則按照慣例, 以后者為准。 例如:
env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
環境變量⽂件中每⼀⾏必須符合格式, ⽀持#開頭的注釋⾏, 例如:
# common.env: Set development environment
PROG_ENV=development
14.environment
設置環境變量, 可以使⽤數組或字典兩種格式。 只給定名稱的變量會⾃動獲取運⾏Compose主機上對應變量的值, 可以⽤來防⽌泄露不必要的數據。 例如:
environment:
RACK_ENV: developmentSESSION_SECRET:
或者:
environment:
- RACK_ENV=development
- SESSION_SECRET
注意:如果變量名稱或者值中⽤到 true | false, yes | no 等表達布爾含義的詞匯, 最好放到引號⾥, 避免YAML⾃動解析某些內容為對應的布爾語義:http://yaml.org/type/bool.html中給出了這些特定詞匯, 包括
y|Y|yes|Yes|YES|n|N|no|No|NO
|true|True|TRUE|false|False|FALSE
|on|On|ON|off|Off|OFF
15.expose
暴露端口, 但不映射到宿主機, 只被連接的服務訪問。 僅可以指定內部端口為參數, 如下所⽰:
expose:
- "3000"
- "8000"
16.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
后者會⾃動繼承 common.yml 中的 webapp 服務及環境變量定義。 使⽤extends需要注意以下兩點:
- 要避免出現循環依賴, 例如A依賴B, B依賴C, C反過來依賴A的情況。
- extends不會繼承 links 和 volumes_from 中定義的容器和數據卷資源。⼀般情況下, 推薦在基礎模板中只定義⼀些可以共享的鏡像和環境變量, 在擴展模板中具體指定應⽤變量、 鏈接、 數據卷等信息。
17.external_links
鏈接到docker-compose.yml外部的容器, 甚⾄並⾮Compose管理的外部容器。 參數格式跟links類似。
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
18.extra_hosts
類似 Docker 中的 --add-host 參數, 指定額外的host名稱映射信息。例如:
extra_hosts:
- "googledns:8.8.8.8"
- "dockerhub:52.1.157.61"
會在啟動后的服務容器中 /etc/hosts ⽂件中添加如下兩條條⽬。
8.8.8.8 googledns
52.1.157.61 dockerhub
19.healthcheck
指定檢測應⽤健康狀態的機制, 包括檢測⽅法(test) 、 間隔(interval) 、 超時(timeout) 、 重試次數(retries) 、 啟動等待時間(start_period) 等。例如, 指定檢測⽅法為訪問8080端口, 間隔為30秒, 超時為15秒, 重試3次, 啟動后等待30秒再做檢查。
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080"]
interval: 30s
timeout: 15s
retries: 3
start_period: 30s
20.image
指定為鏡像名稱或鏡像ID。 如果鏡像在本地不存在, Compose 將會嘗試拉取這個鏡像。例如:
image: ubuntu
image: orchardup/postgresql
image: a4bc65fd
21.isolation
配置容器隔離的機制, 包括default、 process 和 hyperv。
22.labels為容器添加Docker元數據(metadata) 信息。 例如可以為容器添加輔助說明信息。
labels:
com.startupteam.description: "webapp for a startup team"
com.startupteam.department: "devops department"
com.startupteam.release: "rc3 for v1.0"
23.links
注意: 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
被鏈接容器中相應的環境變量也將被創建。
24.logging
跟⽇志相關的配置, 包括⼀系列⼦配置。logging.driver: 類似於 Docker 中的 --log-driver 參數, 指定⽇志驅動類型。 ⽬前⽀持三種⽇志驅動類型:
- driver: "json-file"
- driver: "syslog"
- driver: "none"logging.
options: ⽇志驅動的相關參數。 例如:
logging:
driver: "syslog"
options:
syslog-address: "tcp://192.168.0.42:123"
或:
logging:
driver: "json-file"
options:
max-size: "1000k"
max-file: "20"
25.network_mode
設置⽹絡模式。 使⽤和docker client的--net參數⼀樣的值。
network_mode: "none"
network_mode: "bridge"
network_mode: "host"
network_mode: "service:[service name]"
network_mode: "container:[name or id]"
26.networks
所加⼊的⽹絡。 需要在頂級的 networks 字段中定義具體的⽹絡信息。例如, 指定web服務的⽹絡為web_net, 並添加服務在⽹絡中別名為web_app。
services:
web:
networks:
web_net:
aliases: web_app
ipv4_address: 172.16.0.10
networks:
web_net:
driver: bridge
enable_ipv6: true
ipam:
driver: default
config:
subnet: 172.16.0.0/24
27.pid
跟主機系統共享進程命名空間。 打開該選項的容器之間, 以及容器和宿主機系統之間可以通過進程ID來相互訪問和操作。
pid: "host"
28.ports
暴露端口信息。使⽤宿主: 容器(HOST: CONTAINER) 格式, 或者僅僅指定容器的端口(宿主將會隨機選擇端口) 都可以。
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
或者:
ports:
- target: 80
published: 8080
protocol: tcp
mode: ingress
注意:當使⽤HOST: CONTAINER格式來映射端口時, 如果你使⽤的容器端口⼩於60並且沒放到引號⾥, 可能會得到錯誤結果, 因為YAML會⾃動解析 xx: yy 這種數字格式為60進制。 為避免出現這種問題, 建議數字串都采⽤引號包括起來的字符串格式。
29.secrets
配置應⽤的秘密數據。可以指定來源秘密、 掛載后名稱、 權限等。例如:
version: "3.1"
services:
web:
image: webapp:stable
deploy:
replicas: 2
secrets:
- source: web_secret
target: web_secret
uid: '103'
gid: '103'
mode: 0444
secrets:
web_secret:
file: ./web_secret.txt
30.security_opt
指定容器模板標簽(label) 機制的默認屬性(⽤戶、 ⾓⾊、 類型、 級別等) 。例如, 配置標簽的⽤戶名和⾓⾊名:
security_opt:
- label:user:USER
- label:role:ROLE
31.stop_grace_period
指定應⽤停⽌時, 容器的優雅停⽌期限。 過期后則通過SIGKILL強制退出。默認值為10s。
32.stop_signal
指定停⽌容器的信號, 默認為SIGTERM。
33.sysctls配置容器內的內核參數。 Swarm模式中不⽀持。例如, 指定連接數為4096和開啟TCP的syncookies:
sysctls:
net.core.somaxconn: 4096
net.ipv4.tcp_syncookies: 1
34.ulimits
指定容器的ulimits限制值。例如, 指定最⼤進程數為65535, 指定⽂件句柄數為20000(軟限制,應⽤可以隨時修改, 不能超過硬限制) 和40000(系統硬限制, 只能root⽤戶提⾼) 。
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
35.userns_mode
指定⽤戶命名空間模式。 Swarm模式中不⽀持。 例如, 使⽤主機上的⽤戶命名空間:
userns_mode: "host"
36.volumes
數據卷所掛載路徑設置。 可以設置宿主機路徑(HOST:CONTAINER) 或加上訪問模式(HOST: CONTAINER: ro) 。⽀持driver、 driver_opts、 external、 labels、 name等⼦配置。該指令中路徑⽀持相對路徑。 例如
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro
或者可以使⽤更詳細的語法格式:
volumes:
- type: volume
source: mydata
target: /data
volume:
nocopy: true
volumes:
mydata:
37.restart
指定重啟策略, 可以為no(不重啟) 、 always(總是) 、 onfailure(失敗時) 、 unless-stopped(除⾮停⽌) 。注意Swarm模式下要使⽤restart_policy。 在⽣產環境中推薦配置為always或者unless-stopped。例如, 配置除⾮停⽌:
restart: unless-stopped
38.deploy
指定部署和運⾏時的容器相關配置。 該命令只在Swarm模式下⽣效,且只⽀持docker stack deploy命令部署。例如:
version: '3'
services:
redis:
image: web:stable
deploy:
replicas: 3
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
deploy命令中包括 endpoint_mode、 labels、 mode、 placement、replicas、 resources、 restart_policy、 update_config等配置項。
(1) endpoint_mode
指定服務端點模式。 包括兩種類型:
- vip: Swarm分配⼀個前端的虛擬地址, 客戶端通過給地址訪問服務,⽽⽆須關⼼后端的應⽤容器個數;
- dnsrr: Swarm分配⼀個域名給服務, ⽤戶訪問域名時候回按照輪流順序返回容器地址。
例如:
version: '3'
services:
redis:
image: web:stable
deploy:
mode: replicated
replicas: 3
endpoint_mode: vip
(2) labels
指定服務的標簽。 注意標簽信息不會影響到服務內的容器。例如:
version: "3"
services:
web:
image: web:stable
deploy:
labels:
description: "This is a web application service."
(3) mode
定義容器副本模式, 可以為:global: 每個Swarm節點上只有⼀個該應⽤容器;replicated: 整個集群中存在指定份數的應⽤容器副本, 默認值。例如, 指定集群中web應⽤保持3個副本:
version: "3"
services:
web:
image: web:stable
deploy:
mode: replicated
replicas: 3
(4) placement
定義容器放置的限制(constraints) 和配置(preferences) 。 限制可以指定只有符合要求的節點上才能運⾏該應⽤容器; 配置可以指定容器的分配策略。 例如, 指定集群中web應⽤容器只存在於⾼安全的節點上, 並且在帶有zone標簽的節點上均勻分配。
version: '3'
services:
db:
image: web:stable
deploy:
placement:
constraints:
- node.labels.security==high
preferences:
- spread: node.labels.zone
(5) replicas
容器副本模式為默認的replicated時, 指定副本的個數。
(6) resources
指定使⽤資源的限制, 包括CPU、 內存資源等。 例如, 指定應⽤使⽤的CPU份額為10%~25%, 內存為200 MB到500 MB。
version: '3'
services:
redis:
image: web:stable
deploy:
resources:
limits:
cpus: '0.25'
memory: 500M
reservations:
cpus: '0.10'
memory: 200M
(7) restart_policy
指定容器重啟的策略。 例如, 指定重啟策略為失敗時重啟, 等待2s,重啟最多嘗試3次, 檢測狀態的等待時間為10s。
version: "3"
services:
redis:
image: web:stable
deploy:
restart_policy:
condition: on-failure
delay: 2s
max_attempts: 3
window: 10s
(8) update_config
有些時候需要對容器內容進⾏更新, 可以使⽤該配置指定升級的⾏為。 包括每次升級多少個容器(parallelism) 、 升級的延遲(delay) 、 升級失敗后的⾏動(failure_action) 、 檢測升級后狀態的等待時間(monitor) 、 升級后容忍的最⼤失敗⽐(max_failure_ratio) 、 升級順序(order) 等。 例如, 指定每次更新兩個容器、 更新等待10s、 先停⽌舊容器再升級。
version: "3.4"
services:
redis:
image: web:stable
deploy:
replicas: 2
update_config:
parallelism: 2
delay: 10s
order: stop-first
39.其他指令
此外, 還有包括domainname、 hostname、 ipc、 mac_address、privileged、 read_only、 shm_size、 stdin_open、 tty、 user、 working_dir等指令, 基本跟docker-run中對應參數的功能⼀致。 例如, 指定容器中⼯作⽬錄:
working_dir: /code
指定容器中搜索域名、 主機名、 mac地址等:
domainname: your_website.com
hostname: test
mac_address: 08-00-27-00-0C-0A
允許容器中運⾏⼀些特權命令:
privileged: true
40.讀取環境變量
從1.5.0版本開始, Compose模板⽂件⽀持動態讀取主機的系統環境變量。 例如, 下⾯的Compose⽂件將從運⾏它的環境中讀取變量${MONGO_VERSION}
的值(不指定時則采⽤默認值3.2) , 並寫⼊執⾏的指令中。
db:
image: "mongo:${MONGO_VERSION-3.2}"
如果直接執⾏docker-compose up則會啟動⼀個mongo: 3.2鏡像的容器; 如果執⾏MONGO_VERSION=2.8 docker-compose up 則會啟動⼀個mongo: 2.8鏡像的容器。
41.擴展特性
從3.4開始, Compose還⽀持⽤戶⾃定義的擴展字段。 利⽤YAML語法⾥的錨點引⽤功能來引⽤⾃定義字段內容。 例如:version: '3.4'
x-logging:
&default-logging
options:
max-size: '10m'
max-file: '10'
driver: json-file
services:
web:
image: webapp:stable
logging: *default-logging
docker-compose 命令
docker-compose 命令的格式為:docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
,命令支持以下選項:
- -f, --file FILE: 指定使⽤的Compose模板⽂件, 默認為dockercompose.yml, 可以多次指定;
- -p, --project-name NAME: 指定項⽬名稱, 默認將使⽤所在⽬錄名稱作為項⽬名;
- --verbose: 輸出更多調試信息;
- -v, --version: 打印版本並退出;
- -H, -host HOST: 指定所操作的Docker服務地址;
- -tls: 啟⽤TLS, 如果指定-tlsverify則默認開啟;
- -tlscacert CA_PATH: 信任的TLS CA的證書;
- -tlscert CLIENT_CERT_PATH: 客戶端使⽤的TLS證書;
- -tlskey TLS_KEY_PATH: TLS的私鑰⽂件路徑;
- -tlsverify: 使⽤TLS校驗連接對⽅;·-skip-hostname-check: 不使⽤TLS證書校驗對⽅的主機名;
- -project-directory PATH: 指定⼯作⽬錄, 默認為Compose⽂件所在路徑。
docker-compose 還支持以下子命令
1.build
格式為docker-compose build [options] [SERVICE...]
。構建(重新構建) 項⽬中的服務容器。服務容器⼀旦構建后, 將會帶上⼀個標記名, 例如對於Web項⽬中的⼀個db容器, 可能是web_db。可以隨時在項⽬⽬錄下運⾏docker-compose build來重新構建服務。選項包括:
- --force-rm: 強制刪除構建過程中的臨時容器;
- --no-cache: 構建鏡像過程中不使⽤cache(這將加長構建過程) ;
- --pull: 始終嘗試通過pull來獲取更新版本的鏡像;
- -m, -memory MEM: 指定創建服務所使⽤的內存限制;
- -build-arg key=val: 指定服務創建時的參數。
2.bundle
格式為docker-compose bundle [options]
。創建⼀個可分發(Distributed Application Bundle, DAB) 的配置包,包括整個服務棧的所有數據, 他⼈可以利⽤該⽂件啟動服務棧。⽀持選項包括:
- -push-images: ⾃動推送鏡像到倉庫;
- -o, -output PATH: 配置包的導出路徑。
3.config
格式為docker-compose config [options]
。校驗和查看Compose⽂件的配置信息。⽀持選項包括:
- -resolve-image-digests: 為鏡像添加對應的摘要信息;
- -q, -quiet: 只檢驗格式正確與否, 不輸出內容;
- --services: 打印出Compose中所有的服務信息;·-volumes: 打印出Compose中所有的掛載卷信息;
4.down
格式為docker-compose down [options]
。停⽌服務棧, 並刪除相關資源, 包括容器、 掛載卷、 ⽹絡、 創建鏡像等。默認情況下只清除所創建的容器和⽹絡資源。⽀持選項包括:
- --rmi type: 指定刪除鏡像的類型, 包括all(所有鏡像) , local(僅本地) ;
- -v, -volumes: 刪除掛載數據卷;
- --remove-orphans: 清除孤⼉容器, 即未在Compose服務中定義的容器;
- -t, -timeout TIMEOUT: 指定超時時間, 默認為10s。
5.events
格式為docker-compose events [options] [SERVICE...]
。實時監控容器的事件信息。⽀持選項包括 -json: 以Json對象流格式輸出事件信息。
6.exec
格式為docker-compose exec [options] [-e KEY=VAL...] SERVICECOMMAND [ARGS...]
。在⼀個運⾏中的容器內執⾏給定命令。⽀持選項包括:
- -d: 在后台運⾏命令;
- --privileged: 以特權⾓⾊運⾏命令;
- -u, -user USER: 以給定⽤戶⾝份運⾏命令;
- -T: 不分配TTY偽終端, 默認情況下會打開;
- --index=index: 當服務有多個容器實例時指定容器索引, 默認為第⼀個;
- -e, -env KEY=VAL: 設置環境變量。
7.help
獲得⼀個命令的幫助。
8.images
格式為docker-compose images [options] [SERVICE...]
。列出服務所創建的鏡像。⽀持選項為:
- --q: 僅顯⽰鏡像的ID。
9.kill
格式為docker-compose kill [options] [SERVICE...]
。通過發送SIGKILL信號來強制停⽌服務容器。⽀持通過-s參數來指定發送的信號, 例如通過如下指令發送SIGINT信號。
$ docker-compose kill -s SIGINT
10.logs
格式為docker-compose logs [options] [SERVICE...]
。查看服務容器的輸出。 默認情況下, docker-compose 將對不同的服務輸出使⽤不同的顏⾊來區分。 可以通過 --no-color 來關閉顏⾊。該命令在調試問題的時候⼗分有⽤。⽀持選項為:
- --no-color: 關閉彩⾊輸出;
- -f, -follow: 持續跟蹤輸出⽇志消息;
- --t, -timestamps: 顯⽰時間戳信息;
- --tail="all": 僅顯⽰指定⾏數的最新⽇志消息。
11.pause
格式為docker-compose pause [SERVICE...]
。暫停⼀個服務容器。
12.port
格式為docker-compose port [options] SERVICE PRIVATE_PORT
。打印某個容器端⼜所映射的公共端⼜。選項:
- --protocol=proto: 指定端⼜協議, tcp(默認值) 或者udp;
- --index=index: 如果同⼀服務存在多個容器, 指定命令對象容器的序號(默認為1) 。
13.ps
格式為docker-compose ps [options] [SERVICE...]
。列出項⽬中⽬前的所有容器。選項包括
- -q: 只打印容器的ID信息。
14.pull
格式為docker-compose pull [options] [SERVICE...]
。拉取服務依賴的鏡像。選項包括 --ignore-pull-failures: 忽略拉取鏡像過程中的錯誤。
15.push
格式為docker-compose push [options] [SERVICE...]
。推送服務創建的鏡像到鏡像倉庫。選項包括 --ignore-push-failures: 忽略推送鏡像過程中的錯誤。
16.restart
格式為docker-compose restart [options] [SERVICE...]
。重啟項⽬中的服務。選項包括
- -t, --timeout TIMEOUT: 指定重啟前停⽌容器的超時(默認為10秒) 。
17.rm
格式為docker-compose rm [options] [SERVICE...]
。刪除所有(停⽌狀態的) 服務容器。 推薦先執⾏docker-compose stop命令來停⽌容器。選項:
- -f, --force: 強制直接刪除, 包括⾮停⽌狀態的容器。 ⼀般盡量不要使⽤該選項。
- -v: 刪除容器所掛載的數據卷。
18.run
格式為docker-compose run [options] [-p PORT...] [-eKEY=VAL...] SERVICE [COMMAND] [ARGS...]
。在指定服務上執⾏⼀個命令。例如:
$ docker-compose run ubuntu ping docker.com
將會啟動⼀個ubuntu服務容器, 並執⾏ping docker.com命令。默認情況下, 如果存在關聯, 則所有關聯的服務將會⾃動被啟動, 除⾮這些服務已經在運⾏中。該命令類似啟動容器后運⾏指定的命令, 相關卷、 鏈接等等都將會按照配置⾃動創建。
兩個不同點:
- 給定命令將會覆蓋原有的⾃動運⾏命令;
- 會⾃動創建端口, 以避免沖突。如果不希望⾃動啟動關聯的容器, 可以使⽤--no-deps選項, 例如
$ docker-compose run --no-deps web python manage.py shell
將不會啟動web容器所關聯的其他容器。選項:
- -d: 后台運⾏容器;
- --name NAME: 為容器指定⼀個名字;·--entrypoint CMD: 覆蓋默認的容器啟動指令;
- -e KEY=VAL: 設置環境變量值, 可多次使⽤選項來設置多個環境變量;
- -u, --user="": 指定運⾏容器的⽤戶名或者uid;
- --no-deps: 不⾃動啟動關聯的服務容器;
- --rm: 運⾏命令后⾃動刪除容器, d模式下將忽略;
- -p, --publish=[]: 映射容器端⼜到本地主機;
- --service-ports: 配置服務端⼜並映射到本地主機;
- -T: 不分配偽tty, 意味着依賴tty的指令將⽆法運⾏。
19.scale
格式為docker-compose scale [options] [SERVICE=NUM...]
。設置指定服務運⾏的容器個數。通過service=num的參數來設置數量。 例如:
$ docker-compose scale web=3 db=2
將啟動3個容器運⾏web服務, 2個容器運⾏db服務。⼀般的, 當指定數⽬多於該服務當前實際運⾏容器, 將新創建並啟動容器; 反之, 將停⽌容器。選項包括-t, --timeout TIMEOUT: 停⽌容器時候的超時(默認為10秒) 。
20.start
格式為docker-compose start [SERVICE...]
。啟動已經存在的服務容器。
21.stop
格式為docker-compose stop [options] [SERVICE...]
。停⽌已經處於運⾏狀態的容器, 但不刪除它。 通過 docker-compose start 可以再次啟動這些容器。選項包括
- -t, --timeout TIMEOUT: 停⽌容器時候的超時(默認為10秒) 。
22.top
格式為docker-compose top [SERVICE...]
。顯⽰服務棧中正在運⾏的進程信息。
23.unpause
格式為docker-compose unpause [SERVICE...]
。恢復處於暫停狀態中的服務。
24.up
格式為docker-compose up [options] [SERVICE...]
。該命令⼗分強⼤, 它將嘗試⾃動完成包括構建鏡像, (重新) 創建服務, 啟動服務, 並關聯服務相關容器的⼀系列操作。鏈接的服務都將會被⾃動啟動, 除⾮已經處於運⾏狀態。可以說, ⼤部分時候都可以直接通過該命令來啟動⼀個項⽬。默認情況, docker-compose up 啟動的容器都在前台, 控制台將會同時打印所有容器的輸出信息, 可以很⽅便進⾏調試。當通過 Ctrl-C 停⽌命令時, 所有容器將會停⽌。如果使⽤docker-compose up -d, 將會在后台啟動並運⾏所有的容器。
⼀般推薦⽣產環境下使⽤該選項。
默認情況, 如果服務容器已經存在, docker-compose up將會嘗試停⽌容器, 然后重新創建(保持使⽤volumes-from掛載的卷) , 以保證新啟動的服務匹配 docker-compose.yml ⽂件的最新內容。 如果⽤戶不希望容器被停⽌並重新創建, 可以使⽤ docker-compose up --no-recreate
。 這樣將只會啟動處於停⽌狀態的容器, ⽽忽略已經運⾏的服務。 如果⽤戶只想重新部署某個服務, 可以使⽤docker-compose up --no-deps -d <SERVICE_NAME>
來重新創建服務並后台停⽌舊服務, 啟動新服務, 並不會影響到其所依賴的服務。
選項:
- -d: 在后台運⾏服務容器;
- --no-color: 不使⽤顏⾊來區分不同的服務的控制台輸出;
- --no-deps: 不啟動服務所鏈接的容器;
- --force-recreate: 強制重新創建容器, 不能與--no-recreate同時使⽤;
- --no-recreate: 如果容器已經存在了, 則不重新創建, 不能與--forcerecreate同時使⽤;
- --no-build: 不⾃動構建缺失的服務鏡像;
- --abort-on-container-exit: 當有容器停⽌時中⽌整個服務, 與-d選項沖突。
- -t, --timeout TIMEOUT: 停⽌容器時候的超時(默認為10秒) , 與 -d 選項沖突;
- --remove-orphans: 刪除服務中未定義的孤⼉容器;
- --exit-code-from SERVICE: 退出時返回指定服務容器的退出符;
- --scale SERVICE=NUM: 擴展指定服務實例到指定數⽬。
25.version
格式為docker-compose version
。打印版本信息。