1. 程式人生 > >Docker 系列五(Docker Compose 項目).

Docker 系列五(Docker Compose 項目).

學習 例如 1.0 app containe 模板 文件 sys options

一、概念

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 過程中,突然想起以前老師的教導:學習一樣技能,心一定要放寬,沒必要鉆牛角尖,畢竟學習不是沖著要成為百科全書而去的,要不然要百科全書幹嘛呢?學習應該是一件很開心快樂的事情,沒必要吹毛求疵,比如說:一個用法有一堆命令可以達到目的,那我都要記下那一堆命令嗎?比如說,一些罕見的用法,我也要過於追究嗎?

Docker 系列五(Docker Compose 項目).