在我們啟動容器的時候經常要使用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` > </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>> 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->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