學習Docker之Dockerfile的命令

使用Dockerfile去構建鏡像比如堆積木、使用pom去構建maven項目同樣,有殊途同歸之妙,下面就把Dockerfile中主要的命令介紹一下。php

組成部分

部分 命令
基礎鏡像信息 FROM
維護者信息 MAINTAINER
鏡像操做指令 RUN、COPY、ADD、EXPOSE、WORKDIR、ONBUILD、USER、VOLUME等
容器啓動時執行指令 CMD、ENTRYPOINT

詳情:官方文檔html

各命令詳解

FROM

指定哪一種鏡像做爲新鏡像的基礎鏡像,如:nginx

FROM ubuntu:14.04

MAINTAINER

指明該鏡像的做者和其電子郵件,如:git

MAINTAINER vector4wang "xxxxxxx@qq.com" 

RUN

在新鏡像內部執行的命令,好比安裝一些軟件、配置一些基礎環境,可以使用\來換行,如:github

RUN echo 'hello docker!' \ > /usr/local/file.txt 

也可使用exec格式RUN ["executable", "param1", "param2"]的命令,如:web

RUN ["apt-get","install","-y","nginx"] 

要注意的是,executable是命令,後面的param是參數spring

COPY

將主機的文件複製到鏡像內,若是目的位置不存在,Docker會自動建立全部須要的目錄結構,可是它只是單純的複製,並不會去作文件提取和解壓工做。如:mongodb

COPY application.yml /etc/springboot/hello-service/src/resources

注意:須要複製的目錄必定要放在Dockerfile文件的同級目錄下
緣由:docker

由於構建環境將會上傳到Docker守護進程,而複製是在Docker守護進程中進行的。任何位於構建環境以外的東西都是不可用的。COPY指令的目的的位置則必須是容器內部的一個絕對路徑。
---《THE DOCKER BOOK》ubuntu

ADD

將主機的文件複製到鏡像中,跟COPY同樣,限制條件和使用方式都同樣,如:

ADD application.yml /etc/springboot/hello-service/src/resources

可是ADD會對壓縮文件(tar, gzip, bzip2, etc)作提取和解壓操做。

EXPOSE

暴露鏡像的端口供主機作映射,啓動鏡像時,使用-P參數來說鏡像端口與宿主機的隨機端口作映射。使用方式(可指定多個):

EXPOSE 8080 
EXPOSE 8081
...

WORKDIR

在構建鏡像時,指定鏡像的工做目錄,以後的命令都是基於此工做目錄,若是不存在,則會建立目錄。如

WORKDIR /usr/local WORKDIR webservice RUN echo 'hello docker' > text.txt ... 

最終會在/usr/local/webservice/目錄下生成text.txt文件

ONBUILD

當一個包含ONBUILD命令的鏡像被用做其餘鏡像的基礎鏡像時(好比用戶的鏡像須要從某爲準備好的位置添加源代碼,或者用戶須要執行特定於構建鏡像的環境的構建腳本),該命令就會執行。
如建立鏡像image-A

FROM ubuntu
...
ONBUILD ADD . /var/www
...

而後建立鏡像image-B,指定image-A爲基礎鏡像,如

FROM image-A
...

而後在構建image-B的時候,日誌上顯示以下:

Step 0 : FROM image-A # Execting 1 build triggers Step onbuild-0 : ADD . /var/www ... 

USER

指定該鏡像以什麼樣的用戶去執行,如:

USER mongo

VOLUME

用來向基於鏡像建立的容器添加捲。好比你能夠將mongodb鏡像中存儲數據的data文件指定爲主機的某個文件。(容器內部建議不要存儲任何數據)
如:

VOLUME /data/db /data/configdb

注意:VOLUME 主機目錄 容器目錄

CMD

容器啓動時須要執行的命令,如:

CMD /bin/bash

一樣可使用exec語法,如

CMD ["/bin/bash"] 

當有多個CMD的時候,只有最後一個生效。

ENTRYPOINT

做用和用法和CMD如出一轍

CMD和ENTRYPOINT的區別

敲黑板!!!很是重要
必定要注意!

必定要注意!

必定要注意!
CMD和ENTRYPOINT一樣做爲容器啓動時執行的命令,區別有如下幾點:

  • CMD的命令會被 docker run 的命令覆蓋而ENTRYPOINT不會

如使用CMD ["/bin/bash"]ENTRYPOINT ["/bin/bash"]後,再使用docker run -ti image啓動容器,它會自動進入容器內部的交互終端,如同使用
docker run -ti image /bin/bash

可是若是啓動鏡像的命令爲docker run -ti image /bin/ps,使用CMD後面的命令就會被覆蓋轉而執行bin/ps命令,而ENTRYPOINT的則不會,而是會把docker run 後面的命令當作ENTRYPOINT執行命令的參數
如下例子比較容易理解
Dockerfile中爲

...
ENTRYPOINT ["/user/sbin/nginx"] 

而後經過啓動build以後的容器

docker run -ti image -g "daemon off" 

此時-g "daemon off"會被當成參數傳遞給ENTRYPOINT,最終的命令變成了

/user/sbin/nginx -g "daemon off" 
  • CMD和ENTRYPOINT都存在時

CMD和ENTRYPOINT都存在時,CMD的指令變成了ENTRYPOINT的參數,而且此CMD提供的參數會被 docker run 後面的命令覆蓋,如:

...
ENTRYPOINT ["echo","hello","i am"] CMD ["docker"] 

以後啓動構建以後的容器

  • 使用docker run -ti image

    輸出「hello i am docker」

  • 使用docker run -ti image world

    輸出「hello i am world」

指令比較多,能夠經過分類(如開頭的表格)的辦法去記憶

示例

本身寫了個簡單的示例,很是簡單

FROM ubuntu
MAINTAINER vector4wang xxxx@qq.com

WORKDIR /usr/local/docker ADD temp.zip ./add/ COPY temp.zip ./copy/ EXPOSE 22 RUN groupadd -r vector4wang && useradd -r -g vector4wang vector4wang USER vector4wang ENTRYPOINT ["/bin/bash"] 

下面是運行過程


 
1.png

 
2.png

(動態圖太大了上傳不了)

注意 登陸以後的用戶名和ADD、COPY進去的文件

後記

以上只是本身經過看書寫demo和瀏覽其餘人的博文所總結出來的,以後在實戰的過程當中會把遇到的一些實際問題追加進來。

參考: https://www.cnblogs.com/lienhua34/p/5170335.html

CSDN:http://blog.csdn.net/qqhjqs?viewmode=list
博客:http://vector4wang.tk/
簡書:https://www.jianshu.com/u/223a1314e818
Github:https://github.com/vector4wang
Gitee:https://gitee.com/backwxc 若是感受有幫助的話,點個贊哦~

相關文章
相關標籤/搜索