supervisor工具實現自動化docker服務運行

             Supervisor工具實現自動化docker服務運行html

 

1、使用 Supervisor 來管理進程python

Docker 容器在啓動的時候開啓單個進程,好比,一個 ssh 或者 apache daemon 服務。但咱們常常須要在一個機器上開啓多個服務,這能夠有不少方法,最簡單的就是把多個啓動命令放到一個啓動腳本里面,啓動的時候直接啓動這個腳本。mysql

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

另外就是安裝進程管理工具。redis

本節將使用進程管理工具 supervisor 來管理容器中的多個進程。使用 Supervisor 能夠更好的控制、管理、重啓咱們但願運行的進程。sql

Supervisor是一個進程控制系統. 它是一個C/S系統(注意: 其提供WEB接口給用戶查詢和控制), 它容許用戶去監控和控制在類UNIX系統的進程docker

在這裏咱們演示一下如何同時使用 ssh apache 服務。shell

配置數據庫

首先建立一個 Dockerfile,內容和各部分的解釋以下。apache

建立一個dockerfile的目錄

wKiom1kkQUDz4qgxAAAOLzVazhU107.png-wh_50 

dockerfile文件內容

wKiom1kkQXXQ4EaAAADK72cvwXQ750.png-wh_50 

supervisor  配置文件內容

wKiom1kkQYuxlfYeAAAjagl-ZB4293.png-wh_50 

第一段 supervsord 配置軟件自己,使用 nodaemon 參數來運行。nodaemon=true 若是是truesupervisord進程將在前臺運行,默認爲false,也就是後臺以守護進程運行。

下面2段包含咱們要控制的 2 個服務。每一段包含一個服務的目錄和啓動這個服務的命令

/docker/apache目錄內容列表

wKiom1kkQb-iv9NoAAANe3TpgL0419.png-wh_50 

使用方法

建立 p_w_picpath

# docker build -t centos:supervisord  .

wKioL1kkQdSijwkaAAAx_rSebPc217.png-wh_50 

查看鏡像

wKiom1kkQefw8topAAAiOYOs0Oc477.png-wh_50 

啓動咱們的 supervisor 容器

wKiom1kkQgiQCI7cAABVKZ-1114220.png-wh_50 

測試:訪問容器提供的webssh服務

2、Docker Compose 項目

compose項目簡介

compose項目來源於以前的Fig項目,使用python代碼編寫。compose項目主要用於編排部署基於docker的應用。自己與dockerswarm配合度很高。

Docker Compose Docker 編排服務的一部分,可讓用戶在其它平臺快速安裝DockerSwarm 可讓 Docker 容器在集羣中高效運轉,而 Compose 可讓用戶在集羣中部署分佈式應用。簡單的說,Docker Compose 屬於一個「應用層」的服務,用戶能夠定義哪一個容器組運行哪一個應用,它支持動態改變應用,並在須要時擴展。 
相對於kubernetes來講功能比較簡單,至關於kubernetes的一個子集。

 

dockerfile可讓用戶管理一個單獨的應用容器,Compose則容許用戶在一個模板(yaml格式)中定義一組相關聯的應用容器(被稱爲一個Project,即項目),例如一個調度器,兩個web服務容器再加上後端的數據庫服務容器等。

wKiom1kkQiTQIBr-AACkQBf4p9k491.png-wh_50 

 

安裝Compose以前,要先安docker,裏就不說了,

安裝Docker-compose

先安裝pip

注:pip相似RedHat裏面的yum,安裝Python包很是方便

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

wKiom1kkQjugNyYnAABvlhM5K3A351.png-wh_50 

#python get-pip.py

wKioL1kkQmDThrN5AABTEcBzb8U879.png-wh_50 

再安裝compose

wKiom1kkQojwaMGwAAAKcsShwqc364.png-wh_50 

 wKioL1kkQp3wOZjYAAALpK9mWB4671.png-wh_50

安裝成功後,能夠查看  docker-compose 的版本和 命令的用法。

#docker-compose  -v

wKioL1kkQrKiVmAiAAASTVnQbak483.png-wh_50 

#docker-compose  -h

wKiom1kkQsXByuBGAAAxWsKBXFg111.png-wh_50 

 

首先介紹幾個術語。

服務(service):一個應用容器,實際上能夠運行多個相同鏡像的實例。

項目(project):由一組關聯的應用容器組成的一個完整業務單元。

可見,一個項目能夠由多個服務(容器)關聯而成,Compose 面向項目進行管理。

 

docker-compose 命令說明

大多數Compose命令都是運行於一個或多個服務的,若是服務沒有指定,該命令將會應用到全部服務,若是要得到全部可用信息,使用命令:docker-compose [COMMAND] --help,下面是命令(COMMAND)的說明:

build 
建立或者再建服務 
服務被建立後會標記爲project_service(好比composetest_db),若是改變了一個服務的Dockerfile或者構建目錄的內容,可使用docker-compose build來重建它

 

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

 

kill 
經過發送SIGKILL的信號強制中止運行的容器,這個信號能夠選擇性的經過,好比: 
docker-compose kill -s SIGKINT

 

logs 
顯示服務的日誌輸出

 

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

 

ps 
顯示容器

 

pull 
拉取服務鏡像

 

rm 
刪除中止的容器

 

run 
在服務上運行一個一次性命令,好比: 
docker-compose run web Python manage.py shell

 

scale 
設置爲一個服務啓動的容器數量,數量是以這樣的參數形式指定的:service=num,好比: 
docker-compose scale web=2 worker=3

 

start 
啓動已經存在的容器做爲一個服務

 

stop 
中止運行的容器而不刪除它們,它們可使用命令docker-compose start從新啓動起來

 

up 
爲一個服務構建、建立、啓動、附加到容器 
鏈接的服務會被啓動,除非它們已經在運行了 

運行docker-compose up -d會在後臺啓動容器並使它們運行 

 

–verbose 
顯示更多輸出

 

–version 
顯示版本號並退出

 

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

 

-p,–project-name NAME 
指定可選的項目名稱(默認:當前目錄名稱)

 

docker-compose.yml命令說明  

每個定義在docker-compose.yml中的服務必須明確指定一個p_w_picpath或者build選項,這與docker run命令行中輸入的是對應相同的,對於docker run,在Dockerfile文件中指定的選項(好比CMDEXPOSEVOLUMEENV)是默認的,所以沒必要在docker-compose.yml中再指定一次  

 

p_w_picpath   

標明p_w_picpathID,這個p_w_picpath ID能夠是本地也能夠是遠程的,若是本地不存在,Compose會嘗試去pull下來

p_w_picpath: ubuntu    

p_w_picpath: orchardup/postgresql    

p_w_picpath: a4bc65fd    

 

build   

該參數指定Dockerfile文件的路徑,該目錄也是發送到守護進程的構建環境(這句有點),Compose將會以一個已存在的名稱進行構建並標記,並隨後使用這個p_w_picpath  

build: /path/to/build/dir    

 

command   

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

command: 要執行的命令    

 

links   

鏈接到其餘服務中的容器,能夠指定服務名稱和這個連接的別名,或者只指定服務名稱  

links:    

 - db    

 - db:database    

 - redis    

此時,在容器內部,會在/etc/hosts文件中用別名建立一個條目,就像這樣:  

172.17.2.186  db    

172.17.2.186  database    

172.17.2.186  redis    

 

環境變量也會被建立,關於環境變量的參數,會在後面講到  

 

external_links   

鏈接到在這個docker-compose.yml文件或者Compose外部啓動的容器,特別是對於提供共享和公共服務的容器。在指定容器名稱和別名時,external_links遵循着和links相同的語義用法  

external_links:    

 - redis_1    

 - project_db_1:mysql    

 - project_db_1:postgresql    

 

ports   

暴露端口,指定二者的端口(主機:容器),或者只是容器的端口(主機會被隨機分配一個端口)  

注:當以 主機:容器 的形式來映射端口時,若是使容器的端口小於60,那可能會出現錯誤,由於YAML會將 xx:yy這樣格式的數據解析爲六十進制的數據,基於這個緣由,時刻記得要將端口映射明確指定爲字符串  

ports:    

 - "3000"    

 - "8000:8000"    

 - "49100:22"    

 - "127.0.0.1:8001:8001"    

 

expose   

暴露端口而沒必要向主機發布它們,而只是會向連接的服務(linked service)提供,只有內部端口能夠被指定  

 

expose:    

 - "3000"    

 - "8000"    

 

volumes   

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

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

 

volumes_from:    

從另外一個服務或容器掛載它的全部卷。

volumes_from:  

- service_name    

 - container_name    

 

environment   

加入環境變量,可使用數組或者字典,只有一個key的環境變量能夠在運行Compose的機器上找到對應的值,這有助於加密的或者特殊主機的值  

environment:    

  RACK_ENV: development    

  SESSION_SECRET:    

environments:    

  - RACK_ENV=development    

  - SESSION_SECRET    

  

env_file   

從一個文件中加入環境變量

若是經過 docker-compose -f FILE 指定了模板文件,則 env_file 中路徑會基於模板文件路徑。若是有變量名稱與 environment 指令衝突,則之後者爲準。

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

 

net   

網絡模式,能夠在docker客戶端的--net參數中指定這些值  

net: "bridge"    

net: "none"    

net: "container:[name or id]"    

net: "host"    

 

dns   

自定義DNS服務,能夠是一個單獨的值或者一張列表  

dns: 8.8.8.8    

dns:    

  - 8.8.8.8    

  - 9.9.9.9    

  

dns_search   

自定義DNS搜索範圍,能夠是單獨的值或者一張列表  

  

dns_search: example.com    

dns_search:    

  - dc1.example.com    

  - dc2.example.com    

 

使用Compose只須要簡單的三個步驟:

首先,使用Dockerfiledocker  commit來定義你的應用環境

第二步,用一個docker-compose.yml來定義你的應用,他們能夠在下個互隔離的容器中組成你的應用。

第三步,執行docker-compose up  -d來啓動你的應用,它會根據docker-compose.yml的設置來pull/run相關的容器。

 

測試案例

下面,咱們建立一個經典的 Web 項目:一個 Haproxy,掛載三個 Web 容器。

 

docker-haproxy目錄,做爲項目工做目錄,並在其中分別建立兩個子目錄: haproxy  web

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

/root/docker-haproxy/目錄下建立docker-compose.yml文件

/root/docker-haproxy/haproxy目錄下建立haproxy的主配置文件haproxy.cfg

/root/docker-haproxy/web目錄下存放web站點網頁文件

目錄結構以下圖所示:

wKiom1kkQvTxtCrzAAA680RlS0Y358.png-wh_50 

Web 子目錄:

生成一個index.html文件,其內容:

wKioL1kkQwbw0qipAAAOPjPDbe0934.png-wh_50 

haproxy 目錄:

在其中生成一個  haproxy.cfg  文件

wKiom1kkQxvxBEenAACeZ855wU4873.png-wh_50 

docker-compose.yml

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

 

 wKioL1kkQ7WShqizAACcrnOkoBk595.png-wh_50

運行 compose 項目:

docker-haproxy目錄下執行docker-compose up  -d來啓動你的應用

#cd docker-haproxy

 wKioL1kkQ8uD1jMNAAAVSREdlG4576.png-wh_50

查看容器啓動狀況

 wKioL1kkQ-exM4jbAACHFvEN_4E791.png-wh_50

 wKiom1kkRBTSCLiQAABaDQZ6zDc769.png-wh_50

 

打開瀏覽器本機本機IPhttp://192.168.1.105

wKiom1kkRCeBOn-NAAAfRguD9Qc200.png-wh_50 

打開瀏覽器本機本機IPhttp://192.168.1.105:70

wKioL1kkRD3iRxqHAAELwXC3aSk560.png-wh_50 

相關文章
相關標籤/搜索