Docker Compose集成式應用組合與服務編排

Compose簡介

Compose項目是Docker官方的開源項目,負責實現對Docker容器集羣的快速編排。其代碼目前在 https://github.com/docker/compose 開源。

Compose定位是定義和運行多個Docker容器的應用,其前身是開源項目Fig。
使用一個Dockerfile模板文件,可以很方便的定義一個單獨的應用容器,然而在日常工作中,經常會碰到需要多個容器相互配合來完成某項任務。例如要實現一個Web項目,除了Web服務器本身,通常還需要後端的數據庫服務容器,甚至負載均衡容器等。
Compose恰好滿足了這樣的需求。它可以通過一個單獨的docker-compose.yml模板文件來定義一組相關聯的應用容器項目(project)。

Compose有兩個重要的概念:

  • 服務(service):

    一個應用的容器,實際上可以包含若干個運行相同鏡像的容器實例

  • 項目(project):

    由一組關聯的應用容器組成一個完整的業務單元

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

Compose項目由Python編寫,實際上調用了Docker服務提供的API來對容器進行管理

Compose的安裝與卸載

Compose可以通過Python的包管理工具pip進行安裝,也可以直接下載編譯好的二進制文件使用,甚至能夠直接在Docker容器中運行。

Docker for Mac,Docker for Windows自帶docker-compose二進制文件,安裝Docker之後可以直接使用,Linux系統需要單獨的二進制文件或pip進行安裝。

查看compose的安裝版本:

docker-compose --versino

Linux下的二進制安裝:

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

pip安裝:

sudo pip install -U docker-compose

Compose使用示例

應用場景:一般Web網站都會依賴第三方的提供的服務,如DB,cache,以compose編排運行dubbo-admin爲例

獲取源碼,從github上獲取dubbo-admin的master分支源碼

git clone -b master https://github.com/apache/incubator-dubbo-ops.git

修改admin中的application配置,把zookeeper地址改爲zookeeper://zookeeper:2181

在項目根目錄下使用maven進行打包

mvn clean package -Dmaven.test.skip=true

構建鏡像,在dubbo-admin目錄下編寫Dockerfile文件,寫入以下內容:

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD ./target/dubbo-admin-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]

使用以下命令構建鏡像

docker build -t dubbo-admin:1.0 .

編寫docker-compose.yml文件,在項目根目錄下編寫docker-compose.yml文件寫入以下內容

version: '3.4'
services:
zk_server:
image: zookeeper:3.4
ports:
- 2181:2181
dubbo-admin:
image: dubbo-admin:1.0
links:
- zk_server:zookeeper
depends_on:
- zk_server
ports:
- 7001:7001

運行compose項目,在docker-compose.yml文件所在目錄執行:

docker-compose up

在瀏覽器中訪問http://ip:7001 登錄驗證,默認用戶名密碼:root/root,guest/guest

Compose命令說明

執行docker-compose [COMMAND] —help 或者docker-compose help [COMMAND]可以產看命令的使用幫助。

docker-compose命令的基本使用格式是:

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

選項說明:

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


Compose模板文件

模板文件是Compose的核心,其涉及的指令關鍵字也比較多,大部分指令跟docker run相關的參數含義類似。默認的模板文件名稱爲docker-compose.yml,格式爲YAML格式。

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

常用指令介紹

build

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

使用context指令指定Dockerfile文件所在文件夾的路徑
使用dockerfile指令指定Dockerfile的文件名
使用args令指定構建鏡像時的變量

version: '3'
services:
webapp:
build:
context:./dir
dockerfile:Dockerfile
args:
buildno:1

command

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

command:echo "hello word"

container_name

指定容器名稱,默認會使用 項目名稱服務名稱序號 這樣的格式

devices

指定設備映射關係

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

depends_on

解決容器的依賴,啓動先後的問題

dns

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

environment

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

expose

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

extra_hosts

類似Docker中的—add-host參數,指定額外的host名稱映射信息

extra_hosts:
- "googledns:8.8.8.8"

會在啓動啓動後的服務容器中 /etc/hosts 文件中添加“8.8.8.8 googledns”

healthcheck

通過命令檢查容器是否健康運行

image

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

labels

爲容器添加Docker元數據信息,如可以添加輔助說明信息

network_mode

設置網絡模式,使用和docker run 的—network參數一樣的值

networks

配置容器連接的網絡

ports

暴露端口信息,使用 宿主端口:容器端口 的格式,只指定容器端口的時候,宿主端口會隨機映射。

volumes

數據卷掛載的路徑設置,可以設置宿主機路徑,同時支持相對路徑

ulimits

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

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

entrypoint

指定服務容器啓動後執行的文件入口

user

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

working_dir

指定容器中的工作目錄

讀取變量

Compose模板文件支持動態讀取主機的系統環境變量和當前目錄下的 .env 文件中的變量。

如,Compose文件將從運行它的環境中讀取${MONGO_VERSION}的值,並寫入執行命令

version:'3'
services:
db:
image:"mongo:${MONGO_VERSION}"

如果執行MONGO_VERSION=3.4,docker-compose up則會啓動一個mongo:3.4鏡像的容器
若當前目錄下存在 .env 文件,則優先從該文件中讀取變量的值

本文分享自微信公衆號 - Coding Diary(gh_7e1f05090980)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

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