天天看點

Docker入門教程(三)Dockerfile

本文講的是<b>Docker入門教程(三)Dockerfile</b>,【編者的話】DockerOne組織翻譯了Flux7的Docker入門教程,本文是系列入門教程的第三篇,介紹了Dockerfile的文法,DockerOne目前在代碼高亮部分還有些Bug,我們會盡快修複,目前在代碼部分有會些字元會被轉義。

現在問題來了,既然Docker能自動建立鏡像,那為什麼要選擇耗時而又乏味的方式來建立鏡像呢?

Docker為我們提供了Dockerfile來解決自動化的問題。在這篇文章中,我們将讨論什麼是Dockerfile,它能夠做到的事情以及Dockerfile的一些基本文法。

Dockerfile包含建立鏡像所需要的全部指令。基于在Dockerfile中的指令,我們可以使用<code>Docker build</code>指令來建立鏡像。通過減少鏡像和容器的建立過程來簡化部署。

Dockerfile支援支援的文法指令如下:

指令不區分大小寫。但是,命名約定為全部大寫。

所有Dockerfile都必須以<code>FROM</code>指令開始。 <code>FROM</code>指令會指定鏡像基于哪個基礎鏡像建立,接下來的指令也會基于這個基礎鏡像(譯者注:CentOS和Ubuntu有些指令可是不一樣的)。<code>FROM</code>指令可以多次使用,表示會建立多個鏡像。具體文法如下:

例如:

上面的指定告訴我們,新的鏡像将基于Ubuntu的鏡像來建構。

繼<code>FROM</code>指令,DockefFile還提供了一些其它的指令以實作自動化。在文本檔案或Dockerfile檔案中這些指令的順序就是它們被執行的順序。

讓我們了解一下這些有趣的Dockerfile指令吧。

1. MAINTAINER:設定該鏡像的作者。文法如下:

2. RUN:在shell或者exec的環境下執行的指令。<code>RUN</code>指令會在新建立的鏡像上添加新的層面,接下來送出的結果用在Dockerfile的下一條指令中。文法如下:

3. ADD:複制檔案指令。它有兩個參數&lt;source&gt;和&lt;destination&gt;。destination是容器内的路徑。source可以是URL或者是啟動配置上下文中的一個檔案。文法如下:

4. CMD:提供了容器預設的執行指令。 Dockerfile隻允許使用一次CMD指令。 使用多個CMD會抵消之前所有的指令,隻有最後一個指令生效。 CMD有三種形式:

5. EXPOSE:指定容器在運作時監聽的端口。文法如下:

6. ENTRYPOINT:配置給容器一個可執行的指令,這意味着在每次使用鏡像建立容器時一個特定的應用程式可以被設定為預設程式。同時也意味着該鏡像每次被調用時僅能運作指定的應用。類似于<code>CMD</code>,Docker隻允許一個ENTRYPOINT,多個ENTRYPOINT會抵消之前所有的指令,隻執行最後的ENTRYPOINT指令。文法如下:

7. WORKDIR:指定<code>RUN</code>、<code>CMD</code>與<code>ENTRYPOINT</code>指令的工作目錄。文法如下:

8. ENV:設定環境變量。它們使用鍵值對,增加運作程式的靈活性。文法如下:

9. USER:鏡像正在運作時設定一個UID。文法如下:

10. VOLUME:授權通路從容器内到主機上的目錄。文法如下:

以下是我們列出的基本的Dockerfile最佳實踐:

保持常見的指令像<code>MAINTAINER</code>以及從上至下更新Dockerfile指令;

當建構鏡像時使用可了解的标簽,以便更好地管理鏡像;

避免在Dockerfile中映射公有端口;

<code>CMD</code>與<code>ENTRYPOINT</code>指令請使用數組文法。

===========================

譯者介紹

原文釋出時間為:2014-12-29

本文作者:田浩浩

本文來自雲栖社群合作夥伴DockerOne,了解相關資訊可以關注DockerOne。

原文标題:Docker入門教程(三)Dockerfile