Docker 系列五(Docker Compose 項目).

1、概念

    Docker Compose 是官方編排項目之一,負責快速的部署分佈式應用。它容許用戶經過一個單獨的 docker-compose.yml 模板文件(YAML格式)來定義一種相關聯的應用容器爲一個項目。html

    Docker  Compose 中有兩個重要的概念:mysql

服務 (service):一個應用的容器,實際上能夠包括若干運行相同鏡像的容器實例。
項目 (project):由一組關聯的應用容器組成的一個完整業務單元,在 docker-compose.yml 文件中定義。git

    Docker Compose 的安裝能夠參考上一篇文章的內容。web

2、Compose 命令說明

    對於 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:查看各個容器內運行的進程

3、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)等來自動構建生成鏡像。

    一、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

    二、image

指定爲鏡像名稱或鏡像 ID。若是鏡像在本地不存在,Compose 將會嘗試拉取這個鏡像。

version: '3'
services:
  
  redis:
    image: "redis:alpine"

    三、cap_add, cap_drop

指定容器的內核能力(capacity)分配。

#讓容器擁有全部能力能夠指定爲:
cap_add:
  - ALL
#去掉 NET_ADMIN 能力能夠指定爲:
cap_drop:
  - NET_ADMIN

    四、command

覆蓋容器啓動後默認執行的命令。

command: echo "hello world"

    五、depends_on

解決容器的依賴、啓動前後的問題。

version: '3'
services:
  
  web:
    build: .
    depends_on:
     - redis
     
  redis:
    image: "redis:alpine"

    六、expose

暴露端口,但不映射到宿主機,只被鏈接的服務訪問,僅能夠指定內部端口爲參數。

expose:
 - "3000"
 - "8000"

    七、ports

暴露端口信息;使用宿主端口:容器端口 (HOST:CONTAINER) 格式,或者僅僅指定容器的端口(宿主將會隨機選擇端口)均可以;建議數字串都採用引號包括起來的字符串格式。

ports:
 - "3000"
 - "8000:8000"
 - "49100:22"
 - "127.0.0.1:8001:8001"

    八、ulimits

指定容器的 ulimits 限制值。

ulimits:
  #最大進程數
  nproc: 64435
  nofile:
   #文件句柄數爲 20000(軟限制,應用能夠隨時修改,不能超過硬限制)
   soft: 20000
   #文件句柄數爲 40000(系統硬限制,只能 root 用戶提升)
   hard: 40000

     九、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

    十、environment

設置環境變量。可使用數組或字典兩種格式;只給定名稱的變量會自動獲取運行 Compose 主機上對應變量的值,能夠用來防止泄露沒必要要的數據。

environment:
  RACK_ENV: development
  SESSION_SECRET:

environment:
  - RACK_ENV=development
  - SESSION_SECRET

    十一、extra_hosts

指定額外的 host 名稱映射信息。

extra_hosts:
 - "googledns:8.8.8.8"
 - "dockerhub:52.1.157.61"

    十二、labels

爲容器添加 Docker 元數據(metadata)信息。例如能夠爲容器添加輔助說明信息。

labels:
  com.startupteam.description: "webapp for a startup team"
  com.startupteam.department: "devops department"
  com.startupteam.release: "rc3 for v1.0"

    1三、sysctls

配置容器內核參數。

sysctls:
  net.core.somaxconn: 1024
  net.ipv4.tcp_syncookies: 0

sysctls:
  - net.core.somaxconn=1024
  - net.ipv4.tcp_syncookies=0

    1四、volumes

數據卷所掛載路徑設置。能夠設置宿主機路徑 (HOST:CONTAINER) 或加上訪問模式 (HOST:CONTAINER:ro);該指令中路徑支持相對路徑。

volumes:
 - /var/lib/mysql
 - cache/:/tmp/cache
 - ~/configs:/etc/configs/:ro

    1五、network_mode 

    配置網絡模式。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

    1六、restart

指定容器退出後的重啓策略爲始終重啓。該命令對保持服務始終運行十分有效,在生產環境中推薦配置爲 always 或者 unless-stopped。

4、寄語

    學習 Docker Compose 過程當中,忽然想起之前老師的教導:學習同樣技能,心必定要放寬,不必鑽牛角尖,畢竟學習不是衝着要成爲百科全書而去的,要否則要百科全書幹嗎呢?學習應該是一件很開心快樂的事情,不必吹毛求疵,好比說:一個用法有一堆命令能夠達到目的,那我都要記下那一堆命令嗎?好比說,一些罕見的用法,我也要過於追究嗎?

 

參考資料:https://yeasy.gitbooks.io/docker_practice/content/compose/

相關文章
相關標籤/搜索