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


