iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 5
8
DevOps

用30天來介紹和使用 Docker系列 第 5

Day5: 實作撰寫第一個 Dockerfile

  • 分享至 

  • xImage
  •  

昨天已經體驗過使用 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

建立寫 Dockerfile 會用到的資料夾,指令如下

$ mkdir docker-test
$ cd docker-test
  1. 下載JDK 的安裝檔放在 docker-test資料夾裡,使用的版本是 jdk-8u152

  2. 撰寫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

  1. 撰寫完 Dockerfile 之後資料夾的結構如下圖
    https://ithelp.ithome.com.tw/upload/images/20171208/20103456l7crq2otz2.png

二. Build Docker Image

  1. 預設在和 Dockerfile 檔案同層的資料夾底下輸入, docker build 指令,如下
$ docker build -t mytomcat . --no-cache

使用 --no-cache 的主要原因,是避免在 Build Docker image 時被 cache 住,而造成沒有 build 到修改過的 Dockerfile。

Build 完的結果如下圖:
https://ithelp.ithome.com.tw/upload/images/20171208/20103456dpjWol6ILh.png

  1. Build 完 Docker Image 之後,使用 docker images 指令查看是否有 build 成功如下圖
    https://ithelp.ithome.com.tw/upload/images/20171208/20103456EE1uDr0ky4.png

三. 在 Build 完 Docker Image 之後就可以執行 Docker Container,這時Tomcat 的 Service 也會跟者被執行起來,指令如下

$ docker run mytomcat

Tomcat Service 會被執行起來的主要原因是在 Dockerfile 裡面有寫 CMD 指令,呼叫啟動 Tomcat Service

四. 打開 Browser 確認

  • 要打開 Browser 確認 Tomcat Service 有沒有被執行起來時,發現我們不知道 Docker Container 的 IP,這時侯只能使用 docker exec 進入 docker container查詢 IP 。

要使用 docker exec 指令之前需要先知道 Container 的 ID 所以需要先使用 docker ps 指令查詢 Container ID,如下圖:
https://ithelp.ithome.com.tw/upload/images/20171208/20103456jB4ENkLTJY.png

  • 有了 IP 之後就可以打開 Browser 輸入 http://172.17.0.2:8080 URL的位置,確認 Tomcat Service 是否有啟動,如下圖:
    https://ithelp.ithome.com.tw/upload/images/20171208/20103456oXtdRCpB99.png

前面直接進入 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 畫面了。
https://ithelp.ithome.com.tw/upload/images/20171208/20103456jfkE7ZMFZP.png

今天已經寫了一個簡單的 Dockerfile 了,也把 Image Build 起來了。有關於 Dockerfile 的撰寫指令還有很多東西還沒被介紹到,未來都還會繼續的說明。

明天的目標是把今天建立好的 Docker Image Push 到 Docker Hub上。


上一篇
Day4:用簡單的例子來說明如何使用 Docker 指令
下一篇
Day6:把 Docker Image Push 到 Docker Hub
系列文
用30天來介紹和使用 Docker30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
新鮮的肝
iT邦新手 5 級 ‧ 2019-04-18 16:55:11

您好 想請教 在docker run mytomcat 後
出現了已下錯誤
https://ithelp.ithome.com.tw/upload/images/20190418/20110832CRlc5vEyBX.jpg
我的Dockerfile 為下圖
https://ithelp.ithome.com.tw/upload/images/20190418/20110832Xeb3YfsfDU.jpg

目前看起來是 ADD指令 沒解壓縮安裝
不知是否可以指教??

確認看看 jdk 的檔案路徑是否有放對

0
zebrakky
iT邦新手 4 級 ‧ 2019-07-16 15:17:09

請問這個環境變數 是很重要一定要打嗎?還是說不打也可以

如果沒設定環境變數,打 java 指令就要使用絕對路徑

0
stevehsuh
iT邦新手 5 級 ‧ 2021-09-01 17:38:52

你好,我已經順利啟動tomcat,
但輸入127.17.0.2:8080卻顯示回應時間過長
我改用執行 Docker Container的Linux的ip:8080,卻也顯示拒絕連線。

請問是防火牆需要開通嗎? 因為沒有任何錯誤訊息,不知從何下手../images/emoticon/emoticon02.gif

我要留言

立即登入留言