12 - Dockerfile指令詳解(Docker系列)

本文章來自【知識林】

在使用Dockerfile一構(gòu)建Docker鏡像之前需要先搞清楚Dockerfile中都有哪些常用的指令,這樣在使用起來才能得心應(yīng)手。

這篇文章主要列舉出Dockerfile中比較常用的指令及其用法和說明,需要注意的是這些指令都是全部大寫。

FROM

  • 說明:指定該鏡像的基礎(chǔ)鏡像
  • 格式如:FROM <image>FROM <image>:<tag>
  • 示例:FROM centos:7
  • 注意:FROM一般出現(xiàn)在文件頭,且每個鏡像都需要有一個FROM來指定基礎(chǔ)鏡像。

MAINTAINER

  • 說明:指定作者信息
  • 格式如:MAINTAINER <name>
  • 示例:MAINTAINER 知識林 "393156105@qq.com"

RUN

  • 說明:在構(gòu)建鏡像時執(zhí)行腳本
  • 格式如:RUN <command>、RUN ["exec", "par1", "par2"]
  • 示例:RUN ls -l(以詳細(xì)信息方式列表當(dāng)前目錄下的文件,跟在shell終端運行一樣)

CMD

  • 說明:在運行容器時執(zhí)行腳本
  • 格式如:CMD <command> <par1> <par2> ...、CMD ["exec", "par1", "par2"]
  • 示例:CMD ["ls", "-l"]
  • 注意:一個Dockerfile中只有一條CMD,如果有多條只執(zhí)行最后一條;在運行容器時如果用戶指定了運行命令則Dockerfile中的CMD將被覆蓋。

ENTRYPOINT

  • 說明:在運行容器時執(zhí)行腳本
  • 格式如:ENTRYPOINT ["exec", "par1", "par2"]、ENTRYPOINT command par1 par2
  • 示例:ENTRYPOINT ["catalina.sh", "run"]
  • 注意:一個Dockerfile中只有一條ENTRYPOINT,如果有多條只執(zhí)行最后一條;不可以被容器運行時的命令所覆蓋。

EXPOSE

  • 說明:讓Docker暴露容器的端口號,供其他容器使用,在宿主機(jī)以外的網(wǎng)絡(luò)中是無法使用的
  • 格式如:EXPOSE <port> ...
  • 示例:EXPOSE 8080
  • 注意:
    • 在Docker中有兩種暴露端口的概念,一種叫EXPOSE隱式暴露,只供Docker服務(wù)內(nèi)部使用;另一種叫PUBLISH顯式暴露,供外部網(wǎng)絡(luò)使用,PUBLISH只是一個概念在Dockerfile中沒有這個指令。
    • EXPOSE 只在Dockerfile中出現(xiàn),所暴露的端口只是被其他容器使用
    • PUBLISH 沒有該指令而是通過docker run命令的參數(shù)-p、-P或在docker-compose中的ports來體現(xiàn)
    • -P:大寫是屬于自動映射,將Dockerfile中EXPOSE所暴露的所有端口分別映射到宿主機(jī)的隨機(jī)端口,每次啟動或重啟容器時端口都可能有所不同
    • -p:小寫是屬于固定映射,格式如:-p 宿主端口:容器端口,宿主端口和容器端口可以是純數(shù)字也可以是一個范圍,如:-p 8060-8080:8060-8080,意為將宿主機(jī)的8060(含)到8080(含)的端口映射到容器的8060(含)到8080(含)端口,需要注意的是在使用范圍時,宿主端口個數(shù)應(yīng)該與容器端口個數(shù)匹配;但上面這個例子可以寫成:-p 7060-7080:8060-8080,這樣宿主的端口就在7060-7080范圍內(nèi)

ENV

  • 說明:指定環(huán)境變量,在Dockerfile文件中的后續(xù)代碼中使用,在容器運行時也可以使用
  • 格式如:ENV <key> <value>
  • 示例:ENV tomcat_home /web/tomcat/

ADD

  • 說明:添加文件(夾)到容器
  • 格式如:ADD <src> <dest>
  • 示例:ADD web.jar /web.jar
  • 注意:復(fù)制指定的<src>到容器中的<dest>,<src>可以是Dockerfile所在目錄的一個相對路徑,也可以是一個URL,也可以是一個tar文件(tar文件將自動解壓成文件目錄)

COPY

  • 說明:添加文件(夾)到容器
  • 格式如:COPY <src> <dest>
  • 示例:COPY web.jar /web.jar
  • 注意:與ADD功能相似,只是不能指定URL,使用本地文件(夾)為源文件時,推薦使用COPY

VOLUME

  • 說明:創(chuàng)建掛載點
  • 格式如:VOLUME [path]
  • 示例:VOLUME ["/datas"]
  • 注意:
    • VOLUME在原理和概念上與EXPOSE差不多,都是屬于供容器與容器間使用
    • 通過VOLUME掛載的卷可以供其他容器使用
    • 舉例說明:
      • 創(chuàng)建一個Dockerfile來構(gòu)建一個鏡像,內(nèi)容如下:

          FROM centos
          VOLUME ["/web/images", "/web/files"]
        
      • 構(gòu)建鏡像

          docker build -t "zsl131/test01" .
        
      • 啟動容器

          docker run -d --name test-root
        
      • 可以使用命令:docker inspect test-root來查看容器詳細(xì)信息,在Mounts部份可以看到兩個掛載點:/web/images/web/files

      • 啟動另一個容器來共用這兩個掛載卷

          docker run -it --name test-1 --volumes-from test-root centos
        

        注意:使用--volumes-from來指定掛載點,這時容器test-roottest-1里面都分別有掛載卷/web/images/web/files,可以啟動任意多個容器使用--volumes-from來共用這些掛載卷,這些容器可以來自不同的鏡像。當(dāng)任何一個容器中的掛載卷中的文件發(fā)生變化時其他容器掛載卷中的內(nèi)容也隨之改變。

        容器test-root即使已經(jīng)停止也可以在啟動其他容器時使用--volumes-from test-root來掛載這些卷,只要test-root不被刪除,不過如果test-root真被刪除還可以使用--volumes-from test-1,因為容器test-1中還存在我們所需要的掛載卷,換句話說這些掛載卷永遠(yuǎn)存在直到所有使用這些掛載卷的容器都被刪除。

      • VOLUMEdocker run參數(shù)-v是有區(qū)別的。docker run -v /host/web/images:/web/images -v /host/web/files:/web/files:rw是將容器內(nèi)的/web/images掛載到宿主機(jī)的/host/web/images目錄上;將容器內(nèi)的/web/files掛載到宿主機(jī)的/host/web/files目錄上,rw表示可讀寫。

WORKDIR

  • 說明:設(shè)置工作目錄
  • 格式如:WORKDIR /path
  • 示例:WORKDIR /web
  • 注意:可以使用絕對路徑,也可以使用相對路徑,設(shè)置之后的所有操作都將在這個目錄下完成

特別注意

在上面的描述中可以看到有兩組指令在功能上都差不多,但也是有區(qū)別的:

  • RUN、CMD、ENTRYPOINT執(zhí)行腳本的指令

    • 三個指令都是執(zhí)行腳本
    • RUN是在創(chuàng)建鏡像是執(zhí)行,即使用docker build命令時執(zhí)行,在一個Dockerfile里面可以有多個RUN
    • CMDENTRYPOINT是在運行容器時執(zhí)行,即使用docker run命令時執(zhí)行,這兩個指令在Dockerfile中都只有最行一條被執(zhí)行
    • CMD在使用docker run時可以加參數(shù)將Dockerfile中的CMD覆蓋
    • ENTRYPOINT在Dockerfile中出現(xiàn)后就一定會在docker run時被執(zhí)行,不必?fù)?dān)心會被其他參數(shù)所覆蓋。
  • ADD、COPY拷貝文件(夾)到容器

    • ADD拷貝文件(夾)時可以指定本地文件、遠(yuǎn)程URL地址,如果拷貝的是tar文件時將會被自動解壓成文件夾
    • COPY拷貝文件(夾)時不可以指定遠(yuǎn)程URL地址,拷貝tar文件也不會被自動解壓成文件夾,在拷貝本地文件時建議使用COPY

本文章來自【知識林】

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載自 http://blog.opskumu.com/docker.html 一、Docker 簡介 Docke...
    極客圈閱讀 10,771評論 0 120
  • 五、Docker 端口映射 無論如何,這些 ip 是基于本地系統(tǒng)的并且容器的端口非本地主機(jī)是訪問不到的。此外,除了...
    R_X閱讀 1,972評論 0 7
  • 一、Docker創(chuàng)建鏡像的方式有兩種: 一種通過commit的方式:把做了一系列操作的容器關(guān)閉,然后利用docke...
    jie0112閱讀 3,920評論 0 3
  • Docker — 云時代的程序分發(fā)方式 要說最近一年云計算業(yè)界有什么大事件?Google Compute Engi...
    ahohoho閱讀 15,874評論 15 147
  • 格局太小,自己太low,永遠(yuǎn)把自己框在自己的認(rèn)知里,能有什么未來呢? 晚上和幾個親戚一起聊天,聊到其中一位的孩子時...
    biliali閱讀 265評論 0 0

友情鏈接更多精彩內(nèi)容