天天看點

容器編排 Docker Compose

在我們啟動容器的時候經常要使用docker run 指定很多參數,當我們需要管理很多容器時,使用這樣的方式會給我們的運維人員帶來很大的負擔,docker compose容器編排工具無疑是解決這個一問題的利器。

Docker Compose是用來管理多容器應用的工具,我們可以使用compose file 檔案來配置容器的應用和服務,編寫好compose file 檔案以後,我們隻需要使用一條簡單的指令就可以建立并啟動我們需要的應用。

使用compose一般有三個步驟:

1、編寫Dockerfile,定義鏡像的建構參數。

2、編寫docker-compose.yml檔案,定義應用的挂載,環境變量,啟動參數等。

3、執行 docker-compose up 指令,自動執行建構鏡像并啟動容器和應用。

安裝Compose

這裡隻介紹Linux環境下的安裝。

執行如下指令:

1

<code>curl -L https:</code><code>//github</code><code>.com</code><code>/docker/compose/releases/download/1</code><code>.14.0</code><code>/docker-compose-</code><code>`</code><code>uname</code> <code>-s`-`</code><code>uname</code> <code>-m` &gt; </code><code>/usr/local/bin/docker-compose</code>

對檔案添加執行權限:

<code> </code><code>chmod</code> <code>+x </code><code>/usr/local/bin/docker-compose</code>

安裝完成後,執行compose指令驗證是否安裝成功:

2

3

<code># docker-compose --version</code>

<code>docker-compose version 1.14.0, build c7bdf9e</code>

Compose file 常用文法介紹

compose使用的是YAML格式的檔案,我們可以使用它來定義服務、網絡和卷。compose file的固定命名為 docker-compose.yml。

build: 建構鏡像,指定建構的路徑,檔案,源鏡像等資訊。

4

5

6

<code>build:</code>

<code>  </code><code>context: .             </code><code># 指定Dockerfile的建構路徑,或者是一個url的git倉庫位址</code>

<code>  </code><code>dockerfile: Dockerfile-abcd  </code><code>#可以指定Dockerfile的名稱,如果不是預設名稱時。</code>

<code>  </code><code>args:    </code><code>#添加建構參數,環境變量參數隻能在建構過程中通路,使用時需要先在Dockerfile中定義。</code>

<code>    </code><code>- buildno=1  </code><code>#yaml文法,‘=’兩邊不能有空格</code>

<code>    </code><code>- password=secret </code><code>#也可以使用清單的方式  'password: secret'</code>

 command: 用于重新覆寫Dockerfile中的COMMAND指令。

<code>command</code><code>: COMMAND args</code>

也可以使用清單的形式:

<code>command</code><code>: [</code><code>"comand1"</code><code>, </code><code>"command2"</code><code>]</code>

devices: 映射主控端的裝置到容器中。

<code>devices:</code>

<code>  </code><code>- </code><code>"/dev/ttyUSB0:/dev/ttyUSB0"</code>

depends_on: 執行此子產品的行為時,所依賴的其他子產品必須已經完成。

7

8

9

10

<code>services:</code>

<code>  </code><code>web:</code>

<code>    </code><code>build: .</code>

<code>    </code><code>depends_on:</code>

<code>      </code><code>- db</code>

<code>      </code><code>- redis</code>

<code>  </code><code>redis:</code>

<code>    </code><code>image: redis</code>

<code>  </code><code>db:</code>

<code>    </code><code>image: postgres</code>

dns: 指定dns.

<code>dns: 8.8.8.8</code>

<code>dns:</code>

<code>  </code><code>- 8.8.8.8</code>

<code>  </code><code>- 9.9.9.9</code>

env_file: 從檔案中添加環境變量參數。如果您使用docker-compose -f FILE指定了一個Compose檔案,則env_file中的路徑與檔案所在的目錄相關。

<code>env_file: .</code><code>env</code>

<code>env_file:</code>

<code>  </code><code>- .</code><code>/common</code><code>.</code><code>env</code>

<code>  </code><code>- .</code><code>/apps/web</code><code>.</code><code>env</code>

<code>  </code><code>- </code><code>/opt/secrets</code><code>.</code><code>env</code>

expose:暴露端口而不将它們釋出到主機 - 它們隻能被連結服務通路。 隻能指定内部端口。

<code>expose:</code>

<code> </code><code>- </code><code>"3000"</code>

<code> </code><code>- </code><code>"8000"</code>

image: 指定要從中啟動容器的鏡像,可以是存儲庫/标簽或部分映像ID,如果有指定build行為,會自動為新建構的鏡像打上此标簽和命名(預設的v1 版本中build和image關鍵字不能同時存在,需要指定v2 或v3版本)。

<code>image: redis</code>

<code>image: ubuntu:14.04</code>

<code>image: tutum</code><code>/influxdb</code>

<code>image: example-registry.com:4000</code><code>/postgresql</code>

<code>image: a4bc65fd</code>

links: 連結到另一個服務中的容器。 請同時指定服務名稱和連結别名(SERVICE:ALIAS),或僅指定服務名稱。

logging: 日志服務。支援三種日志驅動,json-file, syslog, none. 預設的為json-file.

<code>logging:</code>

<code>  </code><code>driver: syslog</code>

<code>  </code><code>options:</code>

<code>    </code><code>syslog-address: </code><code>"tcp://192.168.0.42:123"</code>

<code>  </code><code>some-service:</code>

<code>    </code><code>image: some-service</code>

<code>    </code><code>logging:</code>

<code>      </code><code>driver: </code><code>"json-file"</code>

<code>      </code><code>options:</code>

<code>        </code><code>max-size: </code><code>"200k"</code>    <code># 日志檔案最大不超過200K</code>

<code>        </code><code>max-</code><code>file</code><code>: </code><code>"10"</code>      <code># 日志檔案最多不超過10個</code>

network_mode: 指定網絡模式。與使用docker 指令的-net參數一樣。

<code>network_mode: </code><code>"bridge"</code>

<code>network_mode: </code><code>"host"</code>

<code>network_mode: </code><code>"none"</code>

networks: 指定所要加入的網絡。

<code>    </code><code>networks:</code>

<code>     </code><code>- some-network</code>

<code>     </code><code>- other-network</code>

11

12

13

14

15

16

17

18

19

<code>  </code><code>app:</code>

<code>    </code><code>image: busybox</code>

<code>    </code><code>command</code><code>: </code><code>ifconfig</code>

<code>      </code><code>app_net:</code>

<code>        </code><code>ipv4_address: 172.16.238.10</code>

<code>        </code><code>ipv6_address: 2001:3984:3989::10</code>

<code>networks:</code>

<code>  </code><code>app_net:</code>

<code>    </code><code>driver: bridge</code>

<code>    </code><code>enable_ipv6: </code><code>true</code>

<code>    </code><code>ipam:</code>

<code>      </code><code>driver: default</code>

<code>      </code><code>config:</code>

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

<code>        </code><code>subnet: 172.16.238.0</code><code>/24</code>

<code>        </code><code>subnet: 2001:3984:3989::</code><code>/64</code>

ports: 對外開放的端口。

短文法模式:

<code>ports:</code>

<code> </code><code>- </code><code>"3000-3005"</code>

<code> </code><code>- </code><code>"8000:8000"</code>

<code> </code><code>- </code><code>"9090-9091:8080-8081"</code>

<code> </code><code>- </code><code>"49100:22"</code>

<code> </code><code>- </code><code>"127.0.0.1:8001:8001"</code>

<code> </code><code>- </code><code>"127.0.0.1:5000-5010:5000-5010"</code>

<code> </code><code>- </code><code>"6060:6060/udp"</code>

長文法模式(版本v3.2):

target:容器内部端口

published:對外暴露的端口

protocol:協定類型

mode:  host 用于在每個節點上釋出主機端口的主機,或将要進行負載均衡的群模式端口的入口。

<code>  </code><code>- target: 80</code>

<code>    </code><code>published: 8080</code>

<code>    </code><code>protocol: tcp</code>

<code>    </code><code>mode: host</code>

vlumes: 挂載主控端目錄,或命名卷。

短文法:

<code>volumes:</code>

<code>  </code><code># Just specify a path and let the Engine create a volume</code>

<code>  </code><code>- </code><code>/var/lib/mysql</code>

<code>  </code><code># Specify an absolute path mapping</code>

<code>  </code><code>- </code><code>/opt/data</code><code>:</code><code>/var/lib/mysql</code>

<code>  </code><code># Path on the host, relative to the Compose file</code>

<code>  </code><code>- .</code><code>/cache</code><code>:</code><code>/tmp/cache</code>

<code>  </code><code># User-relative path</code>

<code>  </code><code>- ~</code><code>/configs</code><code>:</code><code>/etc/configs/</code><code>:ro</code>

<code>  </code><code># Named volume</code>

<code>  </code><code>- datavolume:</code><code>/var/lib/mysql</code>

長文法(v3.2):

<code>  </code><code>- </code><code>type</code><code>: volume</code>

<code>    </code><code>source</code><code>: mydata</code>

<code>    </code><code>target: </code><code>/data</code>

<code>    </code><code>volume:</code>

<code>      </code><code>nocopy: </code><code>true</code>

<code>  </code><code>- </code><code>type</code><code>: bind</code>

<code>    </code><code>source</code><code>: .</code><code>/static</code>

<code>    </code><code>target: </code><code>/opt/app/static</code>

restart: 定義自啟動。

<code>restart: </code><code>"no"</code>

<code>restart: always</code>

<code>restart: on-failure</code>

<code>restart: unless-stopped</code>

domainname, hostname, ipc, mac_address, privileged, read_only, shm_size, stdin_open, tty, user, working_dir: 指定屬性。 與使用docker run 指定參數功能一樣。

<code>user: postgresql</code>

<code>working_dir: </code><code>/code</code>

<code>domainname: foo.com</code>

<code>hostname</code><code>: foo</code>

<code>ipc: host</code>

<code>mac_address: 02:42:ac:11:65:43</code>

<code>privileged: </code><code>true</code>

<code>read_only: </code><code>true</code>

<code>shm_size: 64M</code>

<code>stdin_open: </code><code>true</code>

<code>tty</code><code>: </code><code>true</code>

使用compose制作nginx-web容器

這裡用一個簡單的示例說明docker-compose file的用法。

安裝好docker以及docker-compose,從官方下載下傳centos鏡像:

<code>docker pull centos</code>

1、選擇一個建構目錄,建立Dockerfile:

<code>mkdir</code> <code>web</code>

<code>cd</code> <code>web</code>

<code>mkdir</code> <code>log       </code><code># 用于挂載容器的日志目錄</code>

<code>vim Dockerfile</code>

Dockerfile 内容:

<code>FROM centos</code>

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

<code>RUN rpm -ivh http:</code><code>//mirrors</code><code>.aliyun.com</code><code>/epel/epel-release-latest-7</code><code>.noarch.rpm</code>

<code>RUN yum </code><code>install</code> <code>nginx -y</code>

<code>RUN </code><code>sed</code> <code>-i </code><code>'N;6adaemon off;'</code> <code>/etc/nginx/nginx</code><code>.conf</code>

<code>ADD index.html </code><code>/usr/share/nginx/html/index</code><code>.html</code>

<code>EXPOSE 80</code>

<code>CMD [</code><code>"nginx"</code><code>]</code>

添加index.html檔案:

<code>echo</code> <code>"this is Compose test!"</code> <code>&gt; index.html</code>

2、建立docker-compose.yml

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

<code>version: </code><code>'2'</code>

<code>  </code><code>web-nginx:</code>

<code>    </code><code>image: trying</code><code>/nginx-com</code><code>:v1 </code>

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

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

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

<code>     </code><code>- .</code><code>/log</code><code>:</code><code>/var/log/nginx</code>

<code>    </code><code>container_name: web-compose</code>

<code>    </code><code>command</code><code>: [</code><code>"nginx"</code><code>]</code>

檔案說明:

a. 指定compose版本為v2,建議使用v2 或v3版本,如果不指定,預設會使用v1版本,文法會不相容。

b. web-nginx定義了服務的名稱,如果沒有後面image參數指定,鏡像名稱會預設以 目前路徑_服務名 命名如(web_web-nginx)。

c. build: . 表示建構路徑為目前路徑。

d. image 指定了建構之後的鏡像名稱,如果沒有build行為,則表示目前鏡像庫中已有的鏡像。

e. ports 表示映射端口 主控端端口:容器端口

f. volumes表示容器挂載的主控端目錄。 

3、在目前目錄運作docker-compose指令, 如果不使用-d 選項,compose運作之後會一直駐留在前台,終止compose後容器也會停止。

<code> </code><code>docker-compose up -d</code>

4、建構完成後,檢視鏡像:

<code># docker images</code>

<code>REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE</code>

<code>trying</code><code>/nginx-com</code>    <code>v1                  ec2f0106598a        21 minutes ago      401 MB</code>

<code>centos              latest              36540f359ca3        13 days ago         193 MB</code>

檢視容器:

<code># docker ps</code>

<code>CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS              PORTS                NAMES</code>

<code>eac73ff1bbef        trying</code><code>/nginx-com</code><code>:v1   </code><code>"nginx"</code>             <code>22 minutes ago      Up 22 minutes       0.0.0.0:80-&gt;80</code><code>/tcp</code>   <code>web-compose</code>

檢視服務狀态(另一台主機上使用curl):

<code># curl 192.168.60.18</code>

<code>this is Compose </code><code>test</code><code>!</code>

檢視主控端日志:

<code># cat log/access.log </code>

<code>192.168.60.19 - - [19</code><code>/Jul/2017</code><code>:05:16:38 +0000] </code><code>"GET / HTTP/1.1"</code> <code>200 29 </code><code>"-"</code> <code>"curl/7.29.0"</code> <code>"-"</code>

Dockerfile和docer compose支援的參數遠不止這些,這裡隻是介紹了常用的很小一部分,更多具體的内容可以參考剛放文檔。

版權聲明:原創作品,如需轉載,請注明出處。否則将追究法律責任

 本文轉自 酥心糖 51CTO部落格,原文連結:http://blog.51cto.com/tryingstuff/1948706