docker技術(shù)剖析--docker supervisor、compose

2018-06-08 18:10 更新

防偽碼:有志不在年高,無(wú)志空活百歲。

一、使用 Supervisor 來(lái)管理進(jìn)程

Docker 容器在啟動(dòng)的時(shí)候開(kāi)啟單個(gè)進(jìn)程,比如,一個(gè) ssh 或者 apache 的 daemon 服務(wù)。但我們經(jīng)常需要在一個(gè)機(jī)器上開(kāi)啟多個(gè)服務(wù),這可以有很多方法,最簡(jiǎn)單的就是把多個(gè)啟動(dòng)命令放到一個(gè)啟動(dòng)腳本里面,啟動(dòng)的時(shí)候直接啟動(dòng)這個(gè)腳本。

例如:docker  run  –d  鏡像  /run.sh

另外就是安裝進(jìn)程管理工具。

本節(jié)將使用進(jìn)程管理工具 supervisor 來(lái)管理容器中的多個(gè)進(jìn)程。使用 Supervisor 可以更好的控制、管理、重啟我們希望運(yùn)行的進(jìn)程。

Supervisor是一個(gè)進(jìn)程控制系統(tǒng). 它是一個(gè)C/S系統(tǒng)(注意: 其提供WEB接口給用戶查詢和控制), 它允許用戶去監(jiān)控和控制在類UNIX系統(tǒng)的進(jìn)程。

在這里我們演示一下如何同時(shí)使用 ssh 和 apache 服務(wù)。

配置

首先創(chuàng)建一個(gè) Dockerfile,內(nèi)容和各部分的解釋如下。

創(chuàng)建一個(gè)dockerfile的目錄

dockerfile文件內(nèi)容

supervisor  配置文件內(nèi)容

第一段 supervsord 配置軟件本身,使用 nodaemon 參數(shù)來(lái)運(yùn)行。nodaemon=true 如果是true,supervisord進(jìn)程將在前臺(tái)運(yùn)行,默認(rèn)為false,也就是后臺(tái)以守護(hù)進(jìn)程運(yùn)行。

下面2段包含我們要控制的 2 個(gè)服務(wù)。每一段包含一個(gè)服務(wù)的目錄和啟動(dòng)這個(gè)服務(wù)的命令

/docker/apache目錄內(nèi)容列表

使用方法

創(chuàng)建 image

# docker build -t centos:supervisord .

查看鏡像

啟動(dòng)我們的 supervisor 容器

測(cè)試:訪問(wèn)容器提供的web和ssh服務(wù)(在之前的博客上有詳解,此處不再 贅述)

二、Docker Compose 項(xiàng)目

compose項(xiàng)目簡(jiǎn)介

compose項(xiàng)目來(lái)源于之前的Fig項(xiàng)目,使用python代碼編寫。compose項(xiàng)目主要用于編排部署基于docker的應(yīng)用。本身與docker/swarm配合度很高。

Docker Compose 是 Docker 編排服務(wù)的一部分,可以讓用戶在其它平臺(tái)快速安裝Docker,Swarm 可以讓 Docker 容器在集群中高效運(yùn)轉(zhuǎn),而 Compose 可以讓用戶在集群中部署分布式應(yīng)用。簡(jiǎn)單的說(shuō),Docker Compose 屬于一個(gè)“應(yīng)用層”的服務(wù),用戶可以定義哪個(gè)容器組運(yùn)行哪個(gè)應(yīng)用,它支持動(dòng)態(tài)改變應(yīng)用,并在需要時(shí)擴(kuò)展。 
相對(duì)于kubernetes來(lái)說(shuō)功能比較簡(jiǎn)單,相當(dāng)于kubernetes的一個(gè)子集。

 

dockerfile可以讓用戶管理一個(gè)單獨(dú)的應(yīng)用容器,而Compose則允許用戶在一個(gè)模板(yaml格式)中定義一組相關(guān)聯(lián)的應(yīng)用容器(被稱為一個(gè)Project,即項(xiàng)目),例如一個(gè)調(diào)度器,兩個(gè)web服務(wù)容器再加上后端的數(shù)據(jù)庫(kù)服務(wù)容器等。

安裝Compose之前,要先安裝docker,這里就不說(shuō)了,

安裝Docker-compose

先安裝pip

注:pip類似RedHat里面的yum,安裝Python包非常方便

#wget  https://bootstrap.pypa.io/get-pip.py

#python get-pip.py

再安裝compose

安裝成功后,可以查看  docker-compose 的版本和 命令的用法。

#docker-compose  -v

#docker-compose  -h

首先介紹幾個(gè)術(shù)語(yǔ)。

服務(wù)(service):一個(gè)應(yīng)用容器,實(shí)際上可以運(yùn)行多個(gè)相同鏡像的實(shí)例。

項(xiàng)目(project):由一組關(guān)聯(lián)的應(yīng)用容器組成的一個(gè)完整業(yè)務(wù)單元。

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

 

docker-compose 命令說(shuō)明

大多數(shù)Compose命令都是運(yùn)行于一個(gè)或多個(gè)服務(wù)的,如果服務(wù)沒(méi)有指定,該命令將會(huì)應(yīng)用到所有服務(wù),如果要獲得所有可用信息,使用命令:docker-compose [COMMAND] --help,下面是命令(COMMAND)的說(shuō)明:


build 創(chuàng)建或者再建服務(wù) 服務(wù)被創(chuàng)建后會(huì)標(biāo)記為project_service(比如composetest_db),如果改變了一個(gè)服務(wù)的Dockerfile或者構(gòu)建目錄的內(nèi)容,可以使用docker-compose build來(lái)重建它

 

help 顯示命令的幫助和使用信息

 

kill 通過(guò)發(fā)送SIGKILL的信號(hào)強(qiáng)制停止運(yùn)行的容器,這個(gè)信號(hào)可以選擇性的通過(guò),比如: docker-compose kill -s SIGKINT

 

logs 顯示服務(wù)的日志輸出

 

port 為端口綁定輸出公共信息

 

ps 顯示容器

 

pull 拉取服務(wù)鏡像

 

rm 刪除停止的容器

 

run 在服務(wù)上運(yùn)行一個(gè)一次性命令,比如: docker-compose run web Python manage.py shell


scale 設(shè)置為一個(gè)服務(wù)啟動(dòng)的容器數(shù)量,數(shù)量是以這樣的參數(shù)形式指定的:service=num,比如: docker-compose scale web=2 worker=3

 

start 啟動(dòng)已經(jīng)存在的容器作為一個(gè)服務(wù)

 

stop 停止運(yùn)行的容器而不刪除它們,它們可以使用命令docker-compose start重新啟動(dòng)起來(lái)

 

up 為一個(gè)服務(wù)構(gòu)建、創(chuàng)建、啟動(dòng)、附加到容器 連接的服務(wù)會(huì)被啟動(dòng),除非它們已經(jīng)在運(yùn)行了 

運(yùn)行docker-compose up -d會(huì)在后臺(tái)啟動(dòng)容器并使它們運(yùn)行 

 

–verbose 顯示更多輸出

 

–version 顯示版本號(hào)并退出

 

-f,–file FILE 指定一個(gè)可選的Compose yaml文件(默認(rèn):docker-compose.yml)

 

-p,–project-name NAME 指定可選的項(xiàng)目名稱(默認(rèn):當(dāng)前目錄名稱)

 

docker-compose.yml命令說(shuō)明  

每一個(gè)定義在docker-compose.yml中的服務(wù)必須明確指定一個(gè)image或者build選項(xiàng),這與docker run命令行中輸入的是對(duì)應(yīng)相同的,對(duì)于docker run,在Dockerfile文件中指定的選項(xiàng)(比如CMD、EXPOSE、VOLUME、ENV)是默認(rèn)的,因此不必在docker-compose.yml中再指定一次

 

image  

標(biāo)明image的ID,這個(gè)image ID可以是本地也可以是遠(yuǎn)程的,如果本地不存在,Compose會(huì)嘗試去pull下來(lái)

image: ubuntu    

image: orchardup/postgresql    

image: a4bc65fd    

 

build  

該參數(shù)指定Dockerfile文件的路徑,該目錄也是發(fā)送到守護(hù)進(jìn)程的構(gòu)建環(huán)境(這句有點(diǎn)),Compose將會(huì)以一個(gè)已存在的名稱進(jìn)行構(gòu)建并標(biāo)記,并隨后使用這個(gè)image

build: /path/to/build/dir    

 

command  

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

command: 要執(zhí)行的命令    

 

links  

連接到其他服務(wù)中的容器,可以指定服務(wù)名稱和這個(gè)鏈接的別名,或者只指定服務(wù)名稱  

links:    

 - db    

 - db:database    

 - redis    

此時(shí),在容器內(nèi)部,會(huì)在/etc/hosts文件中用別名創(chuàng)建一個(gè)條目,就像這樣:  

172.17.2.186  db    

172.17.2.186  database    

172.17.2.186  redis    

 

環(huán)境變量也會(huì)被創(chuàng)建,關(guān)于環(huán)境變量的參數(shù),會(huì)在后面講到  

 

external_links  

連接到在這個(gè)docker-compose.yml文件或者Compose外部啟動(dòng)的容器,特別是對(duì)于提供共享和公共服務(wù)的容器。在指定容器名稱和別名時(shí),external_links遵循著和links相同的語(yǔ)義用法

external_links:    

 - redis_1    

 - project_db_1:mysql    

 - project_db_1:postgresql    

 

ports  

暴露端口,指定兩者的端口(主機(jī):容器),或者只是容器的端口(主機(jī)會(huì)被隨機(jī)分配一個(gè)端口)  

注:當(dāng)以 主機(jī):容器 的形式來(lái)映射端口時(shí),如果使容器的端口小于60,那可能會(huì)出現(xiàn)錯(cuò)誤,因?yàn)閅AML會(huì)將 xx:yy這樣格式的數(shù)據(jù)解析為六十進(jìn)制的數(shù)據(jù),基于這個(gè)原因,時(shí)刻記得要將端口映射明確指定為字符串

ports:    

 - "3000"    

 - "8000:8000"    

 - "49100:22"    

 - "127.0.0.1:8001:8001"    

 

expose  

暴露端口而不必向主機(jī)發(fā)布它們,而只是會(huì)向鏈接的服務(wù)(linked service)提供,只有內(nèi)部端口可以被指定  

 

expose:    

 - "3000"    

 - "8000"    

 

volumes  

掛載路徑最為卷,可以選擇性的指定一個(gè)主機(jī)上的路徑(主機(jī):容器),或是一種可使用的模式(主機(jī):容器:ro)  

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

 

volumes_from:    

從另一個(gè)服務(wù)或容器掛載它的所有卷。

volumes_from:  

- service_name    

 - container_name    

 

environment  

加入環(huán)境變量,可以使用數(shù)組或者字典,只有一個(gè)key的環(huán)境變量可以在運(yùn)行Compose的機(jī)器上找到對(duì)應(yīng)的值,這有助于加密的或者特殊主機(jī)的值

environment:    

  RACK_ENV: development    

  SESSION_SECRET:    

environments:    

  - RACK_ENV=development    

  - SESSION_SECRET    

 

env_file  

從一個(gè)文件中加入環(huán)境變量

如果通過(guò) docker-compose -f FILE 指定了模板文件,則 env_file 中路徑會(huì)基于模板文件路徑。如果有變量名稱與 environment 指令沖突,則以后者為準(zhǔn)。

env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
環(huán)境變量文件中每一行必須符合格式,支持 # 開(kāi)頭的注釋行。
# common.env: Set Rails/Rack environment
RACK_ENV=development
 

 

net  

網(wǎng)絡(luò)模式,可以在docker客戶端的--net參數(shù)中指定這些值  

net: "bridge"    

net: "none"    

net: "container:[name or id]"    

net: "host"    

 

dns  

自定義DNS服務(wù),可以是一個(gè)單獨(dú)的值或者一張列表  

dns: 8.8.8.8    

dns:    

  - 8.8.8.8    

  - 9.9.9.9    

 

dns_search  

自定義DNS搜索范圍,可以是單獨(dú)的值或者一張列表  

 

dns_search: example.com    

dns_search:    

  - dc1.example.com    

  - dc2.example.com    

 

使用Compose只需要簡(jiǎn)單的三個(gè)步驟:

首先,使用Dockerfile或docker  commit來(lái)定義你的應(yīng)用環(huán)境

第二步,用一個(gè)docker-compose.yml來(lái)定義你的應(yīng)用,他們可以在下個(gè)互隔離的容器中組成你的應(yīng)用。

第三步,執(zhí)行docker-compose up  -d來(lái)啟動(dòng)你的應(yīng)用,它會(huì)根據(jù)docker-compose.yml的設(shè)置來(lái)pull/run相關(guān)的容器。

 

測(cè)試案例:

下面,我們創(chuàng)建一個(gè)經(jīng)典的 Web 項(xiàng)目:一個(gè) Haproxy,掛載三個(gè) Web 容器。

 

docker-haproxy目錄,作為項(xiàng)目工作目錄,并在其中分別創(chuàng)建兩個(gè)子目錄: haproxy  和web。

#mkdir  -p  /root/docker-haproxy/{haproxy,web}

在/root/docker-haproxy/目錄下創(chuàng)建docker-compose.yml文件

在/root/docker-haproxy/haproxy目錄下創(chuàng)建haproxy的主配置文件haproxy.cfg

在/root/docker-haproxy/web目錄下存放web站點(diǎn)網(wǎng)頁(yè)文件

目錄結(jié)構(gòu)如下圖所示:

Web 子目錄:

生成一個(gè)index.html文件,其內(nèi)容:

haproxy 目錄:

在其中生成一個(gè)  haproxy.cfg  文件

docker-compose.yml

編寫 docker-compose.yml 文件,這個(gè)是 Compose 使用的主模板文件。內(nèi)容十分簡(jiǎn)單,指定 3 個(gè) web 容器,以及 1 個(gè) haproxy 容器。

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

在docker-haproxy目錄下執(zhí)行docker-compose up  -d來(lái)啟動(dòng)你的應(yīng)用

#cd docker-haproxy

查看容器啟動(dòng)情況

 


打開(kāi)瀏覽器本機(jī)本機(jī)IP:http://192.168.1.105

打開(kāi)瀏覽器本機(jī)本機(jī)IP:http://192.168.1.105:70

謝謝觀看,真心的希望能幫到您!

 

本文出自 “一盞燭光” 博客,謝絕轉(zhuǎn)載!

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)