1. 程式人生 > >3.docker學習筆記:編寫Dockerfile檔案

3.docker學習筆記:編寫Dockerfile檔案

編寫Dockerfile檔案

編寫規則

在構建新的映象時如果採用docker build的方式是需要編寫Dockerfile檔案的,該檔案定義了容器在建立時的行為(安裝軟體、執行命令、拷貝檔案等)。docker會在build的時候執行相關操作,下面介紹Dockerfile的關鍵字和編寫規則。

Dockerfile中的指令主要有以下幾種,CMD、ENTRYPOINT、RUN、EXPOSE、FROM、ADD、COPY、VOLUME、WORKDIR、USER、ONBUILD、LABEL、STOPSIGNAL、ARG和ENV等操作。下面對這些命令逐個進行解釋,最後我們在編寫相關的示例檔案來加深理解:

1.FROM

設定基礎映象的名稱,可以採用“minhviet/centos-6.5”這種全稱形式,minhviet為作者名稱,centos-6.6為映象名稱。

eg:

FROM minhviet/centos-6.5

要點:

FROM必須是第一個非註釋的命令;

2.MAINTAINER

設定建立該映象的作者資訊。

eg:

MAINTAINER zhang chi "********@qq.com"

3.CMD

CMD指令用於指定一個容器啟動時需要執行的命令,這個和RUN指令有不同。RUN指令是指映象被構建時需要執行的命令。CMD的執行可以通過exec的方式書寫。

eg:

CMD["yum", "install", "vsftpd", "-y"]

要點:

1.在Dockerfile中只可以指定一個CMD命令。如果指定多個,也只有最後一個生效
2.如果在容器啟動命令run中指定了啟動時的命令,則run中的指令會覆蓋掉CMD的操作。

4.RUN

RUN指令是構建映象時所需要執行的命令,他的書寫方式也有兩種:
(1)shell命令列形式;

RUN yum install httpd -y

(2)exec系統呼叫的形式。

RUN["yum", "install", "httpd", "-y"]

要點:
1.RUN的構建時在基礎映象之上按照由上到下

的順序,以層級的方式進行構建,這有些類似於git的版本控制,一旦某個RUN命令發生錯誤,docker將會停止構建,並且得到構建失敗前最後一次正確構建的映象ID,可以進入該映象排查問題。

5.ADD
ADD指令用來將構建環境下的檔案和目錄複製到映象中,他和COPY的功能非常類似,額外的功能是:如果ADD的內容是一個壓縮檔案(tar、zip等檔案),ADD會自動進行解壓

ADD vsftpd.conf /etc/vsftpd/vsftpd.conf
ADD tar.nginx.gz /usr/local/nginx

要點:
1.ADD的檔案路徑必須是build的環境內的;
2.如果ADD的是一個目錄,則目錄下的資料全部會複製到指定的目錄中(目錄本身不復制);
3.如果是壓縮包會被解壓縮。

6.COPY

COPY的左右和ADD功能十分相近,它也有兩種不同的方式:
(1)COPY src dest (shell形式)
(2)COPY[“src”, “dest”]

eg:

COPY test_file1 test_file2 /var/www/html/

要點:
1.COPY的檔案路徑必須是build的環境內的;
2.當src有多個檔案時,dest必須是一個目錄,而且必須以/結尾

7.VOLUME

VOLUME[“/mounttest”]
VOLUME /mounttest

VOLUME指令用來向基於映象建立的容器添加捲,一個卷可以存在於一個或者多個容器中。功能如下:
(1)卷在容器之間可以共享和重用;
(2)一個容器可以不是必須和其他容器共享卷;
(3)即改即生效;
(4)對映象更新沒有影響;
(5)卷會一直存在直到沒有容器使用它;
(6)可以一次指定多個卷;

8.WORKDIR

在容器內部設定一個工作目錄,ENTRYPOINT和/或CMD指定的程式會在這個目錄下執行。

WORKDIR /opt/webapp/db
RUN bundle install
WORKDIR /ope/webapp
ENTRYPOINT ["rackup"]

這裡設定了兩個WORKDIR目錄,在第一個目錄執行了RUN命令,切換到另外一個WORKDIR,然後又執行了一個ENTRYPOINT命令。

WORKDIR指定的目錄不存在就會被主動創建出來

9.USER

USER指定了該映象啟動的容器會以什麼樣的使用者去執行。
eg:

USER nginx
USER root

10.ONBUILD

ONBUILD為映象新增觸發器(trigger),當一個映象被用做其他映象的基礎映象時,該映象中的觸發器將會被執行。

可以認為ONBUILD的指令是緊跟在FROM之後指定的。觸發器可以是任何構建指令。

11.LABEL

LABEL用於為DOCKER映象新增元資料,元資料以鍵值對額形式展示。

LABEL version=“1.0LABEL location=“New work” type=“Data Center”

12.STOPSIGNAL

STOPSIGNAL指令用來設定停止容器是傳送什麼系統呼叫給容器。這個訊號必須是核心系統呼叫表的合法數。

13.ARG

ARG指令用來定義可以在docker build命令執行時傳遞給構建執行時的變數,我們只需要在構建時使用–build-arg即可。

ARG build
ARG webapp_user=user

14.ENV

ENV指令用來在映象構建過程中設定環境變數。

ENV RVM_PATH /home/rvm/

15.EXPOSE

此命令通知Docker容器監聽指定的網路埠 , EXPOSE 指令不會讓容器的埠訪問host主機,如果想要這樣做就需要在執行容器的時候指定 -p flag釋出一個埠範圍或者 -P flag釋出所有開啟的埠。

編寫示例

這裡以zabbix的server端和zabbix的agent端兩個映象進行配置。完整的架構應該是,zabbixserver、zabbixagent和mysql。這樣每個容器只負責著其中一個服務,這個是微服務的一種部署方式。讓整個應用程式更下的模組化。

zabbix_server

首先在宿主機建立生成映象的根目錄:/mnt/zabbix_server,進入根目錄編寫Dockerfile檔案:

root@vs026:/# mkdir /mnt/zabbix_server/
root@vs026:/# cd /mnt/zabbix_server/
root@vs026:/mnt/zabbix_server# touch Dockerfile

Dockerfile的內容如下:

#create the zabbix server images
FROM oraclelinux:6.7

#create zabbix user
RUN useradd zabbix

#install packages
RUN yum install gcc* mysql-devel libxml2-devel net-snmp* java* curl-devel -y

#set work directory
WORKDIR /zabbix

#copy zabbix source code 
ADD zabbix-3.2.1.tar.gz /zabbix/


#set configure directory
WORKDIR /zabbix/zabbix-3.2.1

#configure
CMD ./configure --enable-serer --enable-agent --with-mysql --enable-ipv6 --with-netsnmp --with-libcurl --with-libxml2 --enable-java

EXPOSE 10051
EXPOSE 10050

其中zabbix的安裝包zabbix-3.2.1.tar.gz必須要放在/mnt/zabbix_server目錄下,生成映象的過程也是分層級進行的:

......

 ---> 4128d1b8dc16
Removing intermediate container 6615250f8d78
Step 4 : WORKDIR /zabbix
 ---> Running in 7ede380f919e
 ---> 51715a9a86a8
Removing intermediate container 7ede380f919e
Step 5 : ADD zabbix-3.2.1.tar.gz /zabbix/
 ---> 18f9d0910cde
Removing intermediate container 2199e4e6fa07
Step 6 : WORKDIR /zabbix/zabbix-3.2.1
 ---> Running in e3fb17ad42cd
 ---> f4ad0c50486e
Removing intermediate container e3fb17ad42cd
Step 7 : CMD ./configure --enable-serer --enable-agent --with-mysql --enable-ipv6 --with-netsnmp --with-libcurl --with-libxml2 --enable-java
 ---> Running in 34fde4a1a447
 ---> 69100860d16e
Removing intermediate container 34fde4a1a447
Step 8 : EXPOSE 10051
 ---> Running in a618d5075cea
 ---> bbfcb3fefd2e
Removing intermediate container a618d5075cea
Step 9 : EXPOSE 10050
 ---> Running in 5c13c4d33b4e
 ---> cb9cc37d6902
Removing intermediate container 5c13c4d33b4e
Successfully built cb9cc37d6902

最後顯示生成映象成功,檢視生成的映象:

root@vs026:/mnt/zabbix_server# docker images 
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
zhangchiwd371/zabbix_server   latest              cb9cc37d6902        7 minutes ago       3.094 GB

小結

熟悉了Dockfile的語法之後,我們可以根據業務的需求建立映象,在部署容器的時候會極大的提高效率。