Google Code Prettify

2018年1月6日 星期六

使用 Dockerfile 創建 docker 鏡像

繼「製作包含 java 的 docker 鏡像」手動的製作 docker image 後,這一篇要將手動的流程自動化。docker 提供了一個自動化的方式,就是寫一個叫作 Dockerfile 的 script 文檔,這個文檔不一定要命名為 Dockerfile,這只是預設的檔名。上一篇的 images 是在 centos 中安裝 java 9,所以,我先在 home 目錄下建立一個暫時的目錄 tmp,將 openjdk-9.0.1_linux-x64_bin.tar.gz 放入目錄裡,並於目錄中新增如下的 Dockerfile。
FROM centos:latest
MAINTAINER "Steven Shi"<hi.steven@gmail.com>
ADD openjdk-9.0.1_linux-x64_bin.tar.gz /usr/local
RUN ln -s /usr/local/jdk-9.0.1 /usr/bin/java
ENV JAVA_HOME /usr/bin/java
ENV PATH $JAVA_HOME/bin:$PATH
CMD java -version
然後下這樣的指令:
docker build -t steven/java9 .
console 會出現如下的訊息後,幾秒就完成了一個鏡像,其中有了 -t 參數後面才能帶我們想要的鏡像名稱,最後的句點 (.) 是指在現在的目錄裡尋找 Dockerfile。
接下來說明一下 Dockerfile 中指令的用途:
  • FROM centos:latest
每個鏡像需要有個"基礎鏡像",FROM 即指出要使用的基礎鏡像是 centos 的最新版本。
  • MAINTAINER "Steven Shi"<hi.steven@gmail.com>
MAINTAINER 指令指出這個鏡像由誰創建和維護,後面的參數並沒有規定格式,姓名加上 email,這只是眾多用法中的一種。
  • ADD openjdk-9.0.1_linux-x64_bin.tar.gz /usr/local
ADD 指令的第一個參數是要安裝的檔案的路徑,因為我將 openjdk-9.0.1_linux-x64_bin.tar.gz 和 Dockerfile 放在同一路徑,所以直接寫檔名即可,第二個參數是安裝進 container 的路徑。ADD 指令具有解壓縮的功能,另外一個類似的指令 COPY 就只能將檔案複製到指定的路徑。
  • RUN ln -s /usr/local/jdk-9.0.1 /usr/bin/java
上一篇在解壓縮好 JDK 後,我們有建立一個連結以方便後續的存取,要在 container 中執行命令就用 RUN。如果有多個命令要執行,可以寫好幾個 RUN,但是,建議是在每個命令後加上反斜線 \,然後於次行寫下一個命令,這個方式製作出來的鏡像會比較小,因為每執行一次 RUN,docker 會產生一個鏡像層,多出一點體積。
  • ENV JAVA_HOME /usr/bin/java
  • ENV PATH $JAVA_HOME/bin:$PATH
上一篇手工製作時,我們沒有指定 JAVA_HOME 並設定 PATH,但是一般來說,Java 安裝好之後,這是必要的事。如果要設定環境變數,就用 ENV。
  • CMD java -version
CMD 可以用來在 container 啟動後執行命令,要特別注意的是 CMD 只可以不寫或只寫一次! 這裡簡單的執行 java -version 以確定鏡像製作有成功。
想要了解更多? 可以參考官網 https://docs.docker.com/engine/reference/builder/
【補充】
製作好 image 可以試著把它推到 docker hub,首先當然要註冊一個帳號,我註冊的是 twleader,接著 create 一個 repository,我 create 一個命名為 java9 的 repository,接著如下:
  • docker login
 登入 docker hub,輸入帳號、密碼。
  •  docker tag f6cc7ec468a3 docker.io/twleader/java9
  •  docker push docker.io/twleader/java9
使用 tag 指令,為原本的 steven/java9 加上一個標籤,我命名 docker.io/twleader/java9 這樣才能 push 到 docker hub 的 twleader 帳號裡的 java9 repository,接著就是下 push 指令推到 docker hub 上。



沒有留言:

張貼留言