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

一、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文件中定義。
python

二、docker-compose安裝

Compose項目是用Python語言編寫的,因此compose能夠經過pythonpip工具進行安裝。安裝過程以下:mysql

[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

三、Compose命令

對於Compose來講,大部分命令的對象既能夠是項目自己,也能夠指定爲項目中的服務或容器。若是沒有特別說明,命令對象將是項目,這意味着項目中全部的服務都會受到命令的影響。docker-compose命令的基本使用格式以下:nginx

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的版本信息 

四、Compose模板文件

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

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

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

(1)build指令

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

build: /path/to/build/dir

(2)cap_add,cap_drop

指定容器的內核能力(capacity)分配。例如,讓容器擁有全部能力能夠指定爲:docker

cap_add:
    - ALL 

去掉NET_ADMIN能力能夠指定爲:數據庫

cap_drop:
    - NET_ADMIN

(3)command

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

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
相關文章
相關標籤/搜索