天天看點

Docker Compose 項目

二、Docker Compose 項目

compose項目簡介

compose項目來源于之前的Fig項目,使用python代碼編寫。compose項目主要用于編排部署基于docker的應用。本身與docker/swarm配合度很高。

Docker Compose 是 Docker 編排服務的一部分,可以讓使用者在其它平台快速安裝Docker,Swarm 可以讓 Docker 容器在叢集中高效運轉,而 Compose 可以讓使用者在叢集中部署分布式應用。簡單的說,Docker Compose 屬于一個“應用層”的服務,使用者可以定義哪個容器組運作哪個應用,它支援動态改變應用,并在需要時擴充。 

相對于kubernetes來說功能比較簡單,相當于kubernetes的一個子集。

dockerfile可以讓使用者管理一個單獨的應用容器,而Compose則允許使用者在一個模闆(yaml格式)中定義一組相關聯的應用容器(被稱為一個Project,即項目),例如一個排程器,兩個web服務容器再加上後端的資料庫服務容器等。

<a href="https://s3.51cto.com/wyfs02/M02/05/B0/wKiom1mpXD-TpYEmAACkQBf4p9k834.png-wh_500x0-wm_3-wmp_4-s_910266682.png" target="_blank"></a>

安裝Compose之前,要先安裝docker,這裡就不說了,

安裝Docker-compose

先安裝pip

注:pip類似RedHat裡面的yum,安裝Python包非常友善

<code>[root@localhost apache]</code><code># cat dockerfile </code>

<code>FROM docker.wang.com</code><code>/centos</code><code>:centos7</code>

<code>MAINTAINER from [email protected]</code>

<code>RUN yum -y </code><code>install</code> <code>python-setuptools</code>

<code>RUN yum -y </code><code>install</code> <code>openssh-server  httpd  </code><code>sudo</code>

<code>RUN yum  -y  </code><code>install</code>  <code>sudo</code>  <code>net-tools</code>

<code>RUN   yum -y  </code><code>install</code>  <code>sudo</code> <code>bind-utils</code>

<code>RUN </code><code>useradd</code> <code>admin</code>

<code>RUN </code><code>echo</code> <code>"admin:admin"</code> <code>| chpasswd</code>

<code>RUN </code><code>echo</code> <code>"admin ALL=(ALL) ALL"</code> <code>&gt;&gt; </code><code>/etc/sudoers</code>

<code>RUN </code><code>ssh</code><code>-keygen -t dsa -f </code><code>/etc/ssh/ssh_host_dsa_key</code>

<code>RUN </code><code>ssh</code><code>-keygen -t rsa -f </code><code>/etc/ssh/ssh_host_rsa_key</code>

<code>RUN </code><code>ssh</code><code>-keygen -t ed25519 -f </code><code>/etc/ssh/ssh_host_ed25519_key</code>

<code>RUN </code><code>ssh</code><code>-keygen -t ecdsa -f </code><code>/etc/ssh/ssh_host_ecdsa_key</code>

<code>RUN </code><code>mkdir</code> <code>-p </code><code>/var/run/sshd</code>

<code>RUN </code><code>mkdir</code> <code>-p </code><code>/home/admin/</code><code>.</code><code>ssh</code>

<code>RUN </code><code>sed</code> <code>-ri </code><code>'s/session    required     pam_loginuid.so/#session    required     pam_loginuid.so/g'</code> <code>/etc/pam</code><code>.d</code><code>/sshd</code>

<code>RUN </code><code>sed</code> <code>-ri </code><code>'s/#ServerName www.example.com:80/ServerName www.benet.com/g'</code> <code>/etc/httpd/conf/httpd</code><code>.conf</code>

<code>COPY supervisord.conf </code><code>/etc/supervisor/supervisord</code><code>.conf</code>

<code>EXPOSE 22 80 </code>

<code>CMD [</code><code>"/bin/bash"</code><code>,</code><code>"/run.sh"</code><code>]</code>

<code>[root@localhost apache]</code><code># cat supervisord.conf </code>

<code>[supervisord]</code>

<code>nodaemon=</code><code>true</code>

<code>[program:sshd]</code>

<code>command</code><code>=</code><code>/usr/sbin/sshd</code> <code>-D</code>

<code> </code> 

<code>[program:httpd]</code>

<code>command</code><code>=</code><code>/usr/sbin/httpd</code> <code>-DFOREGROUND</code>

<code>[root@localhost apache]</code><code># ls</code>

<code>centos7.</code><code>tar</code>  <code>dockerfile  supervisord.conf</code>

root@localhost apache]# docker build -t centos:supervisord .

<a href="https://s5.51cto.com/wyfs02/M02/05/B0/wKiom1mpXO_xmWtaAAAYSX2-rZw207.png-wh_500x0-wm_3-wmp_4-s_4225206554.png" target="_blank"></a>

#python get-pip.py

<a href="https://s2.51cto.com/wyfs02/M02/A4/61/wKioL1mpXOiwL1TiAAAefzMA9ZQ772.png-wh_500x0-wm_3-wmp_4-s_1198061883.png" target="_blank"></a>

再安裝compose

<a href="https://s4.51cto.com/wyfs02/M00/05/B0/wKiom1mpXQygfyX7AAAkr09kgAg113.png-wh_500x0-wm_3-wmp_4-s_1593402355.png" target="_blank"></a>

<code>[root@localhost apache]</code><code># ln -s /usr/bin/docker-compose /usr/local/bin/</code>

安裝成功後,可以檢視  docker-compose 的版本和 指令的用法。

#docker-compose  -v

<code>[root@localhost apache]</code><code># docker-compose -v</code>

<code>docker-compose version 1.16.0, build ea60ca1</code>

#docker-compose  -h   檢視幫助

首先介紹幾個術語。

服務(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 

在服務上運作一個一次性指令,比如: 

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中的服務必須明确指定一個image或者build選項,這與docker run指令行中輸入的是對應相同的,對于docker run,在Dockerfile檔案中指定的選項(比如CMD、EXPOSE、VOLUME、ENV)是預設的,是以不必在docker-compose.yml中再指定一次  

image   

标明image的ID,這個image ID可以是本地也可以是遠端的,如果本地不存在,Compose會嘗試去pull下來

image: ubuntu    

image: orchardup/postgresql    

image: a4bc65fd    

build   

該參數指定Dockerfile檔案的路徑,該目錄也是發送到守護程序的建構環境(這句有點),Compose将會以一個已存在的名稱進行建構并标記,并随後使用這個image  

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:    

 - "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隻需要簡單的三個步驟:

首先,使用Dockerfile或docker  commit來定義你的應用環境

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

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

我們建立一個經典的 Web 項目:一個 Haproxy,挂載三個 Web 容器。

docker-haproxy目錄,作為項目工作目錄,并在其中分别建立兩個子目錄: haproxy  和web。

<code>[root@localhost apache]</code><code># mkdir -p /root/docker-haproxy/{haproxy,web}</code>

在/root/docker-haproxy/目錄下建立docker-compose.yml檔案

在/root/docker-haproxy/haproxy目錄下建立haproxy的主配置檔案haproxy.cfg

在/root/docker-haproxy/web目錄下存放web站點網頁檔案

目錄結構如下圖所示:

<a href="https://s3.51cto.com/wyfs02/M00/A4/61/wKioL1mpXVXik-e4AAAMCy2M3G8274.png-wh_500x0-wm_3-wmp_4-s_2621964822.png" target="_blank"></a>

Web 子目錄:

生成一個index.html檔案,其内容:

<code>[root@localhost docker-haproxy]</code><code># cat web/index.html </code>

<code>鑫旺 威武</code>

<code>aproxy 目錄:</code>

<code>在其中生成一個  haproxy.cfg  檔案</code>

<code>[root@localhost haproxy]</code><code># cat haproxy.cfg </code>

<code>global</code>

<code>  </code><code>log 127.0.0.1 local0</code>

<code>  </code><code>log 127.0.0.1 local1 notice</code>

<code>defaults</code>

<code>  </code><code>log global</code>

<code>  </code><code>mode http</code>

<code>  </code><code>option httplog</code>

<code>  </code><code>option dontlognull</code>

<code>  </code><code>timeout connect 5000ms</code>

<code>  </code><code>timeout client 50000ms</code>

<code>  </code><code>timeout server 50000ms</code>

<code>listen stats</code>

<code>    </code><code>bind 0.0.0.0:70</code>

<code>    </code><code>stats </code><code>enable</code>

<code>    </code><code>stats uri /</code>

<code>frontend balancer</code>

<code>    </code><code>bind 0.0.0.0:80</code>

<code>    </code><code>mode http</code>

<code>    </code><code>default_backend web_backends</code>

<code>backend web_backends</code>

<code>    </code><code>option forwardfor</code>

<code>    </code><code>balance roundrobin</code>

<code>    </code><code>server weba weba:80 check</code>

<code>    </code><code>server webb webb:80 check</code>

<code>    </code><code>server webc webc:80 check</code>

<code>    </code><code>option httpchk GET /</code>

<code>docker-compose.yml</code>

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

<code>[root@localhost docker-haproxy]</code><code># vim docker-compose.yml </code>

<code>weba:</code>

<code>  </code><code>image: centos:supervisord</code>

<code>  </code><code>volumes:</code>

<code>    </code><code>- </code><code>/root/docker-haproxy/web/</code><code>:</code><code>/var/www/html/</code>

<code>  </code><code>expose:</code>

<code>    </code><code>- 80</code>

<code>webb:</code>

<code>webc:</code>

<code>haproxy:</code>

<code>    </code><code>- </code><code>/root/docker-haproxy/haproxy/</code><code>:</code><code>/etc/haproxy/</code><code>:ro</code>

<code>  </code><code>command</code><code>: </code><code>/usr/local/haproxy/sbin/haproxy</code> <code>-f </code><code>/etc/haproxy/haproxy</code><code>.cfg</code>

<code>  </code><code>links:</code>

<code>    </code><code>- weba</code>

<code>    </code><code>- webb</code>

<code>    </code><code>- webc</code>

<code>  </code><code>ports:</code>

<code>    </code><code>- </code><code>"80:80"</code>

<code>    </code><code>- </code><code>"70:70"</code>

運作 compose 項目:

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

#cd docker-haproxy

<code>[root@localhost docker-haproxy]</code><code># docker-compose up -d</code>

檢視容器啟動情況

<code>[root@localhost docker-haproxy]</code><code># docker ps</code>

打開浏覽器本機本機IP 192.168.100.15

     本文轉自柴鑫旺 51CTO部落格,原文連結:http://blog.51cto.com/chaixinwang/1962048,如需轉載請自行聯系原作者

繼續閱讀