本文旨在用通俗的語言講述枯燥的知識html
前面講到鏡像的構建時,講述的是用commit的方式構建鏡像,而Dockerfile是另外一種構建鏡像的方式。nginx
Dockerfile構建鏡像是以基礎鏡像爲基礎的,Dockerfile是一個文本文件,內容是用戶編寫的一些docker指令,每一條指令構建一層,所以每一條指令的內容,就是描述該層應當如何構建。git
Dockerfile的基本指令有十三個,分別是:FROM、MAINTAINER、RUN、CMD、EXPOSE、ENV、ADD、COPY、ENTRYPOINT、VOLUME、USER、WORKDIR、ONBUILDweb
從前面的內容能夠看出,要構建一個容器,須要作不少的工做,設置不少的配置,若是咱們能夠把每一層修改、安裝、構建、操做的命令都寫入一個腳本,用這個腳原本構建、定製鏡像,那麼以前說起的沒法重複的問題、鏡像構建透明性的問題、體積的問題就都會解決。 這個腳本就是 Dockerfile。docker
所以學會用Dockerfile來構建鏡像,是很是有必要的。學習Dockerfile以前,咱們先來學習一些Dockerfile經常使用的指令。shell
文章提綱:編程
- Dockerfile經常使用指令
- Dockerfile的編寫
- 用Dockerfile構建鏡像
- 彩蛋
類型 | 命令 |
---|---|
基礎鏡像信息 | FROM |
維護者信息 | MAINTAINER |
鏡像操做指令 | RUN、COPY、ADD、EXPOSE、WORKDIR、ONBUILD、USER、VOLUME等 |
容器啓動時執行指令 | CMD、ENTRYPOINT |
1.一、FROM :指定基礎鏡像json
所謂定製鏡像,那必定是以一個鏡像爲基礎,在其上進行定製。就像咱們以前運行了一個nginx鏡像的容器,再進行修改同樣,基礎鏡像是必須指定的。而FROM就是指定基礎鏡 像,所以一個Dockerfile中FROM是必備的指令,而且必須是第一條指令。 如:指定ubuntu的14版本做爲基礎鏡像ubuntu
FROM ubuntu:14
複製代碼
1.二、 RUN:執行命令centos
RUN指令在新鏡像內部執行的命令,如:執行某些動做、安裝系統軟件、配置系統信息之類,
格式以下兩種:
RUN echo 'hello ' >/etc/nginx/html/index.html
複製代碼
RUN ["yum","install","nginx"]
複製代碼
注:多行命令不要寫多個RUN,緣由是Dockerfile中每個指令都會創建一層.多少個RUN就構建了多少層鏡像,會形成鏡像的臃腫、多層,不只僅增長了構件部署的時間,還容易出錯,RUN書寫時的換行符是\
1.三、COPY:複製文件
COPY命令用於將宿主機器上的的文件複製到鏡像內,若是目的位置不存在,Docker會自動建立。但宿主機器用要複製的目錄必須是和Dockerfile文件統計目錄下。
格式:
COPY [--chown=<user>:<group>] <源路徑>... <目標路徑>
COPY [--chown=<user>:<group>] ["<源路徑1>",... "<目標路徑>"]
複製代碼
如把宿主機中的package.json文件複製到容器中/usr/src/app/目錄下:
COPY package.json /usr/src/app/
複製代碼
1.四、CMD:容器啓動命令
CMD命令用於容器啓動時須要執行的命令,CMD在Dockerfile中只能出現一次,若是出現多個,那麼只有最後一個會有效。 其做用是在啓動容器的時候提供一個默認的命令項。若是用戶執行docker run的時候提供了命令項,就會覆蓋掉這個命令,沒提供就會使用構建時的命令。
格式:
shell 格式:CMD <命令>
exec 格式:CMD ["可執行文件", "參數1", "參數2"...]
複製代碼
如容器啓動時進入bash:
CMD /bin/bash
複製代碼
也能夠用exec寫法:
CMD ["/bin/bash"]
複製代碼
1.5 MAINTAINER:指定做者
用來指定dockerfile的做者名稱和郵箱,主要做用是爲了標識軟件的全部者是誰。 語法:
MAINTAINER <name> <email>
複製代碼
如:
MAINTAINER autor_jiabuli 6766633@qq.com
複製代碼
1.六、EXPOSE:暴露端口
EXPOSE命名適用於設置容器對外映射的容器端口號,如tomcat容器內使用的端口8081,則用EXPOSE命令能夠告訴外界該容器的8081端口對外,在構建鏡像時 用docker run -p能夠設置暴露的端口對宿主機器端口的映射。
語法:
EXPOSE <端口1> [<端口2>...]
複製代碼
如:
EXPOSE 8081
複製代碼
EXPOSE 8081 其實等價於 docker run -p 8081 當須要把8081端口映射到宿主機中的某個端口(如8888)以便外界訪問時,則能夠用docker run -p 8888:8081
1.七、WORKDIR:配置工做目錄
WORKDIR命令是爲RUN、CMD、ENTRYPOINT指令配置工做目錄。其效果相似於Linux命名中的cd命令,用於目錄的切換,可是和cd不同的是:若是切換到的目錄不存在,WORKDIR會爲此建立目錄。
語法:
WORKDIR path
複製代碼
如須要在nginx目錄下建立一個hello.txt的文件:
##進入/usr/local/nginx目錄下
WORKDIR /usr/local/nginx
##進入/usr/local/nginx中的html目錄下
WORKDIR html
## 在html目錄下建立了一個hello.txt文件
RUN echo 'hello' > hello.txt
複製代碼
1.八、ENTRYPOINT:容器啓動執行命名
ENTRYPOINT的做用和用法和CMD如出一轍,可是ENTRYPOINT有和CMD有2處不同:
1.九、VOLUME
VOLUME用來建立一個能夠從本地主機或其餘容器掛載的掛載點。例如咱們知道tomcat的webapps目錄是放web應用程序代碼的地方,此時咱們要把webapps目錄掛載爲匿名卷,這樣任何寫入webapps中的心都不會被記錄到容器的存儲層,讓容器存儲層無狀態化。
格式:
VOLUME ["path"]
複製代碼
如建立tomcat的webapps目錄的一個掛載點
VOLUME /usr/local/tomcat/webapps
複製代碼
這樣,在運行容器時,也能夠用過docker run -v來把匿名掛載點掛載都宿主機器上的某個目錄,如
docker run -d -v /home/tomcat_webapps:/usr/local/tomcat/webapps
複製代碼
1.十、 USER USER命令用於指定當前望下執行的用戶,須要注意的是這個用戶必須是已經存在,不然沒法指定。它的用法和WORKDIR有點像,切換用戶。
格式:
USER daemon
複製代碼
1.十一、ADD
做用和使用方法和COPY如出一轍,在此不重複講述。
1.十二、ONBUILD
ONBUILD用於配置當前所建立的鏡像做爲其它新建立鏡像的基礎鏡像時,所執行的操做指令。 意思就是:這個鏡像建立後,若是其它鏡像以這個鏡像爲基礎,會先執行這個鏡像的ONBUILD命令 格式:
ONBUILD [INSTRUCTION]
複製代碼
1.1三、ENV:設置環境變量
ENV命名用於設置容器的環境變量,這些變量以」key=value」的形式存在,在容器內被腳本或者程序調用,容器運行的時候這個變量也會保留。
格式:
如設置一個環境變量JAVA_HOME,接下來的命名就可使用這個變量:
ENV JAVA_HOME /opt/jdk
ENV PATH $PATH:$JAVA_HOME/bin
複製代碼
在使用ENV設置環境變量時,有幾點須要注意:
ENV tomcat_home_name tomcat_7
RUN mkdir $tomcat_home_name
複製代碼
docker run -d tomcat -e "tomcat_home_name=tomcat_7"
複製代碼
這樣咱們進入容器內部用ENV能夠看到tomcat_home_name這個環境變量。
咱們先看一個例子
#在centos上安裝nginx
FROM centos
#標明著做人的名稱和郵箱
MAINTAINER jiabuli 649917837@qq.com
#測試一下網絡環境
RUN ping -c 1 www.baidu.com
#安裝nginx必要的一些軟件
RUN yum -y install gcc make pcre-devel zlib-devel tar zlib
#把nginx安裝包複製到/usr/src/目錄下
ADD nginx-1.15.8.tar.gz /usr/src/
#切換到/usr/src/nginx-1.15.8編譯而且安裝nginx
RUN cd /usr/src/nginx-1.15.8 \
&& mkdir /usr/local/nginx \
&& ./configure --prefix=/usr/local/nginx && make && make install \
&& ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ \
&& nginx
#刪除安裝nginx安裝目錄
RUN rm -rf /usr/src/nginx-nginx-1.15.8
#對外暴露80端口
EXPOSE 80
#啓動nginx
CMD ["nginx", "-g", "daemon off;"]
複製代碼
上面的註釋已經講的很是清楚,其實不難發現,上面的例子就是相似於在centos系統上安裝一個nginx的的一個過程,所以編寫Dockerfile構建鏡像就和在Linux上安裝軟件的流程幾乎是如出一轍的。因此咱們在編寫Dockerfile來構建鏡像時,能夠先思考在Linux上安裝該軟件的流程,再用Dockerfile提供的指令轉化到Dockerfile中便可。
用Dockerfile的核心在於編寫Dockerfile,可是編寫完以後咱們須要知道怎麼使用Dockerfile來構建鏡像,下面以構建nginx鏡像爲例來簡要說明構建流程
3.1 上傳安裝包
首先咱們須要把要構建的軟件安裝包上傳到服務器中,咱們能夠在服務器目錄上建立一個專門的文件夾,如:/var/nginx_build,而後把從nginx官網下載的nginx-1.15.8.tar.gz安裝包上傳到這個目錄裏。
3.2 編寫Dockerfile
如何編寫nginx的Dockerfile上面已經詳細介紹,如今咱們只需把編寫好的Dockerfile上傳到/var/nginx_build目錄下,固然你也能夠在服務器上直接編寫Dockerfile,可是要記得必定保證Dockerfile文件和安裝包在一個目錄下。
3.3 運行構建命令構建
docker build 命令用於使用 Dockerfile 建立鏡像。 格式:
docker build [OPTIONS] PATH | URL | -
複製代碼
OPTIONS有不少指令,下面列舉幾個經常使用的:
- --build-arg=[] :設置鏡像建立時的變量;
- -f :指定要使用的Dockerfile路徑;
- --force-rm :設置鏡像過程當中刪除中間容器;
- --rm :設置鏡像成功後刪除中間容器;
- --tag, -t: 鏡像的名字及標籤,一般 name:tag 或者 name 格式;
所以咱們構建nginx能夠用如下命令:
docker build -t nginx:v1.0 .
複製代碼
當Dockerfile和當前執行命令的目錄不在同一個時,咱們也能夠指定Dockerfile,如
docker build -f /var/nginx_build/Dockerfile .
複製代碼
執行命名以後,會看到控制檯逐層輸出構建內容,直到輸出兩個Successfully即爲構建成功。
寫了不少篇docker的文章,爲了方便開發者們學習和查閱docker的基礎知識,我作了一份完整的docker基礎整理,發佈在gitchat上面,有興趣的讀者能夠加入一塊兒學習,我這裏還有6個免費名額,若有須要,能夠加微信:sisi-ceo 索要。
以爲本文對你有幫助?請分享給更多人 關注「編程無界」,提高裝逼技能