昨天已經體驗過使用 Docker 的指令,把 Docker Image Pull 到 local,並且執行 container,然後在 container 上安裝 HTTP Service,就類似是在使用 VM。
但是直接進入 Docker Container 裡面下一些指令安裝程式和改設定檔,不夠自動化,可能需要常常的重覆在做同一件事,這樣會很沒效率。所以今天就來寫 Dockerfile,只要下 docker build
的指令就可以把 Docker Image 建構起來,末來要使用就直接 Run 此 Image。
今天的實作目標是要做到在 Dockerfile 裡面,撰寫安裝 Java 和 Tomcat 的指令,包成 Docker Image, 之後只要呼叫到 docker run
指令,就可以把 Tomcat Service 啟動起來,主要目的用來體驗如何撰寫 Dockerfile 和 Build Image 以及執行 Docker container。
建立寫 Dockerfile 會用到的資料夾,指令如下
$ mkdir docker-test
$ cd docker-test
下載JDK 的安裝檔放在 docker-test資料夾裡,使用的版本是 jdk-8u152
撰寫Dockerfile
$ vi Dockerfile
Dockerfile 的內容如下
FROM centos:7
MAINTAINER jack
RUN yum install -y wget
RUN cd /
ADD jdk-8u152-linux-x64.tar.gz /
RUN wget http://apache.stu.edu.tw/tomcat/tomcat-7/v7.0.82/bin/apache-tomcat-7.0.82.tar.gz
RUN tar zxvf apache-tomcat-7.0.82.tar.gz
ENV JAVA_HOME=/jdk1.8.0_152
ENV PATH=$PATH:/jdk1.8.0_152/bin
CMD ["/apache-tomcat-7.0.82/bin/catalina.sh", "run"]
以上的 Dockerfile 主要有用到的指令說明如下
FROM: 使用到的 Docker Image 名稱,今天使用 CentOS
MAINTAINER: 用來說明,撰寫和維護這個 Dockerfile 的人是誰,也可以給 E-mail的資訊
RUN: RUN 指令後面放 Linux 指令,用來執行安裝和設定這個 Image 需要的東西
ADD: 把 Local 的檔案複製到 Image 裡,如果是 tar.gz 檔複製進去 Image 時會順便自動解壓縮。Dockerfile 另外還有一個複製檔案的指令 COPY
未來還會再介紹
ENV: 用來設定環境變數
CMD: 在指行 docker run
的指令時會直接呼叫開啟 Tomcat Service
docker build
指令,如下$ docker build -t mytomcat . --no-cache
使用 --no-cache 的主要原因,是避免在 Build Docker image 時被 cache 住,而造成沒有 build 到修改過的 Dockerfile。
Build 完的結果如下圖:
docker images
指令查看是否有 build 成功如下圖$ docker run mytomcat
Tomcat Service 會被執行起來的主要原因是在 Dockerfile 裡面有寫 CMD 指令,呼叫啟動 Tomcat Service
docker exec
進入 docker container查詢 IP 。要使用 docker exec
指令之前需要先知道 Container 的 ID 所以需要先使用 docker ps
指令查詢 Container ID,如下圖:
前面直接進入 Docker Container 去看 IP 的位址其實有點麻煩,會故意這樣 Daemon 主要的原因,是讓大家了解到我們把 Docker Container 執行啟來時並不會知道它的 IP 位址在哪,這需要透過設定有關於 Docker 的 Network 來解決這個問題。目前使用最簡單的方法,就是在run docker container 時用 Port 的 Mapping 來解決此問題,重新再一次 run docker container,指令如下:
$ docker run -p 8080:8080 mytomcat
Container 的 8080 port mapping到 localhost 的 8080 port ,這樣只要輸入
http://localhost:8080 就可以看到 tomcat service 的 WebUI 畫面了。
今天已經寫了一個簡單的 Dockerfile 了,也把 Image Build 起來了。有關於 Dockerfile 的撰寫指令還有很多東西還沒被介紹到,未來都還會繼續的說明。
明天的目標是把今天建立好的 Docker Image Push 到 Docker Hub上。
您好 想請教 在docker run mytomcat 後
出現了已下錯誤
我的Dockerfile 為下圖
目前看起來是 ADD指令 沒解壓縮安裝
不知是否可以指教??
確認看看 jdk 的檔案路徑是否有放對
請問這個環境變數 是很重要一定要打嗎?還是說不打也可以
如果沒設定環境變數,打 java 指令就要使用絕對路徑
你好,我已經順利啟動tomcat,
但輸入127.17.0.2:8080卻顯示回應時間過長
我改用執行 Docker Container的Linux的ip:8080,卻也顯示拒絕連線。
請問是防火牆需要開通嗎? 因為沒有任何錯誤訊息,不知從何下手..