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的構建時在基礎映象之上按照由上到下
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.0”
LABEL 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的語法之後,我們可以根據業務的需求建立映象,在部署容器的時候會極大的提高效率。