使用Dockerfile去構建鏡像好比堆積木鞠苟、使用pom去構建maven項目一樣可缚,有異曲同工之妙,下面就把Dockerfile中主要的命令介紹一下爽室。
組成部分
部分 | 命令 |
---|---|
基礎鏡像信息 | FROM |
維護者信息 | MAINTAINER |
鏡像操作指令 | RUN、COPY淆攻、ADD阔墩、EXPOSE、WORKDIR卜录、ONBUILD戈擒、USER、VOLUME等 |
容器啟動時執(zhí)行指令 | CMD艰毒、ENTRYPOINT |
詳情:官方文檔
各命令詳解
FROM
指定哪種鏡像作為新鏡像的基礎鏡像筐高,如:
FROM ubuntu:14.04
MAINTAINER
指明該鏡像的作者和其電子郵件,如:
MAINTAINER vector4wang "xxxxxxx@qq.com"
RUN
在新鏡像內部執(zhí)行的命令丑瞧,比如安裝一些軟件柑土、配置一些基礎環(huán)境,可使用\來換行绊汹,如:
RUN echo 'hello docker!' \
> /usr/local/file.txt
也可以使用exec格式RUN ["executable", "param1", "param2"]
的命令稽屏,如:
RUN ["apt-get","install","-y","nginx"]
要注意的是,executable
是命令西乖,后面的param是參數
COPY
將主機的文件復制到鏡像內狐榔,如果目的位置不存在,Docker會自動創(chuàng)建所有需要的目錄結構获雕,但是它只是單純的復制薄腻,并不會去做文件提取和解壓工作。如:
COPY application.yml /etc/springboot/hello-service/src/resources
注意:需要復制的目錄一定要放在Dockerfile文件的同級目錄下
原因:
因為構建環(huán)境將會上傳到Docker守護進程届案,而復制是在Docker守護進程中進行的庵楷。任何位于構建環(huán)境之外的東西都是不可用的。COPY指令的目的的位置則必須是容器內部的一個絕對路徑楣颠。
---《THE DOCKER BOOK》
ADD
將主機的文件復制到鏡像中尽纽,跟COPY一樣,限制條件和使用方式都一樣童漩,如:
ADD application.yml /etc/springboot/hello-service/src/resources
但是ADD會對壓縮文件(tar, gzip, bzip2, etc)做提取和解壓操作弄贿。
EXPOSE
暴露鏡像的端口供主機做映射,啟動鏡像時睁冬,使用-P參數來講鏡像端口與宿主機的隨機端口做映射挎春。使用方式(可指定多個):
EXPOSE 8080
EXPOSE 8081
...
WORKDIR
在構建鏡像時看疙,指定鏡像的工作目錄,之后的命令都是基于此工作目錄直奋,如果不存在能庆,則會創(chuàng)建目錄。如
WORKDIR /usr/local
WORKDIR webservice
RUN echo 'hello docker' > text.txt
...
最終會在/usr/local/webservice/
目錄下生成text.txt文件
ONBUILD
當一個包含ONBUILD命令的鏡像被用作其他鏡像的基礎鏡像時(比如用戶的鏡像需要從某為準備好的位置添加源代碼脚线,或者用戶需要執(zhí)行特定于構建鏡像的環(huán)境的構建腳本)搁胆,該命令就會執(zhí)行。
如創(chuàng)建鏡像image-A
FROM ubuntu
...
ONBUILD ADD . /var/www
...
然后創(chuàng)建鏡像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
指定該鏡像以什么樣的用戶去執(zhí)行船逮,如:
USER mongo
VOLUME
用來向基于鏡像創(chuàng)建的容器添加卷顾腊。比如你可以將mongodb鏡像中存儲數據的data文件指定為主機的某個文件。(容器內部建議不要存儲任何數據)
如:
VOLUME /data/db /data/configdb
注意:VOLUME 主機目錄 容器目錄
CMD
容器啟動時需要執(zhí)行的命令挖胃,如:
CMD /bin/bash
同樣可以使用exec語法杂靶,如
CMD ["/bin/bash"]
當有多個CMD的時候,只有最后一個生效酱鸭。
ENTRYPOINT
作用和用法和CMD一模一樣
CMD和ENTRYPOINT的區(qū)別
敲黑板B鹂濉!凹髓!非常重要
一定要注意烁登!
一定要注意!
一定要注意蔚舀!
CMD和ENTRYPOINT同樣作為容器啟動時執(zhí)行的命令,區(qū)別有以下幾點:
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后面的命令就會被覆蓋轉而執(zhí)行bin/ps
命令失受,而ENTRYPOINT的則不會讶泰,而是會把docker run 后面的命令當做ENTRYPOINT執(zhí)行命令的參數。
以下例子比較容易理解
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"]
下面是運行過程
(動態(tài)圖太大了上傳不了)
注意 登錄之后的用戶名和ADD、COPY進去的文件
后記
以上只是自己通過看書寫demo和瀏覽其他人的博文所總結出來的悯森,之后在實戰(zhàn)的過程中會把遇到的一些實際問題追加進來宋舷。
參考: https://www.cnblogs.com/lienhua34/p/5170335.html
CSDN:http://blog.csdn.net/qqhjqs?viewmode=list
博客:http://blog.wangxc.club/
簡書:http://www.reibang.com/u/223a1314e818
Github:https://github.com/vector4wang
Gitee:https://gitee.com/backwxc
如果感覺有幫助的話,點個贊哦~