1. 程式人生 > >Docker入門篇(三)之docker-compose單機編排

Docker入門篇(三)之docker-compose單機編排

pos role 主機 drive 需要 deb label 打印 ops

1、docker-compose的簡介

docker-compose作為dokcer的官方編排工具,它可以讓用戶通過編寫一個簡單的模板文件,快速地創建和管理基於docker容器的應用集群。實現對docker容器集群的快速編排。我們知道Dockerfile模板文件,可以讓用戶很方便地定義一個單獨的應用容器。然而在日常工作中,經常會遇到需要多個容器相互配合來完成某項任務的情況。例如要實現一個web項目,除了web服務器容器本身,往往還需要加上後端的數據庫服務容器,甚至還包括負載均衡容器等。
????而Compose正好可以滿足這樣的需求,它允許用戶通過一個單獨的docker-compose.yml

模板文件(YAML格式)來定義一組相關聯的應用容器作為一個項目(project
????Compose中有2個重要的概念:
????(1)服務(service):一個應用的容器,實際上可以包含若幹運行相同鏡像的容器實例。
????(2)項目(project):由一組關聯的應用容器組成的一個完成業務單元,在docker-compose.yml文件中定義。

2、docker-compose安裝

Compose項目是用Python語言編寫的,所以compose可以通過pythonpip工具進行安裝。安裝過程如下:

[root@localhost ~]# yum install -y python-pip
[root@localhost 
~]# pip install -U docker-compose [root@localhost ~]# docker-compose version docker-compose version 1.21.0, build 5920eb0 docker-py version: 3.2.1 CPython version: 2.7.5 OpenSSL version: OpenSSL 1.0.1e-fips 11 Feb 2013

3、Compose命令

對於Compose來說,大部分命令的對象既可以是項目本身,也可以指定為項目中的服務或容器。如果沒有特別說明,命令對象將是項目,這意味著項目中所有的服務都會受到命令的影響。docker-compose

命令的基本使用格式如下:

Usage:
  docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
  docker-compose -h|--help

Options:
  -f, --file FILE             指定使用的Compose模板文件,默認為docker-compose.yml,可多次指定;                        
  -p, --project-name NAME     指定項目名稱,默認將使用所在目錄名稱作為項目名 ;                           
  --verbose                   輸出更多調試信息;

  -v, --version               打印版本信息;

Commands:
  build              構建項目中的服務容器
  help               獲得一個命令的幫助
  images             列出所有鏡像
  kill               通過發送SIGKILL信號來強制停止服務容器
  logs               查看服務器容器的輸出
  pause              暫停一個服務容器
  port               打印某個容器的端口所映射的公共端口
  ps                 列出項目中目前的所有容器
  pull               拉取服務依賴的鏡像
  push               推送服務依賴的鏡像
  restart            重啟項目中的服務
  rm                 刪除所有的服務器容器(停止狀態中的)
  run                在指定服務上執行一個命令
  scale              設置指定服務運行的容器個數
  start              啟動已經存在的服務容器
  stop               停止已經處於運行狀態的容器,但不刪除它
  top                展示運行的進程
  unpause            恢復處於暫停狀態中的服務
  up                 自動完成包括構建鏡像、創建服務、啟動服務並關聯服務相關容器的一系列操作
  version            打印docker-compose的版本信息 

4、Compose模板文件

模板文件是使用Compose的核心,設計的指令關鍵字也有很多,默認的模板文件名稱為docker-compose.yml,格式為YAML格式。舉例:

version: "2"
service:
    webapp:
        image: examplses/web
        ports:
            - "80:80"
        volumes:
            - "/data"

註意,每個服務都必須通過image指定鏡像或build命令(需要Dockerfile)等來自動構建生成鏡像。如果使用build指令,在Dockerfile中設置的選項(例如:CMD、EXPOSE、VOLUME、ENV等)將會自動被獲取,無需在docker-compose.yml中再次設置。以下為模板的主要指令和功能:

(1)build指令

指定Dockerfile所在文件夾的路徑(可以是絕對路勁,或相對docker-compose.yml文件的路徑。)Compose將會利用它自動構建這個鏡像,然後使用這個鏡像:

build: /path/to/build/dir

(2)cap_add,cap_drop

指定容器的內核能力(capacity)分配。例如,讓容器擁有所有能力可以指定為:

cap_add:
    - ALL 

去掉NET_ADMIN能力可以指定為:

cap_drop:
    - NET_ADMIN

(3)command

覆蓋容器啟動後默認執行的命令:

command: echo "hello world"

(4)cgroup_parent

指定父cgroup組,意味著將繼承該組的資源限制,例如,創建了一個cgroup組為cgroups_1

cgroup_parent: cgroups_1

(5)container_name

指定容器名稱。默認將會使用“項目名稱_服務名稱_序號”這樣的格式。例如:

container_name: docker-web-container
指定容器名稱後,該服務將無法進行擴展,因為Docker不允許多個容器具有相同的名稱。

(6)devices

指定設備映射關系,例如:

devices:
    - "/dev/ttyUSB1:/dev/ttyUSB0"

(7)dns

自定義DNS服務器。可以是一個值,也可以是一個列表,例如:

dns: 8.8.8.8
dns:
    - 8.8.8.8
    - 114.114.114.114

(8)dns_search

配置DNS搜索域。可以是一個值,也可以是一個列表,例如:

dns_search: example.com
dns_search:
    - domain1.example.com
    - domain2.example.com

(9)dockerfile

如果需要,指定額外的編譯鏡像的Dockerfile文件,可以通過該指令來指定,例如:
該指令不能和image一起使用,否則Compose不知道根據哪個指令來生成最終的服務鏡像。

dockerfile: Dockerfile-alternate

(10)env_file

從文件中獲取環境變量,可以為單獨的文件路徑或列表。
如果通過docker-compose -f FILE的方式來指定Compose模板文件,則env_file中變量的路徑會基於模板文件路徑,如果有變量名稱和environment指令沖突,則按照慣例,以後者為準:

env_file: .env
env_file:
    - ./common.env
    - ./apps/web.env
    - ./opt/secrets.env
環境變量文件中每一行都必須符合格式,支持#開頭的註釋行:

(11)environment

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

environment:
    RACK_ENV: development
    SESSION_SECRET
或者:
environment:
    - RACK_ENV=development
    - SESSION_SECRET

(12)expose

暴露端口,但不映射到宿主機,只允許能被鏈接的服務訪問。僅可以指定內部端口為參數,如下所示:

expose:
    - "3000"
    - "8000"

(13)extends

基於其他模板文件進行擴展。例如我們已經有了一個webapp服務,定義一個基礎模板文件為common.yml,如下所示:

# common.yml
webapp:
    build: ./webapp
    environment:
        - DEBUG=false
        - SEND_EMAILS=false

再編寫一個新的development.yml文件,使用common.yml中的webapp服務進行擴展:

#development.yml
web:
    extends:
        file: common.yml
        service: webapp
    ports:
        - "8000:8000"
    links:
        - db
    environment:
        - DEBUG=true
db:
    image: postgres
development.yml會自動繼承common.yml中的webapp服務及環境變量定義。使用extends需要註意以下幾點: 1.避免出現循環依賴,如A依賴B,B依賴C,C依賴A 2.extends不會繼承links和volume_from中定義的容器和數據卷資源。 一般情況下,推薦在基礎模板中只定義一些可以共享的鏡像和環境變量,在擴展模板中具體指定應用變量、鏈接、數據卷等信息。

鏈接到docker-compose.yml外部的容器,甚至可以是非Compose管理的外部容器。參數格式和links類似

external_links:
    - redis_1
    - project_db_1:mysql
    - project_db_1:postgresql

(15)extra_hosts

類似於Docker中的–add-host參數,指定額外的host名稱映射信息,例如:

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

會在啟動後的服務容器中/etc/hosts文件中添加以下2個條目:
8.8.8.8 googledns
52.1.157.61 dockerhub

(16)image

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

image: centos
image: nginx

(17)labels

為容器添加Docker元數據(metadata)信息。例如,可以為容器添加輔助說明信息:

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

鏈接到其他服務中的容器。使用服務名稱(同時作為別名),或者”服務名稱:服務別名”(如SERVICE:ALIAS),這樣的格式都可以,例如:

links:
    - db
    - db:database
    - redis
使用的別名會將自動在服務容器中的/etc/hosts裏創建。例如:
172.17.2.186 db
172.17.2.186 database
172.17.2.187 redis
所連接容器中相應的環境變量也將創建

(19)log_driver

類似於Docker中的–log-driver參數,指定日誌驅動類型。目前支持三種日誌驅動類型:

log_driver: "json-file"
log_driver: "syslog"
log_driver: "none"

(20)log_opt

日誌驅動的相關參數。例如:

log_driver: "syslog"
log_opt:
    syslog-address: "tcp://192.168.0.42:123"

(21)net

設置網絡模式。參數類似於docker client的–net參數

net: "bridge"
net: "none"
net: "container:[name or id]"
net: "host"

(22)pid

跟主機系統共享進程命名空間。打開該選項的容器之間,以及容器和宿主機系統之間可以通過進程ID來相互訪問和操作:

pid: "host"

(23)ports

暴露端口信息。使用”宿主:容器“的格式,或者僅僅指定容器的端口(宿主機會隨機選擇端口):

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

當使用"HOST:CONTAINER"格式來映射端口時,如果你使用的容器端口小於60並且沒有放到引號裏,可能會得到錯誤結果,因為YAML會自動解析xx:yy這種數字格式為60進制。為了避免這種問題的出現,建議數字串都用引號包括起來的字符串格式。

(24)security_opt

指定容器模板標簽(label)機制的默認屬性(用戶、角色、類型、級別等)。例如,配置標簽的用戶名和角色名:

security_opt:
    - label:user:USER
    - label:role:ROLE

(25)ulimits

指定容器的ulimits限制值,例如,指定最大進程數為65535,指定文件句柄數位20000(軟限制,應用可以隨時修改,不能超過硬限制,只能root用戶提高)。

ulimits:
    nproc:65535
    nofile:
        soft:20000
        hard:40000

(26)volumes

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

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

(27)volumes_driver

較新版本的Docker支持數據卷的插件驅動。用戶可以先使用第三方驅動創建一個數據卷,然後使用名稱來訪問它。此時,可以通過volumes_driver來指定驅動:

volume_driver: mydriver

(28)volumes_from

從另一個服務或容器掛載它的數據卷:

volumes_from:
    - service_name
    - container_name

Docker入門篇(三)之docker-compose單機編排