1. 程式人生 > >Docker入門教程(三)Dockerfile

Docker入門教程(三)Dockerfile

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

Docker系列教程的上一篇文章中,我們介紹了15個Docker命令,你應該對Docker有個大致的瞭解了。那15個命令在手動建立映象時會用到,它們涵蓋了映象的建立、提交、搜尋、pull和push的功能。

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

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

易於自動化的命令

Dockerfile包含建立映象所需要的全部指令。基於在Dockerfile中的指令,我們可以使用Docker build命令來建立映象。通過減少映象和容器的建立過程來簡化部署。

Dockerfile支援支援的語法命令如下:

INSTRUCTION argument


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

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

FROM <image name>


例如:

FROM ubuntu


上面的指定告訴我們,新的映象將基於Ubuntu的映象來構建。

FROM命令,DockefFile還提供了一些其它的命令以實現自動化。在文字檔案或Dockerfile檔案中這些命令的順序就是它們被執行的順序。

讓我們瞭解一下這些有趣的Dockerfile命令吧。
1. MAINTAINER:設定該映象的作者。語法如下:

MAINTAINER <author name>


2. RUN:在shell或者exec的環境下執行的命令。RUN

指令會在新建立的映象上新增新的層面,接下來提交的結果用在Dockerfile的下一條指令中。語法如下:

RUN 《command》


3. ADD:複製檔案指令。它有兩個引數<source>和<destination>。destination是容器內的路徑。source可以是URL或者是啟動配置上下文中的一個檔案。語法如下:

ADD 《src》 《destination》


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

CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2


5. EXPOSE:指定容器在執行時監聽的埠。語法如下:

EXPOSE <port>;


6. ENTRYPOINT:配置給容器一個可執行的命令,這意味著在每次使用映象建立容器時一個特定的應用程式可以被設定為預設程式。同時也意味著該映象每次被呼叫時僅能執行指定的應用。類似於CMD,Docker只允許一個ENTRYPOINT,多個ENTRYPOINT會抵消之前所有的指令,只執行最後的ENTRYPOINT指令。語法如下:

ENTRYPOINT ["executable", "param1","param2"]
ENTRYPOINT command param1 param2


7. WORKDIR:指定RUNCMDENTRYPOINT命令的工作目錄。語法如下:

WORKDIR /path/to/workdir


8. ENV:設定環境變數。它們使用鍵值對,增加執行程式的靈活性。語法如下:

ENV <key> <value>


9. USER:映象正在執行時設定一個UID。語法如下:

USER <uid>


10. VOLUME:授權訪問從容器內到主機上的目錄。語法如下:

VOLUME ["/data"]

 

Dockerfile最佳實踐

與使用的其他任何應用程式一樣,總會有可以遵循的最佳實踐。你可以閱讀更多有關Dockerfile的最佳實踐

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

  • 保持常見的指令像MAINTAINER以及從上至下更新Dockerfile命令;
  • 當構建映象時使用可理解的標籤,以便更好地管理映象;
  • 避免在Dockerfile中對映公有埠;
  • CMDENTRYPOINT命令請使用陣列語法。