Docker三劍客——Compose

前面介紹了Docker三劍客中的兩個,今天我們介紹一下三劍客中的最後一個——docker-compose。接下來的內容,我們還是從五個方面來講解,主要包括如下:

  • Compose簡介
  • Compose安裝與卸載
  • Compose常用命令
  • Compose模板文件
  • Compose實戰

一、Compose簡介

1、簡介

compose

Compose項目是Docker官方的開源項目,負責實現對Docker容器集羣的快速編排。它是一個定義和運行多容器的docker應用工具。使用compose,你能通過YMAL文件配置你自己的服務,然後通過一個命令,你能使用配置文件創建和運行所有的服務。

Compose是一個定位“定義和運行多個Docker容器應用的工具”,其前身是Fig,目前使用的Compose仍然兼容Fig格式的模板文件。

Compose的代碼主要使用Python編寫,其開源地址爲:https://github.com/docker/compose

我們知道在Docker中構建自定義的鏡像是通過使用Dockerfile模板文件來實現的,從而可以讓用戶很方便定義一個單獨的應用容器。而Compose使用的模板文件就是一個YAML格式文件,它允許用戶通過一個docker-compose.yml來定義一組相關聯的應用容器爲一個項目(project)。

注意:Fig時代支持的配置文件名爲fig.yml以及fig.yaml;爲了兼容遺留的Fig化配置,目前Compose支持的配置文件類型非常豐富,主要有以下幾種:fig.yaml、docker-compose.yml、docker-compose.yaml以及用戶指定的配置文件路徑。(可通過環境變量COMPOSE_FILE或-f參數自定義配置文件)

在Compose中有兩個重要的概念:

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

以上可以理解爲:
服務(service)就是在它下面可以定義應用需要的一些服務,代表配置文件中的每一項服務。每個服務都有自己的名字、使用的鏡像、掛載的數據卷、所屬的網絡、依賴哪些其他服務等等,即以容器爲粒度,用戶需要Compose所完成的任務。

項目(project)代表用戶需要完成的一個項目,即是Compose的一個配置文件可以解析爲一個項目,即Compose通過分析指定配置文件,得出配置文件所需完成的所有容器管理與部署操作。

Compose的默認管理對象時項目,通過子命令對項目中的一組容器進行便捷地生命週期管理。

二、Compose安裝與卸載

1、Compose安裝

Compose目前已經完全支持Linux、Mac OS和Windows,在我們安裝Compose之前,需要先安裝Docker,對於Mac OS和Windows的安裝比較容易,可以參考Install Docker for MacInstall Docker for Windows,對於Linux的安裝可以參考Ubuntu下docker安裝及簡單應用

(1)、Linux平臺的安裝

這裏是使用了官方編譯好的二進制包,地址:https://github.com/docker/compose/releases。把這些二進制文件下載後直接放到執行路徑下面,並添加權限即可。

curl -L https://github.com/docker/compose/releases/download/1.22.0-rc1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

然後我們執行docker-compose -version可以查看到具體的信息。
docker-compose

(2)、Mac OS 系統 & Windows系統安裝

對於Mac和windows用戶來說,Docker for Mac 、Docker for Windows 和 Docker Toolbox 早已經集成了docker-compose,所以用戶不需要分別再安裝docker-compose了。

(3)、其他可選方式安裝

因爲Compose是Python編寫的,我們可以將其當做一個Python應用從pip源中安裝。

如果是使用virtualenv環境,則執行如下命令:

pip install docker-compose

當在本地環境安裝,則執行:

sudo pip install docker-compose

2、Compose卸載

如果是二進制包方式安裝的,刪除二進制文件即可:

sudo rm /usr/local/bin/docker-compose

如果是通過Python pip工具安裝的,則執行如下命令刪除:

sudo pip uninstall docker-compose

三、Compose常用命令

在我們使用Compose前,可以通過執行docker-compose --help|-h來查看Compose基本命令用法。

docker-compose

我們也可以通過執行docker-compose [COMMAND] --help或者docker-compose --help [COMMAND]來查看某個具體的使用格式。

從上面的提示中我們可以知道Compose命令的基本的使用格式爲:

docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]

命令選項如下:

  • -f,–file FILE指定使用的Compose模板文件,默認爲docker-compose.yml,可以多次指定。
  • -p,–project-name NAME指定項目名稱,默認將使用所在目錄名稱作爲項目名。
  • -x-network-driver 使用Docker的可拔插網絡後端特性(需要Docker 1.9 及以後版本)
  • -x-network-driver DRIVER指定網絡後端的驅動,默認爲bridge(需要Docker 1.9 及以後版本)
  • -verbose輸出更多調試信息
  • -v,–version打印版本並退出

Docker Compose常用命令列表如下:

命令 說明
build 構建項目中的服務容器
help 獲得一個命令的幫助
kill 通過發送SIGKILL信號來強制停止服務容器
config 驗證和查看compose文件配置
create 爲服務創建容器。只是單純的create,還需要使用start啓動compose
down 停止並刪除容器,網絡,鏡像和數據卷
exec 在運行的容器中執行一個命令
logs 查看服務容器的輸出
pause 暫停一個服務容器
port 打印某個容器端口所映射的公共端口
ps 列出項目中目前的所有容器
pull 拉取服務依賴的鏡像
push 推送服務鏡像
restart 重啓項目中的服務
rm 刪除所有(停止狀態的)服務容器
run 在指定服務上執行一個命令
scale 設置指定服務運行的容器個數
start 啓動已經存在的服務容器
stop 停止已經處於運行狀態的容器,但不刪除它
top 顯示運行的進程
unpause 恢復處於暫停狀態中的服務
up 自動完成包括構建鏡像、創建服務、啓動服務並關閉關聯服務相關容器的一些列操作
version 打印版本信息

1、build

格式爲:

docker-compose build [options] [--build-arg key=val...] [SERVICE...]

構建(重新構建)項目中的服務容器。

選項包括:

  • –compress 通過gzip壓縮構建上下環境
  • –force-rm 刪除構建過程中的臨時容器
  • –no-cache 構建鏡像過程中不使用緩存
  • –pull 始終嘗試通過拉取操作來獲取更新版本的鏡像
  • -m, –memory MEM 爲構建的容器設置內存大小
  • –build-arg key=val 爲服務設置build-time變量

2、help

獲得一個命令的幫助。

3、kill

格式爲:

docker-compose kill [options] [SERVICE...]

通過發送SIGKILL信號來強制停止服務容器。
支持通過-s參數來指定發送的信號,例如通過如下指令發送SIGINT信號:

docker-compose kill -s SIGINT

4、config

格式爲:

docker-compose config [options]

驗證並查看compose文件配置。

選項包括:

  • –resolve-image-digests 將鏡像標籤標記爲摘要
  • -q, –quiet 只驗證配置,不輸出。 當配置正確時,不輸出任何內容,當文件配置錯誤,輸出錯誤信息
  • –services 打印服務名,一行一個
  • –volumes 打印數據卷名,一行一個

5、create

格式爲:

docker-compose create [options] [SERVICE...]

爲服務創建容器.只是單純的create,還需要使用start啓動compose。

選項包括:

  • –force-recreate 重新創建容器,即使它的配置和鏡像沒有改變,不兼容–no-recreate參數
  • –no-recreate 如果容器已經存在,不需要重新創建. 不兼容–force-recreate參數
  • –no-build 不創建鏡像,即使缺失
  • –build 創建容器前,生成鏡像

6、down

格式爲:

docker-compose down [options]

停止和刪除容器、網絡、卷、鏡像,這些內容是通過docker-compose up命令創建的. 默認值刪除 容器 網絡,可以通過指定 rmi 、volumes參數刪除鏡像和卷。

選項包括:

  • –rmi type 刪除鏡像,類型必須是: ‘all’: 刪除compose文件中定義的所以鏡像;’local’: 刪除鏡像名爲空的鏡像
  • -v, –volumes 刪除已經在compose文件中定義的和匿名的附在容器上的數據卷
  • –remove-orphans 刪除服務中沒有在compose中定義的容器

7、exec

格式爲:

docker exec [options] SERVICE COMMAND [ARGS...]

docker exec命令功能相同,可以通過service name登陸到容器中。

選項包括:

  • -d 分離模式,後臺運行命令.
  • –privileged 獲取特權.
  • –user USER 指定運行的用戶.
  • -T 禁用分配TTY. By default docker-compose exec分配 a TTY.
  • –index=index 當一個服務擁有多個容器時,可通過該參數登陸到該服務下的任何服務,例如:docker-compose exec –index=1 web /bin/bash ,web服務中包含多個容器

8、logs

格式爲:

docker-compose logs [options] [SERVICE...]

查看服務容器的輸出。默認情況下,docker-compose將對不同的服務輸出使用不同的顏色來區分。可以通過–no-color來關閉顏色。

9、pause

格式爲:

docker-compose pause [SERVICE...]

暫停一個服務容器。

10、port

格式爲:

docker-compose port [options] SERVICE PRIVATE_PORT

顯示某個容器端口所映射的公共端口。

選項包括:

  • –protocol=proto 指定端口協議,TCP(默認值)或者UDP
  • –index=index 如果同意服務存在多個容器,指定命令對象容器的序號(默認爲1)

11、ps

格式爲:

docker-compose ps [options] [SERVICE...]

列出項目中目前的所有容器。

選項包括:

  • -q 只打印容器的ID信息

12、pull

格式爲:

docker-compose pull [options] [SERVICE...]

拉取服務依賴的鏡像。

選項包括:

  • –ignore-pull-failures 忽略拉取鏡像過程中的錯誤
  • –parallel 多個鏡像同時拉取
  • –quiet 拉取鏡像過程中不打印進度信息

13、push

格式爲:

docker-compose push [options] [SERVICE...]

推送服務依的鏡像。

選項包括:

  • –ignore-push-failures 忽略推送鏡像過程中的錯誤

14、restart

格式爲:

docker-compose restart [options] [SERVICE...]

重啓項目中的服務。

選項包括:

  • -t, –timeout TIMEOUT 指定重啓前停止容器的超時(默認爲10秒)

15、rm

格式爲:

docker-compose rm [options] [SERVICE...]

刪除所有(停止狀態的)服務容器。

選項包括:

  • –f, –force 強制直接刪除,包括非停止狀態的容器
  • -v 刪除容器所掛載的數據卷

16、run

格式爲:

docker-compose run [options] [-v VOLUME...] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]

在指定服務上執行一個命令。

例如:

docker-compose run ubuntu ping www.anumbrella.net

將會執行一個ubuntu容器,並執行ping www.anumbrella.net命令。

默認情況下,如果存在關聯,則所有關聯的服務將會自動被啓動,除非這些服務已經在運行中。該命令類似於啓動容器後運行指定的命令,相關卷、鏈接等都會按照配置自動創建。有兩個不同點:

  1. 給定命令將會覆蓋原有的自動運行命令
  2. 不會自動創建端口,以避免衝突

如果不希望自動啓動關聯的容器,可以使用–no-deps選項,例如:

docker-compose run --no-deps web

將不會啓動web容器關聯的其他容器。

選項包括:

  • -d 在後臺運行服務容器
  • –name NAME 爲容器指定一個名字
  • –entrypoint CMD 覆蓋默認的容器啓動指令
  • -e KEY=VAL 設置環境變量值,可多次使用選項來設置多個環境變量
  • -u, –user=”” 指定運行容器的用戶名或者uid
  • –no-deps 不自動啓動管理的服務容器
  • –rm 運行命令後自動刪除容器,d模式下將忽略
  • -p, –publish=[] 映射容器端口到本地主機
  • –service-ports 配置服務端口並映射到本地主機
  • -v, –volume=[] 綁定一個數據卷,默認爲空
  • -T 不分配僞tty,意味着依賴tty的指令將無法運行
  • -w, –workdir=”” 爲容器指定默認工作目錄

17、scale

格式爲:

docker-compose scale [options] [SERVICE=NUM...]

設置指定服務運行的容器個數。
通過service=num的參數來設置數量。例如:

docker-compose scale web=3 db=2

將啓動3個容器運行web服務,2個容器運行db服務。一般情況下,當指定書目多於該服務當前實際運行容器,將新創建並啓動容器;反之,將停止容器。

選項包括:

  • -t, –timeout TIMEOUT 停止容器時候的超時(默認爲10秒)

18、start

格式爲:

docker-compose start [SERVICE...]

啓動已經存在的服務容器。

19、stop

格式爲:

docker-compose stop [options] [SERVICE...]

停止已經處於運行狀態的容器,但不刪除它。

選項包括:

  • -t, –timeout TIMEOUT 停止容器時候的超時(默認爲10秒)

20、top

格式爲:

docker-compose stop [options] [SERVICE...]

顯示各個容器運行的進程情況。

21、unpause

格式爲:

docker-compose unpause [SERVICE...]

恢復處於暫停狀態中的服務。

22、up

格式爲:

docker-compose up [options] [--scale SERVICE=NUM...] [SERVICE...]

up命令十分強大,它嘗試自動完成包括構建鏡像,(重新)創建服務,啓動服務,並關聯服務相關容器的一些列操作。鏈接的服務都將會被自動啓動,除非已經處於運行狀態。

多數情況下我們可以直接通過該命令來啓動一個項目。

選項包括:

  • -d 在後臺運行服務容器
  • –no-color 不使用顏色來區分不同的服務的控制輸出
  • –no-deps 不啓動服務所鏈接的容器
  • –force-recreate 強制重新創建容器,不能與–no-recreate同時使用
  • –no-recreate 如果容器已經存在,則不重新創建,不能與–force-recreate同時使用
  • –no-build 不自動構建缺失的服務鏡像
  • –build 在啓動容器前構建服務鏡像
  • –abort-on-container-exit 停止所有容器,如果任何一個容器被停止,不能與-d同時使用
  • -t, –timeout TIMEOUT 停止容器時候的超時(默認爲10秒)
  • –remove-orphans 刪除服務中沒有在compose文件中定義的容器
  • –scale SERVICE=NUM 設置服務運行容器的個數,將覆蓋在compose中通過scale指定的參數

23、version

格式爲:

docker-compose version

打印版本信息。

四、Compose模板文件

模板文件是使用Compose的核心,涉及的指令關鍵字也比較多,大部分指令與docker run相關參數的含義都是類似的。

默認的模板文件迷城爲docker-compose.yml,格式爲YAML格式。

比如一個Compose模板文件:

version: "2"
services:
    web:
        images: nginx
        ports:
            - "80:80"
        volumes:
            - "/data"
#volumes:

#networks:

Docker Compose的模板文件主要分爲3個區域,爲:

services

服務,在它下面可以定義應用需要的一些服務,每個服務都有自己的名字、使用的鏡像、掛載的數據卷、所屬的網絡、依賴哪些其他服務等等。

volumes

應用的網絡,在它下面可以定義應用的名字、使用的網絡類型等等。

networks

數據卷,在它下面可以定義的數據卷(名字等等),然後掛載到不同的服務下去使用。

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

Docker Compose常用模板文件主要命令:

指令 功能
build 指定服務鏡像Dockerfile所在路徑
cap_add,cap_drop 指定容器的內核能力(capacity)分配
command 覆蓋容器啓動後默認執行的命令
cgroup_parent 指定父cgroup組,意味着將基礎該組的資源限制
container_name 指定容器名稱。默認將會使用項目名稱服務名稱序號這樣的格式
devices 指定設置映射關係
dns 自定義DNS服務器。可以是一個值,也可以是一個列表
dns_search 配置DNS搜索域。可以是一個值,也可以是一個列表
dockerfile 指定額外編譯鏡像的Dockerfile文件,可以通過該指令來指定
env_file 從文件中獲取環境變量,可以爲單獨的文件路徑或列表
environment 設置環境變量,可以使用數組或字典兩種格式
expose 暴露端口
extends 基於其他模板文件進行擴展
external_links 鏈接到docker-compose.yml外部的容器,甚至可以是非Compose管理的外部容器
extra_hosts 指定額外的host名稱映射信息
image 指定爲鏡像名稱或鏡像ID。如果鏡像在本地不存在,Compose將會嘗試拉取這個鏡像
labels 指定服務鏡像Dockerfile所在路徑
links 鏈接到其他服務中的容器
log_driver 指定日誌驅動類型,類似於Docker中的–log-driver參數。目前支持三種日誌驅動類型:log_driver:”json-file”、log_driver:”syslog”、log_driver:”none”
log_opt 日誌驅動的相關參數
net 設置網絡模式。參數類似於docker clinet的–net參數一樣
pid 跟主機系統共享進程命名空間。打開該選項的容器之間,以及容器和宿主機系統之間可以通過進程ID來相互訪問和操作
ports 暴露端口信息
security_opt 指定容器模板標籤(label)機制的默認屬性(如用戶、角色、類型、級別等)
ulimits 指定容器的ulimits限制值
volumes 數據卷所掛載路徑設置。可以設置宿主機路徑(HOST:CONTAINER)或加上訪問模式(HOST:CONTAINER:ro)
volumes_driver 較新版本的Docker支持數據卷的插件驅動
volumes_from 從另一個服務或容器掛載它的數據卷

下面分別介紹一些主要指令的用法:

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組名稱爲cgroups_1:

cgroup_parent: cgroups_1

5、container_name

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

container_name: docker-web-container

6、devices

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

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

7、dns

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

dns:8.8.8.8
dns:
    - 8.8.8.8
    - 9.9.9.9

8、dns_search

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

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

9、dockerfile

如果需要,指定額外的編譯鏡像的Dockerfile文件,可以通過該指定龍指定,例如:

dockerfile: Dockerfile-alternate

注意:該指令不能跟image同時使用,否則Compose將不知道根據哪個指令來生成最終的服務鏡像。

10、env_file

從文件中獲取環境變量,可以爲單獨的文件路徑或列表。

如果通過docker-compose -f FILE 方式來指定Compose模板文件,則env_file中變量的路徑會基於模板文件路徑。

如果有變量名稱與environment指定衝突,則按照慣例,以後者爲準:

env_file: .env

env_file:
    - ./common.env
    - ./apps/web.env
    - /opt/secrets.env

環境變量文件中每一行必須符合格式,支持#開頭的註釋行:

# common.ev Set development environment
PROG_ENV=development

11、environment

設置環境變量,可以使用數組或字典兩種格式。

只給定名稱的變量會自動獲取運行Compose主機上對應變量的值,可以用來防止防泄露不必要的數據。例如:

environment: 
    RACK_ENV: development
    SESSION_SECRET:

或者:

environment: 
    - RACK_ENV=development
    - SESSION_SECRET

注意:如果變量名稱或者值中用到true|false,yes|no等表達布爾含義的詞彙,最好放到引號裏,避免YAML自動解析某些內容爲對應的布爾語義:

y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF

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: mysql

後者會自動繼承common.yml中的webapp服務及環境變量定義。

使用extends需要注意以下幾點:

  • 要避免出現循環依賴,例如A依賴B,B依賴C,C反過來依賴A的情況
  • extends不會繼承links和volumes_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文件中添加如下兩條條目:

8.8.8.8  googledns
52.1.157.61 dockerhub

16、image

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

image: ubuntu
image: mysql

17、labels

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

labels:
    com.startupteam.description: "webapp for a strtup team"

鏈接到其他服務中的容器。使用服務名稱(同時作爲別名),或者“服務名稱:服務別名”(如 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: "host"

22、pid

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

pid: "host"

23、ports

暴露端口信息。

使用“宿主機:容器”(如 “HOST:CONTAINER”)格式,或者僅僅指定容器的端口(宿主機將會隨機選擇端口):

ports:
    -3000    -8000:8000    - "8080:22"

24、security_opt

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

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

25、ulimits

指定容器的ulimits值限制值。例如,指定最大進程數爲65535,指定文件句柄數爲2000(軟限制,應用可以隨時修改,不能超過硬限制)和 4000(系統硬限制,只能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_from

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

volumes_from:
    - service_name
    - container_name

28、其他指令

此外,還有包括cpu_shares、cpuset、domainname、entrypoint、hostname、ipc、mac_address、mem_limit、memswap_limit、privileged、read_only、restart、stdin_open、tty、user、working_dir等指令,基本跟docker-run中對應參數的功能一致。

例如,指定使用CPU核0和核1,只用50%的CPU資源:

cpu_shares: 73
cpuset: 0,1

指定服務容器啓動後執行的命令:

entrypoint: /code/entrypoint.sh

指定容器中運行應用的應用名:

user: nginx

指定容器中的工作目錄:

working_dir: /code

指定容器中搜索域名、主機名、mac地址等:

domainname: anumbrella.net
hostname: dev
mac_address: 08-00-27-0C-0A

指定容器:

ipc: host

指定容器中內存和內存交換區限制都爲1G:

mem_limit: 1g
memswap_limit: 1g

允許容器中運行一些特權命令:

privileged: true

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

restart: always

以只讀模式掛載容器的root文件系統,意味着不能對容器內容進行修改:

read_only: true

打開標準輸入,可以接受外部輸入:

stdin_open: true

模擬一個假的遠程控制檯

tty: true

29、讀取環境變量

從1.5.0版本開始,Compose模板文件支持動態讀取主機的系統環境變量。

例如,下面的Compose文件將從運行它的環境變量中讀取變量${MONGO_VERSION}的值,並將其寫入執行的命令中:

db:
    image: "mongo:${MONGO_VERSION}"

如果執行MONGO_VERSION=3.0 docker-compoe up 則會啓動一個mongo:3.0鏡像的容器;如果執行MONGO_VERSION=2.8 docker-compoe up則會啓動一個mongo:2.8鏡像的容器

對應Compose模板文件命令,官方也是在不斷更新,目前版本已經是第三版了,更多更詳細的用法可以參考官方文檔
compose-file

五、Compose實戰

講了那麼多,我們開始結合前面的知識點進行講解使用Compose。首先新建一個文件夾compose,然後創建文件docker-compose.yml。

docker-compose.yml

編輯docker-compose.yml如下:

version: '2'
services:
  web1:
    image: nginx
    ports: 
      - "8080:80"
    container_name: "web1"
  web2:
    image: nginx
    ports: 
      - "8081:80"
    container_name: "web2"
#volumes:

#networks:

在這裏我們聲明瞭服務,並在下面定義了兩個容器web1,web2,同時指定鏡像爲nginx,並指定了name或端口,而網絡和數據卷並沒有進行聲明。

接着我們使用docker-compose up 啓動該服務。

up

我們可以查看到命令中,首先創建了一個默認的compose_default的網絡,然後創建容器,並「Attaching to …」,將網絡應用到服務上。

我們可以查看一下具體的網絡,使用docker network ls 如下:

network

然後我們訪問接口,可以發現具體的日誌;

訪問

日誌信息

這裏我們啓動的服務並不是以守護進程啓動了,所以關閉客戶端就關閉了服務。如果要一守護進程啓動,加上-d參數。如下:

docker-compose up -d

-d

接下來我們可以使用一些前文介紹的命令,docker-compose ps查看服務,

ps

docker-compose stop [name] 停止服務,docker-compose start [name]啓動服務,

stop、start

docker-compose rm [name]刪除服務,需要停止服務,否則使用-f參數,與docker rm命令類似

rm

注意:這個docker-compose rm不會刪除應用的網絡和數據卷。查看一下網絡,可以看到應用創建的網絡

如果要刪除數據卷、網絡、應用則使用docker-compose down命令。

down

docker-compose logs -f [name]查看具體服務的日誌。

logs

通過docker-compose exec [name] shell可以進入容器內部,例如,進入web1容器內部,使用docker-compose exec web1 /bin/bash命令。

exec

現在我們更改docker-compose文件,更改爲如下配置:

version: '2'
services:
  web1:
    image: nginx
    ports: 
      - "8080:80"
    container_name: "web1"
    networks:
      - dev
  web2:
    image: nginx
    ports: 
      - "8081:80"
    container_name: "web2"
    networks:
      - dev
      - pro
  web3:
    image: nginx
    ports: 
      - "8082:80"
    container_name: "web3"
    networks:
      - pro

networks:
  dev:
    driver: bridge
  pro:
    driver: bridge

#volumes:

我們添加了容器web3,並指定了網絡。使用docker-compose down關閉先前的服務,重新啓動服務。

up -d

我們指定了dev、pro網絡,同時給web1指定了dev網絡,web2指定了dev、pro網絡,web3指定了pro網絡,因此web1和web2可以互相訪問到,web2和web3可以互相訪問到,而web1與web3就無法訪問。這就可以通過配置來實現容器直接的互通和隔離。

現在我們再次更改docker-compose.yml模板文件,如下:

version: '2'
services:
  web1:
    image: nginx
    ports: 
      - "8080:80"
    container_name: "web1"
    networks:
      - dev
    volumes:
      - ntfs:/data
  web2:
    image: nginx
    ports: 
      - "8081:80"
    container_name: "web2"
    networks:
      - dev
      - pro
    volumes:
      - ./:/usr/share/nginx/html
  web3:
    image: nginx
    ports: 
      - "8082:80"
    container_name: "web3"
    networks:
      - pro
    volumes:
      - ./:/usr/share/nginx/html

networks:
  dev:
    driver: bridge
  pro:
    driver: bridge

volumes:
  ntfs:
    driver: local

我們添加了volumes聲明,在web1中我們掛載數據在本地,而web2、web3我們則掛載compose當前目錄與nginx的/usr/share/nginx/html相通。同樣使用docker-compose down關閉先前的服務,並重新啓動服務。

然後我們在當前compose目錄新建index.html文件,這裏的index.html隨便編寫一些內容,

index.html

然後我們可以進入web2、web3中,在容器的/usr/share/nginx/html中我們可以查看到與我們compose目錄一致。

volumes1

然後我們訪問http://localhost:8081http://localhost:8082,得到的結果與我們預期的也一致。如下:

volumes2

通過Compose,我們快速創建一套基於Docker容器的服務棧,然後使用docker-compose腳本來啓動,停止和重啓應用,非常適合組合使用多個容器進行開發的場景。因此掌握Compose的使用也是非常重要的,到此Compose的知識點也介紹完畢,Docker三劍客的知識也到此結束,有什麼建議歡迎一起討論。

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章