Docker Compose 是官方編排項目之一,負責快速的部署分佈式應用。它容許用戶經過一個單獨的 docker-compose.yml 模板文件(YAML格式)來定義一種相關聯的應用容器爲一個項目。html
Docker Compose 中有兩個重要的概念:mysql
服務 (service):一個應用的容器,實際上能夠包括若干運行相同鏡像的容器實例。
項目 (project):由一組關聯的應用容器組成的一個完整業務單元,在 docker-compose.yml 文件中定義。git
Docker Compose 的安裝能夠參考上一篇文章的內容。web
對於 Compose 來講,大部分命令的對象既能夠是項目自己,也能夠指定爲項目中的服務或者容器。若是沒有特別的說明,命令對象將是項目,這意味着項目中全部的服務都會受到命令影響。redis
如下經常使用命令在 docker-compose.yml 同級目錄下執行,不然須要 docker-compose -f [docker-compose.yml 路徑] [命令]:sql
docker-compose [命令] -help:查看某個命令的幫助(神器,授人以魚不如授人以漁)。docker
docker-compose config:驗證 Compose 文件(docker-compose.yml)格式是否正確,若正確則顯示配置。若格式錯誤則顯示緣由。數組
docker-compose up:嘗試自動完成包括構建鏡像,(從新)建立服務,啓動服務,並關聯服務相關容器的一系列操做。bash
-d 在後臺運行服務容器。
--no-color 不使用顏色來區分不一樣的服務的控制檯輸出。
--no-deps 不啓動服務所連接的容器。
--force-recreate 強制從新建立容器,不能與 --no-recreate 同時使用。
--no-recreate 若是容器已經存在了,則不從新建立,不能與 --force-recreate 同時使用。
--no-build 不自動構建缺失的服務鏡像。
-t, --timeout TIMEOUT 中止容器時候的超時(默認爲 10 秒)。cookie
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 的核心,涉及到的指令關鍵字也比較多。下面筆主篩選出一些常見的命令,不推薦使用和不經常使用的就不介紹了~~
默認的模板文件名稱爲 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)等來自動構建生成鏡像。
指定 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
指定爲鏡像名稱或鏡像 ID。若是鏡像在本地不存在,Compose 將會嘗試拉取這個鏡像。
version: '3' services: redis: image: "redis:alpine"
指定容器的內核能力(capacity)分配。
#讓容器擁有全部能力能夠指定爲: cap_add: - ALL #去掉 NET_ADMIN 能力能夠指定爲: cap_drop: - NET_ADMIN
覆蓋容器啓動後默認執行的命令。
command: echo "hello world"
解決容器的依賴、啓動前後的問題。
version: '3' services: web: build: . depends_on: - redis redis: image: "redis:alpine"
暴露端口,但不映射到宿主機,只被鏈接的服務訪問,僅能夠指定內部端口爲參數。
expose:
- "3000"
- "8000"
暴露端口信息;使用宿主端口:容器端口 (HOST:CONTAINER) 格式,或者僅僅指定容器的端口(宿主將會隨機選擇端口)均可以;建議數字串都採用引號包括起來的字符串格式。
ports: - "3000" - "8000:8000" - "49100:22" - "127.0.0.1:8001:8001"
指定容器的 ulimits 限制值。
ulimits: #最大進程數 nproc: 64435 nofile: #文件句柄數爲 20000(軟限制,應用能夠隨時修改,不能超過硬限制) soft: 20000 #文件句柄數爲 40000(系統硬限制,只能 root 用戶提升) hard: 40000
從文件中獲取環境變量,能夠爲單獨的文件路徑或列表;則 env_file 中變量的路徑會基於模板文件路徑。若是有變量名稱與 environment 指令衝突,則按照慣例,之後者爲準。
env_file: .env env_file: - ./common.env - ./apps/web.env - /opt/secrets.env
環境變量文件中每一行必須符合格式,支持 # 開頭的註釋行
# common.env: Set development environment PROG_ENV=development
設置環境變量。可使用數組或字典兩種格式;只給定名稱的變量會自動獲取運行 Compose 主機上對應變量的值,能夠用來防止泄露沒必要要的數據。
environment: RACK_ENV: development SESSION_SECRET: environment: - RACK_ENV=development - SESSION_SECRET
指定額外的 host 名稱映射信息。
extra_hosts: - "googledns:8.8.8.8" - "dockerhub:52.1.157.61"
爲容器添加 Docker 元數據(metadata)信息。例如能夠爲容器添加輔助說明信息。
labels: com.startupteam.description: "webapp for a startup team" com.startupteam.department: "devops department" com.startupteam.release: "rc3 for v1.0"
配置容器內核參數。
sysctls: net.core.somaxconn: 1024 net.ipv4.tcp_syncookies: 0 sysctls: - net.core.somaxconn=1024 - net.ipv4.tcp_syncookies=0
數據卷所掛載路徑設置。能夠設置宿主機路徑 (HOST:CONTAINER) 或加上訪問模式 (HOST:CONTAINER:ro);該指令中路徑支持相對路徑。
volumes: - /var/lib/mysql - cache/:/tmp/cache - ~/configs:/etc/configs/:ro
配置網絡模式。Docker 的默認網絡配置是 "bridge",當 Docker 啓動時,會自動在主機上建立一個 docker0 虛擬網橋,其實是 Linux 的一個 bridge,能夠理解爲一個軟件交換機。它會在掛載到它的網口之間進行轉發。當建立一個 Docker 容器的時候,同時會建立了一對 veth pair 接口。這對接口一端在容器內,即 eth0;另外一端在本地並被掛載到 docker0 網橋,名稱以 veth 開頭(例如 vethAQI2QT)。經過這種方式,主機能夠跟容器通訊,容器之間也能夠相互通訊。
network_mode: "bridge" network_mode: "host" --備註:沒有本身的網絡模式,跟宿主機共用一套ip地址,至關於在宿主機上安裝了應用同樣 network_mode: "none" --備註:沒有網絡,將網絡建立的任務徹底交給用戶,能夠經過 links 實現兩個容器的單機互連 network_mode: "service:[service name]" --備註:跟某個服務複用網絡 network_mode: "container:[container name/id]" --備註:跟某個容器複用網絡
#自定義IP地址
networks:
cluster_net:
ipv4_address: 172.16.238.101
指定容器退出後的重啓策略爲始終重啓。該命令對保持服務始終運行十分有效,在生產環境中推薦配置爲 always 或者 unless-stopped。
學習 Docker Compose 過程當中,忽然想起之前老師的教導:學習同樣技能,心必定要放寬,不必鑽牛角尖,畢竟學習不是衝着要成爲百科全書而去的,要否則要百科全書幹嗎呢?學習應該是一件很開心快樂的事情,不必吹毛求疵,好比說:一個用法有一堆命令能夠達到目的,那我都要記下那一堆命令嗎?好比說,一些罕見的用法,我也要過於追究嗎?
參考資料:https://yeasy.gitbooks.io/docker_practice/content/compose/