在Linux 64 位系統(tǒng)上直接下載對(duì)應(yīng)的二進(jìn)制包
#curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
#chmod +x /usr/local/bin/docker-compose
bash補(bǔ)全命令
#curl -L https://raw.githubusercontent.com/docker/compose/1.8.0/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
compose命令
docker-compose
-f, --file FILE 指定使用的 Compose 模板文件,默認(rèn)為 docker-compose.yml ,可以多次指定。
-p, --project-name NAME 指定項(xiàng)目名稱,默認(rèn)將使用所在目錄名稱作為項(xiàng)目名。
--x-networking 使用 Docker 的可拔插網(wǎng)絡(luò)后端特性
--x-network-driver DRIVER 指定網(wǎng)絡(luò)后端的驅(qū)動(dòng),默認(rèn)為 bridge
--verbose 輸出更多調(diào)試信息。
-v, --version 打印版本并退出。
onfig 驗(yàn)證compose文件格式
dow/up 停止/啟動(dòng)容器
exec 進(jìn)入指定的容器
images 列出compose文件中包含的鏡像
kill 強(qiáng)制停止服務(wù)容器
-s 指定發(fā)送的信號(hào)
#docker-compose kill -s SIGINT
logs 查看服務(wù)容器的輸出
pause 暫停一個(gè)服務(wù)容器
port 打印某個(gè)容器端口所映射的公共端口
--protocol=proto 指定端口協(xié)議,tcp(默認(rèn)值)或者udp
--index=index 如果同一服務(wù)存在多個(gè)容器,指定命令對(duì)象容器的序號(hào)(默認(rèn)為 1)
ps 列出項(xiàng)目中目前的所有容器
-q 只打印容器的ID信息
pull 拉取服務(wù)依賴的鏡像
--ignore-pull-failures 忽略拉取鏡像過(guò)程中的錯(cuò)誤
push 推送服務(wù)依賴的鏡像到docker鏡像倉(cāng)庫(kù)
restart 重啟項(xiàng)目中的服務(wù)
-t , --timeout TIMEOUT 指定重啟前停止容器的超時(shí)(默認(rèn)10秒)
start 啟動(dòng)已經(jīng)存在的服務(wù)容器
stop 停止處于運(yùn)行狀態(tài)的容器
unpause 恢復(fù)處理暫停狀態(tài)中的服務(wù)
rm 刪除所有(停止?fàn)顟B(tài))服務(wù)容器
-f , --force 強(qiáng)制直接刪除,包括非停止?fàn)顟B(tài)容器
-v 刪除容器所掛載的數(shù)據(jù)卷
run 在指定服務(wù)上執(zhí)行一個(gè)命令
-d 后臺(tái)運(yùn)行容器。
--name NAME 為容器指定一個(gè)名字。
--entrypoint CMD 覆蓋默認(rèn)的容器啟動(dòng)指令。
-e KEY=VAL 設(shè)置環(huán)境變量值,可多次使用選項(xiàng)來(lái)設(shè)置多個(gè)環(huán)境變量。
-u, --user="" 指定運(yùn)行容器的用戶名或者 uid。
--no-deps 不自動(dòng)啟動(dòng)關(guān)聯(lián)的服務(wù)容器。
--rm 運(yùn)行命令后自動(dòng)刪除容器, d 模式下將忽略。
-p, --publish=[] 映射容器端口到本地主機(jī)。
--service-ports 配置服務(wù)端口并映射到本地主機(jī)。
-T 不分配偽 tty,意味著依賴 tty 的指令將無(wú)法運(yùn)行。
# docker-compose run ubuntu ping docker.com
將會(huì)啟動(dòng)一個(gè) ubuntu 服務(wù)容器,并執(zhí)行 ping docker.com 命令
默認(rèn)情況下,如果存在關(guān)聯(lián),則所有關(guān)聯(lián)的服務(wù)將會(huì)自動(dòng)被啟動(dòng),除非這些服務(wù)已經(jīng)在運(yùn)行中。
該命令類似啟動(dòng)容器后運(yùn)行指定的命令,相關(guān)卷、鏈接等等都將會(huì)按照配置自動(dòng)創(chuàng)建。兩個(gè)不同點(diǎn):
給定命令將會(huì)覆蓋原有的自動(dòng)運(yùn)行命令;
不會(huì)自動(dòng)創(chuàng)建端口,以避免沖突。
如果不希望自動(dòng)啟動(dòng)關(guān)聯(lián)的容器,可以使用 --no-deps 選項(xiàng),例如
# docker-compose run --no-deps web python manage.py shell
將不會(huì)啟動(dòng)web容器所關(guān)聯(lián)的其他容器
scale
設(shè)置指定服務(wù)運(yùn)行的容器個(gè)數(shù),通過(guò)service=num 的參數(shù)來(lái)設(shè)置數(shù)量
#docker-compose scale web=3 db=2
將啟動(dòng)3個(gè)容器運(yùn)行web服務(wù),2個(gè)容器運(yùn)行db服務(wù)
一般的,當(dāng)指定數(shù)目多于該服務(wù)當(dāng)前實(shí)際運(yùn)行容器,將新創(chuàng)建并啟動(dòng)容器;反之,將停止容器。
-t, --timeout TIMEOUT 停止容器時(shí)候的超時(shí)(默認(rèn)為 10 秒)
top 查看各個(gè)服務(wù)容器內(nèi)運(yùn)行的進(jìn)程
up 自動(dòng)完成包括構(gòu)建鏡像,(重新)創(chuàng)建服務(wù),啟動(dòng)服務(wù),并關(guān)聯(lián)
服務(wù)相關(guān)容器
-d 后臺(tái)啟動(dòng)并運(yùn)行所有的容器
--no-color 不使用顏色來(lái)區(qū)分不同的服務(wù)的控制臺(tái)輸出。
--no-deps 不啟動(dòng)服務(wù)所鏈接的容器。
--force-recreate 強(qiáng)制重新創(chuàng)建容器,不能與 --no-recreate 同時(shí)使用。
--no-recreate 如果容器已經(jīng)存在了,則不重新創(chuàng)建,不能與 --force-recreate 同時(shí)使用。
--no-build 不自動(dòng)構(gòu)建缺失的服務(wù)鏡像。
-t, --timeout TIMEOUT 停止容器時(shí)候的超時(shí)(默認(rèn)為 10 秒)。
Compose 模板文件
build 指定 Dockerfile 所在文件夾的路徑
也可以使用 context 指令指定 Dockerfile 所在文件夾的路徑。
使用 dockerfile 指令指定 Dockerfile 文件名。
使用 arg 指令指定構(gòu)建鏡像時(shí)的變量。
使用 cache_from 指定構(gòu)建鏡像的緩存
version: '3'
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
cache_from:
- alpine:latest
- corp/web_app:3.14
cap_add ,cap_drop指定容器的內(nèi)核能力(capacity)分配讓容器擁有所有能力可以指定為:
cap_add:
- ALL
去掉 NET_ADMIN 能力可以指定為:
cap_drop:
- NET_ADMIN
command 覆蓋容器啟動(dòng)后默認(rèn)執(zhí)行的命令
command: echo "hello word"
cgroup_parent 指定父 cgroup 組,意味著將繼承該組的資源限制。
cgroup_parent: cgroups_1
container_name 指定容器名稱。默認(rèn)將會(huì)使用 項(xiàng)目名稱_服務(wù)名稱_序號(hào) 這樣的格式。
container_name: docker-web-container
注意: 指定容器名稱后,該服務(wù)將無(wú)法進(jìn)行擴(kuò)展(scale),因?yàn)?nbsp;Docker 不允許多個(gè)容器具有相同的名稱。
devices 定設(shè)備映射關(guān)系。
devices:
- "/dev/tyyUSB1:/dev/ttyUSB0"
depends_on 解決容器的依賴、啟動(dòng)先后的問(wèn)題。
以下例子中會(huì)先啟動(dòng) redis db 再啟動(dòng) web
version: "3"
services:
web:
build: .
depends_on
- db
- redis
redis:
image: redis
db:
image: postges
注意: web 服務(wù)不會(huì)等待 redis db 「完全啟動(dòng)」之后才啟動(dòng)。dns 自定義DNS服務(wù)器??梢允且粋€(gè)值,也可以是一個(gè)列表
dns: 8.8.8.8
dns:
- 8.8.8.8
- 4.4.4.4
dns_search 配置 DNS 搜索域??梢允且粋€(gè)值,也可以是一個(gè)列表。
tmpfs 掛載一個(gè)tmpfs文件系統(tǒng)到容器
tmpfs: /run
tmpfs:
- /run
- /tmp
env_file 從文件中獲取環(huán)境變量,可以為單獨(dú)的文件路徑或列表。
environment 設(shè)置環(huán)境變量。你可以使用數(shù)組或字典兩種格式。
environment:
RACK_ENV: development
SESSION_SECRET:
environment:
- RACK_NEW=development
- SESSION_SECRET
expose 暴露端口,但不映射到宿主機(jī),只被連接的服務(wù)訪問(wèn)。
expose:
- "3000"
- "8000"
extra_hosts 類似 Docker 中的 --add-host 參數(shù),指定額外的 host 名稱映射信息。
extra_hosts:
- "googledns:8.8.8.8"
- "dockerhub:52.1.157.61"
會(huì)在啟動(dòng)后的服務(wù)容器中 /etc/hosts 文件中添加如下兩條條目。
8.8.8.8 googledns
52.1.157.61 dockerhub
healthcheck 通過(guò)命令檢查容器是否健康運(yùn)行。
healthcheck
test: ["CMD", "curl", "-f","http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
image 指定為鏡像名稱或鏡像 ID。如果鏡像在本地不存在, Compose 將會(huì)嘗試?yán)∵@個(gè)鏡像。
image: ubuntu
image: orchardup/postgresql
image: a4bc65fd
logging 配置日志選項(xiàng)
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.1.2:123"
目前支持三種日志驅(qū)動(dòng)類型
driver: "json-file"
driver: "syslog"
driver: "none"
options:
options:
max-size: "200k"
max-file: "10"
network_mode 設(shè)置網(wǎng)絡(luò)模式。使用和 docker run 的 --network 參數(shù)一樣的值。
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
networks 配置容器連接的網(wǎng)絡(luò)
version: "3"
services:
some-service:
networks:
- some-network
- other-network
networks:
some-network:
other-network:
pid 跟主機(jī)系統(tǒng)共享進(jìn)程命名空間。打開該選項(xiàng)的容器之間,以及容器和宿主機(jī)系統(tǒng)之間可以通過(guò)進(jìn)程 ID 來(lái)相互訪問(wèn)和操作。
pid: "host"
ports 暴露端口信息;使用宿主端口:容器端口 (HOST:CONTAINER) 格式,或者僅僅指定容器的端口(宿主將會(huì)隨機(jī)選擇端口)都可以。
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
secrets 存儲(chǔ)敏感數(shù)據(jù),例如mysql服務(wù)密碼
version: "3"
services:
mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password
secrets:
- db_root_password
- my_other_secret
secrets:
my_secret:
file: ./my_secret.txt
my_other_secret:
external: true
security_opt 指定容器模板標(biāo)簽(label)機(jī)制的默認(rèn)屬性(用戶、角色、類型、級(jí)別等)。例如配置標(biāo)簽的用戶名和角色名。
security_opt:
- label:user:USER
- label:role:ROLE
stop_signal 設(shè)置另一個(gè)信號(hào)來(lái)停止容器。在默認(rèn)情況下使用的是 SIGTERM 停止容器。
stop_signal: SIGUSR1
sysctls 配置容器內(nèi)核參數(shù)
sysctls:
net.core.somaxconn: 1024
net.ipv4.tcp_syncookies: 0
sysctls:
- net.core.somaxconn=1024
- net.ipv4.tcp_syncookies=0
ulimits 指定容器的 ulimits 限制值。
例如,指定最大進(jìn)程數(shù)為 65535,指定文件句柄數(shù)為 20000(軟限制,應(yīng)用可以隨時(shí)修改,不能超過(guò)硬限制) 和 40000(系統(tǒng)硬限制,只能 root 用戶提高)。
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
volumes 數(shù)據(jù)卷所掛載路徑設(shè)置??梢栽O(shè)置宿主機(jī)路徑 ( HOST:CONTAINER ) 或加上訪問(wèn)模式( HOST:CONTAINER:ro )。
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro
restart 指定容器退出后的重啟策略為始終重啟。該命令對(duì)保持服務(wù)始終運(yùn)行十分有效,在生產(chǎn)環(huán)境中推薦配置為 always 或者 unless-stopped 。
restart: always
從運(yùn)行它的環(huán)境中讀取變量 ${MONGO_VERSION} 的值,并寫入執(zhí)行的指令中。
version: "3"
services:
db:
image: "mongo:${MONGO_VERSION}"