一、作用
個人理解:使用容器編排工具可以批量的管理容器、或容器組。比如有依賴關系的幾個容器共通組成的服務,典型的有dockerhub。比如在單個服務啟動后需要留啟動腳本記錄容器啟動命令的情況。
官方文檔
二、安裝
yum -y install epel-release
yum -y install python-pip
pip install docker-compose
docker-compose version

三、使用
注意:使用docker-compose需要編寫docker-compose.yml文件,並在文件的同級目錄下執行。
1.docker-compose.yaml
version: '3'
services:
socket5:
image: hub.ict.ac.cn/local_proxy/local_proxy:v3
container_name: socket5
restart: always
ports:
- '7012:7012'
stdin_open: true
tty: true
busybox:
image: docker.io/busybox
container_name: busybox
stdin_open: true
tty: true
2.指令
- version 指定了 compose file 的版本,最新的版本為 3.4
- services 下定義服務,這里定義了一個爬蟲服務 spider
- build 指定構建鏡像上下文、Dockerfile 文件和 ARGS 等
- volumes 用於創建卷並掛載,這里掛載了源碼目錄和數據存儲目錄
- command 指定服務啟動時執行的命令,參考 Dockerfile COMMAND
image: 指定容器啟動的鏡像
build: 服務除了可以基於指定的鏡像
command: 使用 command 可以覆蓋容器啟動后默認執行的命令
**container_name**: 指定運行時容器名稱,而不使用默認格式(<項目名稱><服務名稱><序號>)
**restart**:重啟策略
**depends_on**: 指明服務之間依賴,解決了容器的依賴、啟動先后的問題
dns: 指定 DNS 服務器。
tmpfs: 掛載臨時目錄到容器內部,與 run 的參數一樣
entrypoint: 在 Dockerfile 中有一個指令叫做 ENTRYPOINT 指令
env_file: 專門存放變量的文件。如果通過 docker-compose -f FILE 指定了配置文件,則 env_file 中路徑會使用配置文件路徑。如果有變量名稱與 environment 指令沖突,則以后者為准
environment: 與上面的 env_file 設置鏡像變量,它可以保存變量到鏡像里面,也就是說啟動的容器也會包含這些變量設置
expose: 這個標簽與 Dockerfile 中的 EXPOSE 指令一樣,用於指定暴露的端口
external_links:讓 Compose 項目里面的容器連接到那些項目配置外部的容器
extra_hosts: 添加主機名的標簽,就是往 /etc/hosts 文件中添加一些記錄
labels: 向容器添加元數據,和 Dockerfile 的 LABEL 指令一個意思
**links**: 上面的 depends_on 標簽解決的是啟動順序問題,這個標簽解決的是容器連接問題,與 Docker client 的 –link 一樣效果,會連接到其它服務中的容器。
logging: 用於配置日志服務。默認的 driver 是 json-file
pid: 將 PID 模式設置為主機 PID 模式,跟主機系統共享進程命名空間。容器使用這個標簽將能夠訪問和操縱其他容器和宿主機的名稱空間。
ports: 映射端口的標簽。使用 HOST:CONTAINER 格式或者只是指定容器的端口,宿主機會隨機映射端口。
security_opt: 為每個容器覆蓋默認的標簽。簡單說來就是管理全部服務的標簽。
stop_signal: 設置另一個信號來停止容器。在默認情況下使用的是 SIGTERM 停止容器。設置另一個信號可以使用 stop_signal 標簽。
volumes: 掛載一個目錄或者一個已存在的數據卷容器
cap_add, cap_drop: 添加或刪除容器的內核功能
devices: 設備映射列表
extends: 這個標簽可以擴展另一個服務,擴展內容可以是來自在當前文件,也可以是來自其他文件,相同服務的情況下,后來者會有選擇地覆蓋原有配置。
3.啟動、關閉
啟動
docker-compose up
如果啟動時指定-d標志,則以守護進程模式運行服務
docker-compose up -d
如果要批量啟動服務(如啟動 8 個 Scrapy),則在--scale選項指定服務的個數:
docker-compose up -d --scale spider=8
列出本地 docker-compose.yml 文件里定義的正在運行的所有服務
docker-compose ps
logs: 查看服務的日志,這個命令會追蹤服務的日志文件,類似tail -f命令,使用Ctrl+C退出
docker-compose logs
stop: 停止所有服務,如果服務沒有停止,可以使用docker-compose kill強制殺死服務
docker-compose stop
rm: 刪除所有服務
docker-compose rm
4、官方示例
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:
