一、概念 Docker Compose 是官方編排項目之一,負責快速的部署分散式應用。它允許用戶通過一個單獨的 docker-compose.yml 模板文件(YAML格式)來定義一種相關聯的應用容器為一個項目。 Docker Compose 中有兩個重要的概念: 服務 (service):一個應用 ...
一、概念
Docker Compose 是官方編排項目之一,負責快速的部署分散式應用。它允許用戶通過一個單獨的 docker-compose.yml 模板文件(YAML格式)來定義一種相關聯的應用容器為一個項目。
Docker Compose 中有兩個重要的概念:
服務 (service):一個應用的容器,實際上可以包括若幹運行相同鏡像的容器實例。
項目 (project):由一組關聯的應用容器組成的一個完整業務單元,在 docker-compose.yml 文件中定義。
Docker Compose 的安裝可以參考上一篇文章的內容。
二、Compose 命令說明
對於 Compose 來說,大部分命令的對象既可以是項目本身,也可以指定為項目中的服務或者容器。如果沒有特別的說明,命令對象將是項目,這意味著項目中所有的服務都會受到命令影響。
以下常用命令在 docker-compose.yml 同級目錄下執行,否則需要 docker-compose -f [docker-compose.yml 路徑] [命令]:
docker-compose [命令] -help:查看某個命令的幫助(神器,授人以魚不如授人以漁)。
docker-compose config:驗證 Compose 文件(docker-compose.yml)格式是否正確,若正確則顯示配置。若格式錯誤則顯示原因。
docker-compose up:嘗試自動完成包括構建鏡像,(重新)創建服務,啟動服務,並關聯服務相關容器的一系列操作。
-d 在後臺運行服務容器。
--no-color 不使用顏色來區分不同的服務的控制台輸出。
--no-deps 不啟動服務所鏈接的容器。
--force-recreate 強制重新創建容器,不能與 --no-recreate 同時使用。
--no-recreate 如果容器已經存在了,則不重新創建,不能與 --force-recreate 同時使用。
--no-build 不自動構建缺失的服務鏡像。
-t, --timeout TIMEOUT 停止容器時候的超時(預設為 10 秒)。
docker-compose down:此命令會停止 up 命令所啟動的容器,並移除網路。
docker-compose images :列出 Compose 文件中包含的鏡像。
docker-compose ps:列出項目中目前的所有容器。
docker-compose ps --service:列出項目中目前的所有服務(重要,很多命令都是基於服務來操作的)。
docker-compose logs [options] [SERVICE...]:查看服務容器的日誌輸出。
docker-compose exec [SERVICE] bash : 進入指定的容器。
docker-compose stop [options] [SERVICE...] :停止已經處於運行中的容器,但不刪除它。
docker-compose kill -s SIGINT [SERVICE...] :通過發送 SIGINT 信號來強制停止服務容器(類似於stop)
docker-compose start [SERVICE...] :啟動已經存在的服務容器。
docker-compose restart [options] [SERVICE...]:重啟項目中的服務
docker-compose rm [options] [SERVICE...]:刪除所有(停止狀態的)服務容器,-f 強制刪除,包括非停止狀態 -v 刪除容器所掛載的數據捲。
docker-compose pause [SERVICE...]:暫停一個服務容器。
docker-compose unpause [SERVICE...]:恢復處於暫停狀態中的服務。
docker-compose scale [options] [SERVICE=NUM...]:設置指定服務運行的容器個數。(神器,照這樣豈不是很簡單就實現了分散式?)
docker-compose top:查看各個容器內運行的進程
三、Compose 模板文件
模板文件是使用 Compose 的核心,涉及到的指令關鍵字也比較多。下麵筆主篩選出一些常見的命令,不推薦使用和不常用的就不介紹了~~
預設的模板文件名稱為 docker-compose.yml,格式為 YAML 格式:
version: '3' #服務列表 services: #服務1,服務名叫web web: build: . ports: - "5000:5000" command: echo "hello world" depends_on: - redis ulimits: #最大進程數 nproc: 64435 nofile: #文件句柄數為 20000(軟限制,應用可以隨時修改,不能超過硬限制) soft: 20000 #文件句柄數為 40000(系統硬限制,只能 root 用戶提高) hard: 40000 #服務2,服務名叫redis redis: image: "redis:alpine"
註意每個服務都必須通過 image 指令指定鏡像或 build 指令(需要 Dockerfile)等來自動構建生成鏡像。
1、build
指定 Dockerfile 所在文件夾的路徑(可以是絕對路徑,或者相對 docker-compose.yml 文件的路徑)。
version: '3' services: webapp: build: ./dir
也可以使用 context 指令指定 Dockerfile 所在文件夾的路徑;使用 dockerfile 指令指定 Dockerfile 文件名;使用 arg 指令指定構建鏡像時的變數。
version: '3' services: webapp: build: context: ./dir dockerfile: Dockerfile-alternate args: buildno: 1
2、image
指定為鏡像名稱或鏡像 ID。如果鏡像在本地不存在,Compose 將會嘗試拉取這個鏡像。
version: '3' services: redis: image: "redis:alpine"
3、cap_add, cap_drop
指定容器的內核能力(capacity)分配。
#讓容器擁有所有能力可以指定為: cap_add: - ALL #去掉 NET_ADMIN 能力可以指定為: cap_drop: - NET_ADMIN
4、command
覆蓋容器啟動後預設執行的命令。
command: echo "hello world"
5、depends_on
解決容器的依賴、啟動先後的問題。
version: '3' services: web: build: . depends_on: - redis redis: image: "redis:alpine"
6、expose
暴露埠,但不映射到宿主機,只被連接的服務訪問,僅可以指定內部埠為參數。
expose:
- "3000"
- "8000"
7、ports
暴露埠信息;使用宿主埠:容器埠 (HOST:CONTAINER) 格式,或者僅僅指定容器的埠(宿主將會隨機選擇埠)都可以;建議數字串都採用引號包括起來的字元串格式。
ports: - "3000" - "8000:8000" - "49100:22" - "127.0.0.1:8001:8001"
8、ulimits
指定容器的 ulimits 限制值。
ulimits: #最大進程數 nproc: 64435 nofile: #文件句柄數為 20000(軟限制,應用可以隨時修改,不能超過硬限制) soft: 20000 #文件句柄數為 40000(系統硬限制,只能 root 用戶提高) hard: 40000
9、env_file
從文件中獲取環境變數,可以為單獨的文件路徑或列表;則 env_file 中變數的路徑會基於模板文件路徑。如果有變數名稱與 environment 指令衝突,則按照慣例,以後者為準。
env_file: .env env_file: - ./common.env - ./apps/web.env - /opt/secrets.env
環境變數文件中每一行必須符合格式,支持 # 開頭的註釋行
# common.env: Set development environment PROG_ENV=development
10、environment
設置環境變數。可以使用數組或字典兩種格式;只給定名稱的變數會自動獲取運行 Compose 主機上對應變數的值,可以用來防止泄露不必要的數據。
environment: RACK_ENV: development SESSION_SECRET: environment: - RACK_ENV=development - SESSION_SECRET
11、extra_hosts
指定額外的 host 名稱映射信息。
extra_hosts: - "googledns:8.8.8.8" - "dockerhub:52.1.157.61"
12、labels
為容器添加 Docker 元數據(metadata)信息。例如可以為容器添加輔助說明信息。
labels: com.startupteam.description: "webapp for a startup team" com.startupteam.department: "devops department" com.startupteam.release: "rc3 for v1.0"
13、sysctls
配置容器內核參數。
sysctls: net.core.somaxconn: 1024 net.ipv4.tcp_syncookies: 0 sysctls: - net.core.somaxconn=1024 - net.ipv4.tcp_syncookies=0
14、volumes
數據捲所掛載路徑設置。可以設置宿主機路徑 (HOST:CONTAINER) 或加上訪問模式 (HOST:CONTAINER:ro);該指令中路徑支持相對路徑。
volumes: - /var/lib/mysql - cache/:/tmp/cache - ~/configs:/etc/configs/:ro
15、restart
指定容器退出後的重啟策略為始終重啟。該命令對保持服務始終運行十分有效,在生產環境中推薦配置為 always 或者 unless-stopped。
四、寄語
學習 Docker Compose 過程中,突然想起以前老師的教導:學習一樣技能,心一定要放寬,沒必要鑽牛角尖,畢竟學習不是衝著要成為百科全書而去的,要不然要百科全書幹嘛呢?學習應該是一件很開心快樂的事情,沒必要吹毛求疵,比如說:一個用法有一堆命令可以達到目的,那我都要記下那一堆命令嗎?比如說,一些罕見的用法,我也要過於追究嗎?
參考資料:https://yeasy.gitbooks.io/docker_practice/content/compose/