[容器化技術(shù)之八] Compose集成式應(yīng)用組合及service編排

一、Compose簡介

??Compose項(xiàng)目是Docker官方的開源項(xiàng)目,負(fù)責(zé)實(shí)現(xiàn)對Docker容器集群的快速編排。其代碼目前在https://github.com/docker/compose上開源。

Compose定位是 [ 定義和運(yùn)行多個(gè)Docker容器應(yīng)用 ],其前身是開源項(xiàng)目Fig。

??從[容器化技術(shù)之四] 構(gòu)建私有鏡像中,可知使用一個(gè)Dockerfile模板文件,可以讓用戶很方便地定義一個(gè)單獨(dú)的應(yīng)用容器。然而,在日常工作中,經(jīng)常會(huì)碰到需要多個(gè)容器互相配合來完成某項(xiàng)任務(wù)的情況。例如要實(shí)現(xiàn)一個(gè)Web項(xiàng)目,除了Web服務(wù)容器本身,往往還需要再加上后端的數(shù)據(jù)庫服務(wù)容器,甚至還包括負(fù)載均衡容器等。

??大多數(shù)情況下, 完整的應(yīng)用由多個(gè)服務(wù)組合而成, docker解決了單容器(服務(wù))的問題, 但無法同時(shí)協(xié)調(diào)多個(gè)容器, docker-compose正是解決這一問題。


??Compose恰好滿足了這樣的需求,它允許用戶通過一個(gè)單獨(dú)的docker-compose.yml模板文件來定義一組關(guān)聯(lián)的應(yīng)用容器為一個(gè)項(xiàng)目(project)。

??Compose中有兩個(gè)重要的概念:

  • 服務(wù)(service):一個(gè)應(yīng)用的的容器,實(shí)際上可以包括若干運(yùn)行相同鏡像的容器實(shí)例。
  • 項(xiàng)目(project):由一組關(guān)聯(lián)的應(yīng)用容器組成的一個(gè)完整業(yè)務(wù)單元。

??Compose的默認(rèn)管理對象是項(xiàng)目,通過子命令對項(xiàng)目中的一組容器進(jìn)行便捷地生命周期管理。

??Compose由Python編寫,實(shí)際上調(diào)用了Docker服務(wù)提供的API來對容器進(jìn)行管理。


二、安裝和卸載

Compose支持Linux、macOS、Windows 10三大平臺。

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

??Docker for Mac、Docker for Windows自帶docker-compose二進(jìn)制文件,安裝Docker之后可以直接使用,通過以下命令可以查看docker-compose的版本。

docker-compose --version

??Linux系統(tǒng)需要單獨(dú)使用二進(jìn)制或者pip方式進(jìn)行安裝。

  • 二進(jìn)制包

??在Linux上的安裝十分簡單,從官方Github Release處直接下載編譯好的二進(jìn)制文件即可。例如,在Linux 64位系統(tǒng)上直接下載對應(yīng)的二進(jìn)制包。

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

??由于從github上下載的速度太慢了,改從daocloud下載,秒達(dá)!

  • PIP安裝

??如果計(jì)算機(jī)的架構(gòu)是ARM(例如,樹莓派),建議使用pip安裝。

sudo pip install -U docker-compose



二、Compose構(gòu)建dubbo-admin服務(wù)

一個(gè)項(xiàng)目可以由多個(gè)服務(wù)(容器)關(guān)聯(lián)而成,Compose面向項(xiàng)目進(jìn)行管理。

場景:最常見的項(xiàng)目是web網(wǎng)站,一般的web網(wǎng)站都會(huì)依賴第三方提供的服務(wù)(比如:DB和>cache),這里使用dubbo-admin作為例子(dubbo-admin依賴zookeeper)。

1、獲取源碼

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

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



2、編譯打包

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


??使用maven進(jìn)行編譯打包

mvn clean package -Dmaven.test.skip=true

??因?yàn)閏entos默認(rèn)安裝的是JRE而不是JDK,所以編譯會(huì)報(bào)錯(cuò),先使用以下命令安裝JDK

yum install java-1.8.0-openjdk
yum install java-1.8.0-openjdk-devel

??再重新編譯即可正常打包



3、編寫Dockerfile

??在dubbo-admin目錄下編寫Dockerfile文件,內(nèi)容為:

# FROM:表示使用jdk8環(huán)境為基礎(chǔ)鏡像,如果鏡像不是本地的會(huì)從DockerHub進(jìn)行下載
#FROM openjdk:8-jdk-alpine
FROM openjdk:8-jdk

# 作者
MAINTAINER study.163.com<allen@163.com>

# 使用數(shù)據(jù)卷
VOLUME /tmp

# ADD:拷貝文件并且重命名
ADD ./target/dubbo-admin-0.0.1-SNAPSHOT.jar app.jar

# ENTRYPOINT:為了縮短tomcat的啟動(dòng)時(shí)間,添加java.security.egd的系統(tǒng)屬性指向/dev/urandom作為ENTRYPOINT
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app.jar"]

??由于本地不存在openjdk的鏡像,所以構(gòu)建的時(shí)候會(huì)先從Docker Hub拉取openjdk的鏡像,盡管已經(jīng)配置了網(wǎng)易的加速器,但下載速度還是急死人,所以多配置了阿里云和Docker Hub的加速器,其中阿里云的鏡像加速器需要從控制臺獲取,需要先進(jìn)入鏡像容器服務(wù),添加一個(gè)命名空間,點(diǎn)擊鏡像加速器菜單即可獲取專用阿里云鏡像加速器,如圖所示:


??配置上面的阿里云鏡像加速器

??然后重新加載配置并重啟docker服務(wù)

systemctl daemon-reload
systemctl restart docker

??再重新構(gòu)建,發(fā)現(xiàn)速度duang duang一下子上去了哈哈

docker build -t dubbo-admin:1.0 .



4、編寫docker-compose.yml

??在項(xiàng)目根目錄下編寫docker-compose.yml文件,這個(gè)是Compose使用的主模板文件

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

version:Compose版本
services:docker-compose協(xié)調(diào)的服務(wù)列表
??zk_server是服務(wù)列表中的第一個(gè),使用的鏡像是zookeeper:3.4,端口映射為2181對應(yīng)宿主機(jī)的2181;
??dubbo-admin是服務(wù)列表中的第二個(gè),使用的鏡像是dubbo-admin:1.0,links參數(shù)定義了容器與容器之間的依賴關(guān)系,這里依賴的是上面定義的服務(wù)zk_server,端口映射為7001對應(yīng)宿主機(jī)的7001。

5、運(yùn)行compose項(xiàng)目

??在docker-compose.yml文件所在目錄執(zhí)行:

docker-compose up

??可以看到按照服務(wù)列表定義的順序,先啟動(dòng)了zk服務(wù),后啟動(dòng)了dubbo-admin(使用spring-boot),如下圖所示:


??在瀏覽器中方位http://服務(wù)器ip:7001進(jìn)行驗(yàn)證,用戶名密碼為:root/root?guest/guest



三、Compose命令說明

??命令對象與格式:執(zhí)行docker-compose [COMMAND] --help或者docker-compose help [COMMAND]可以查看具體某個(gè)命令的使用格式。

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

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

命令選項(xiàng):

  • -f, --file FILE:指定模板文件,默認(rèn)為docker-compose.yml,可以多次指定。
  • -p, --project-name NAME:指定項(xiàng)目名稱,默認(rèn)將使用所在目錄名稱作為項(xiàng)目名稱。
  • --x-networking:使用Docker的可拔插網(wǎng)絡(luò)后端特性。
  • --x-network-driver DRIVER:指定網(wǎng)絡(luò)后端的驅(qū)動(dòng),默認(rèn)為bridge。
  • --verbose:輸出更多調(diào)試信息。
  • -v, --version:打印版本并退出。
命令?? 說明
build 格式為docker-compose build [options] [SERVICE...]
構(gòu)建(重新構(gòu)建)項(xiàng)目中的服務(wù)容器。
可以隨時(shí)在項(xiàng)目目錄下運(yùn)行docker-compose build來重新構(gòu)建服務(wù)。

選項(xiàng)包括:

--force-rm:刪除構(gòu)建過程中的臨時(shí)容器。
--no-cache:構(gòu)建鏡像過程中不使用cache(這將加長構(gòu)建過程)。
-pull:始終嘗試通過pull來獲取更新版本的鏡像。
version 格式為docker-compose version
打印版本信息。
config 驗(yàn)證Compose格式是正確,若正確則顯示配置,若格式錯(cuò)誤顯示錯(cuò)誤原因
exec 進(jìn)入指定的容器
images 列出Compose文件中包含的鏡像
logs 格式為docker-compose logs [options] [SERVICE...]
查看服務(wù)容器的輸出。默認(rèn)情況下,docker-compose將對不同的服務(wù)輸出使用不同的顏色來區(qū)分??梢酝ㄟ^--no-color來關(guān)閉顏色。
down 停止up命令所啟動(dòng)的容器(經(jīng)過測試發(fā)現(xiàn)容器也會(huì)被刪除),并移除網(wǎng)絡(luò)
help 獲得一個(gè)命令的幫助
kill 通過發(fā)送SIGKILL信號來強(qiáng)制停止服務(wù)容器
pause 格式為docker-compose pause [SERVICE...]
暫停一個(gè)服務(wù)容器
port 格式為docker-compose port [options] SERVICE PRIVATE_PORT
打印某個(gè)容器端口所映射的公共端口。

選項(xiàng):

--protocol=proto:指定端口協(xié)議,tcp(默認(rèn)值)或者udp。
--index=index:如果同以服務(wù)存在多個(gè)容器,指定命令對象容器的序號(默認(rèn)為1)。
ps 格式為docker-compose ps [options] [SERVICE...]
列出項(xiàng)目中目前的所有容器。

選項(xiàng):

-q:只打印容器的ID信息。
push 推送服務(wù)依賴的鏡像到Docker鏡像倉庫
pull 格式為docker-compose pull [options] [SERVICE...]
拉取服務(wù)依賴的鏡像。

選項(xiàng):

--ignore-pull-failures:忽略拉取鏡像過程中的錯(cuò)誤。
restart 格式為docker-compose restart [options] [SERVICE...]
重啟項(xiàng)目中的服務(wù)。

選項(xiàng):

-t, --timeout TIMEOUT:指定重啟前停止容器的超市(默認(rèn)為10秒)。
rm 格式為docker-compose rm [options] [SERVICE...]
刪除所有(停止?fàn)顟B(tài)的)服務(wù)容器。推薦先執(zhí)行docker-compose stop命令來停止容器。

選項(xiàng):

-f, --force:強(qiáng)制直接刪除,包括非停止?fàn)顟B(tài)的容器。一般盡量不要使用該選項(xiàng)。
-v:刪除容器所掛載的數(shù)據(jù)卷。
run 格式為docker-compose run [options] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]
在指定服務(wù)上執(zhí)行一個(gè)命令。例如:
docker-compose run ubuntu ping docker.com
scale 格式為docker-compose scale [options] [SERVICE=NUM...]
設(shè)置指定服務(wù)運(yùn)行的容器個(gè)數(shù)。例如:
docker-compose scale web=3 db=2
將啟動(dòng)3個(gè)容器運(yùn)行web服務(wù),2個(gè)容器運(yùn)行db服務(wù)。
start 格式為docker-compose start [SERVICE...]
啟動(dòng)已經(jīng)存在的服務(wù)容器。
stop 停止已經(jīng)存在的服務(wù)容器。
top 查看各個(gè)服務(wù)容器內(nèi)運(yùn)行的進(jìn)程。
unpause 格式為docker-compose unpause [SERVICE...]
恢復(fù)處于暫停狀態(tài)中的服務(wù)。
up 該命令十分強(qiáng)大,它將嘗試自動(dòng)完成包括構(gòu)建鏡像,(重新)創(chuàng)建服務(wù),啟動(dòng)服務(wù),并關(guān)聯(lián)服務(wù)相關(guān)容器的一系列操作。鏈接的服務(wù)都將會(huì)被自動(dòng)啟動(dòng),除非已經(jīng)處于運(yùn)行狀態(tài)。

選項(xiàng):

-d:在后臺運(yùn)行服務(wù)容器。
--no-color:不使用顏色來區(qū)分不同的服務(wù)的控制臺輸出。
--no-deps:不啟動(dòng)服務(wù)所鏈接的容器。
--force-recreate:強(qiáng)制重新創(chuàng)建容器,不能與--no-recreate同事使用。
--no-recreate:如果容器已經(jīng)存在了,則不重新創(chuàng)建,不能與--force-recreate同時(shí)使用。
--no-build:不自動(dòng)構(gòu)建缺失的服務(wù)鏡像。
-t, --timeout TIMEOUT:停止容器時(shí)候的超市(默認(rèn)為10秒)。



四、Compose模板文件

??模板文件是使用Compose的核心,涉及到的指令關(guān)鍵字比較多,但是大部分指令跟docker run相關(guān)參數(shù)的含義都是類似的。

??默認(rèn)的模板文件名稱為docker-compose.yml,格式為YAML格式。注意每個(gè)服務(wù)都必須通過image指令指定鏡像或build指令(需要Dockerfile)等來自動(dòng)構(gòu)建生成鏡像。

??如果使用build指令,在Dockerfile中設(shè)置的選項(xiàng)(例如:CMD、EXPOSE、VOLUMEENV等)將會(huì)自動(dòng)被獲取,無需在docker-compose.yml中再次設(shè)置。下面介紹常用指令的用法:

1、build

??指定Dockerfile所在文件夾的路徑(可以是絕對路徑,或者相對docker-compose.yml文件的路徑)。Compose將會(huì)利用它自動(dòng)構(gòu)建這個(gè)鏡像,然后使用這個(gè)鏡像。

使用context指令指定Dockerfile所在文件夾的路徑
使用dockerfile指令指定Dockerfile文件名
使用arg指令指定構(gòu)建鏡像時(shí)的變量

示例:

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


2、command

??覆蓋容器啟動(dòng)后默認(rèn)執(zhí)行的命令。

command: echo "hello world"


3、configs

??僅用于Swarm mode。

4、Container_name

??指定容器名稱。默認(rèn)將會(huì)使用項(xiàng)目名稱_服務(wù)名稱_序號這樣的格式。

container_name:docker-web-container


5、deploy

??僅用于Swarm mode。

6、devices

??指定設(shè)備映射關(guān)系

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


7、depends_no

??解決容器的依賴、啟動(dòng)先后的問題。

8、dns

??自定義DNS服務(wù)器,可以是一個(gè)值,也可以是一個(gè)列表。

dns: 8.8.8.8
dns:
    - 8.8.8.8
    - 114.114.114.114


9、environment

??設(shè)置環(huán)境變量??梢允褂脭?shù)組或字典兩種格式,只給定名稱的變量會(huì)自動(dòng)獲取運(yùn)行Compose主機(jī)上對應(yīng)變量的值,可以用來防止泄露不必要的數(shù)據(jù)。

environment:
    RACK_ENV: development
    SESSION_SECRET
environment:
    - RACK_ENV=development
    - SESSION_SECRET


10、expose

??暴露端口但不映射到宿主機(jī),只被連接的服務(wù)訪問。僅可以指定內(nèi)部端口為參數(shù)。

expose: 
     - "3000"
     - "8000"


11、extra_hosts

??類似Docker中的--add_host參數(shù),指定額外的host名稱映射信息。會(huì)在啟動(dòng)后的服務(wù)容器中/etc/hosts文件中添加一條條目。

extra_hosts:
    - "googledns:8.8.8.8"


11、healthcheck

??通過命令檢查容器是否健康運(yùn)行。

healthcheck:
     test: ["CMD", "curl", "-f", "http://localhost"]
     interval: 1m30s
     timeout: 10s
     retries: 3


12、image

??指定為鏡像名稱或鏡像ID。如果鏡像在本地不存在,Compose將會(huì)嘗試先拉取這個(gè)鏡像。

image: session-web:latest


13、labels

??為容器添加Docker元數(shù)據(jù)(metadata)信息。例如可以為容器添加輔助說明信息。

labels:
     com.study.department: "devops department"
     com.study.release: "v1.0"


14、links

??連接到其他容器。

注意:不推薦使用該指令。應(yīng)該使用docker network,建立網(wǎng)絡(luò),而docker run --network來連接特定網(wǎng)絡(luò);或者使用version: '2'和更高版本的docker-compose.yml直接定義自定義網(wǎng)絡(luò)并使用。

15、network_mode

??設(shè)置網(wǎng)絡(luò)模式。使用和docker run--network 參數(shù)一樣的值。

network_mode: "bridge"
network_mode: "host"
network_mode: "none"


16、networks

??配置容器連接的網(wǎng)絡(luò)。

version: "3"
services:
     some-service:
          network:
               - some-network
networks:
     some-network:


17、ports

??暴露端口信息。使用宿主端口:容器端口(HOST:CONTAINER)格式,或者僅僅指定容器的端口(宿主將會(huì)隨機(jī)選擇端口)都可以。

ports:
    - "3000"
    - "8000:8000"


18、volumes

??數(shù)據(jù)卷所掛載路徑設(shè)置,可以設(shè)置宿主機(jī)路徑 ,同時(shí)支持相對路徑。

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


19、ulimits

??指定容器的ulimits限制值。

??例如,指定最大進(jìn)程數(shù)為65535,指定文件句柄數(shù)為20000(軟限制,應(yīng)用可以隨時(shí)修改,不能超過硬限制)和40000(系統(tǒng)硬限制,只能root用戶提高)

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


其他指令

??此外,還有包括domainname,entrypoint, hostname, ipc, mac_address, privileged, read_only, shm_size, restart, stdin_open, tty, user, working_dir等指令,基本都跟docker run中對應(yīng)參數(shù)的功能一致。

  • 指定服務(wù)容器啟動(dòng)后執(zhí)行的入口文件
entrypoint:/code/entrypoint.sh
  • 指定容器中運(yùn)行應(yīng)用的用戶名
user:nginx
  • 指定容器中工作目錄
working_dir:/code
  • 指定容器中搜索域名、主機(jī)名、mac地址等
domainname: your_website.com
hostname: test
mac_address: 08-00-27-00-0C-0A
  • 允許容器中運(yùn)行一些特權(quán)命令
privileged:true
  • 指定容器退出后的重啟策略為始終重啟。在生產(chǎn)環(huán)境中推薦配置為always或者unless-stopped
restart:always
  • 以只讀模式掛載容器的root文件系統(tǒng),意味著不能對容器內(nèi)容進(jìn)行修改
read_only: true
  • 打開標(biāo)準(zhǔn)輸入,可以接收外部輸入
stdin_open: true
  • 模擬一個(gè)偽終端
tty:true


讀取變量

??Compose模板文件支持動(dòng)態(tài)讀取主機(jī)系統(tǒng)環(huán)境變量和當(dāng)前目錄下的.env文件中的變量。

例如,下面的Compose文件將從運(yùn)行它的環(huán)境中讀取變量${MONGO_VERSION}的值,并寫入執(zhí)行的指令中。

version: "3"
services:
     db:
          image: "mongoL${MONGO_VERSION}"

如果執(zhí)行MONGO_VERSION=3.2,docker-compose up則會(huì)啟動(dòng)一個(gè)mongo:3.2的鏡像的容器。若當(dāng)前目錄存在.env文件。執(zhí)行docker-compose命令時(shí)將從該文件中讀取變量。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容