# 六角鼠年鐵人賽 Week 6 - 使用 DockerFile 建置 Tomcat + MySQL 環境 ==大家好,我是 "為了拿到金角獎盃而努力著" 的文毅青年 - Kai== ### 人月圓 山中書事 張可久 :::info 興亡千古繁華夢,詩眼倦天涯。 孔林喬木,吳宮蔓草,楚廟寒鴉。 數間茅舍,藏書萬卷,投老村家。 山中何事?松花釀酒,春水煎茶。 ::: 這篇將會簡單編寫兩個建置各包著 **Tomcat** 與 **MySQL** 軟體環境的 DockerFile 出來 **Tomcat** 是放置 Java 開發網頁包 War 的 Apache,**MySQL** 則是家喻戶曉的 DB 軟體。 ## 實際建置 DockerFile for Tomcat ### 準備 用 touch 的指令建立一個空白的 DockerFile,並準備一個測試用的 war 包在同一個位置。 新建一個資料夾來放置這些檔案,建置的時候,若沒有下 ignore 參數,則 Docker 會將所有同在資料夾底下的物件全部進行打包建置,這樣會造成 Image 徒增不必要的容量。盡可能避免不必要的檔案被建置進來。 ### DockerFile 內容 #### 檔案名稱: tomcat-8.0_DockerFile ``` # from tomcat:8.0 FROM tomcat:8.0 # set Maintainer MAINTAINER Kai # copy war COPY test.war /usr/local/tomcat/webapps/ # run CMD ["/usr/local/tomcat/bin/catalina.sh","run"] ``` ### 執行 Docker build ``` docker build -t tomcat8_demo -f tomcat-8.0_DockerFile . --no-cache ``` ![](https://i.imgur.com/Bbb2Ybq.png) 如果繼承的 Image 是 Local 沒有的話,那便會花幾分鐘或是數十分鐘從網路上下載 (依照 Image 大小),建置好後可以在 Image List 中看到我們所建置的新的 Image **tomcat8_demo** ![](https://i.imgur.com/59Lr9m1.png) ### 簡單執行並檢視成果 ``` docker run -d -p 8080:8080 tomcat8_demo ``` ![](https://i.imgur.com/EGM7BnT.png) ![](https://i.imgur.com/raqKCsj.png) ### 雜談 **Windows** 的版本因 Docker-machine IP 在 192.168.99.100 故對此才能連通運行中的 Container 而 **Linux** 環境可以直接使用 172.17.0.2:8080 看到成果 ## 實際建置 DockerFile for MySQL ### 準備 建置一個給 MySQL DockerFile 的資料夾 (e.m. mysql_dockerFile),並在裏頭建立一個 sql_scripts 資料夾,後續我們要存放兩個 SQL 檔案。 建立 SQL 檔案 createTable.sql ```sql CREATE TABLE items ( item_no int, item_name varchar(30), item_class_no int, item_price int ); ``` 建立 SQL 檔案 insertData.sql ```sql insert into items values(1001,'candy',1,10); insert into items values(1002,'cookie',1,5); insert into items values(1003,'sugar',1,100); insert into items values(2001,'cake',2,500); insert into items values(3001,'sandwitch',3,150); ``` ### DockerFile 內容 #### 檔案名稱: mysql_DockerFile ``` $ cat mysql_DockerFile # set From FROM mysql:5.7 # add a DB ENV MYSQL_DATABASE store # add the path sql_scripts/ to your image, the scripts in this folder will execute automatically COPY ./sql_scripts/ /docker-entrypoint-initdb.d/ ``` ### 執行 Docker build ``` docker build -t mysql_demo -f mysql_DockerFile . --no-cache ``` ![](https://i.imgur.com/hg4ii6G.png) ![](https://i.imgur.com/H9P0iGl.png) ### 簡單執行並檢視成果 ``` docker run -d -p 3306:3306 --name mysql_demo -e MYSQL_ROOT_PASSWORD=supersecret mysql_demo ``` ![](https://i.imgur.com/jE3wOEC.png) ``` # 進入 container docker exec -it mysql_demo bash # 進入 mysql mysql -u root -p # 輸入密碼 (輸入過程不會看到任何字元) 但請打正確後按 Enter supersecret # 進入後下指令秀出所有 DB show databases; 可以看到我們剛才用 scripts 建立的 store,其餘都是預設 DB # 離開 mysql exit # 離開 container exit ``` ![](https://i.imgur.com/LUcQGFc.png) ## 結語 :::danger PS1. 關於 DockerFile 的文檔,如果檔名就是 DockerFile 則可以省略掉 -f [DockerFile Name] 這一項指令,只是因為是教學,希望可以藉機讓大家知道更多關於設定上的大小事,未來如果還有發現其他細節,我會再一一補充回來~ PS2. 關於 Tomcat 環境的建立可以自己將準備好的 jdk 和 tomcat 包放在與 DockerFile 同一資料夾內,在 build 的時候進行 JDK 與 tomcat 的解壓縮與布署,以此更彈性化去客製個人產品環境。 下篇將會分享更多關於 **Container** 的操作與學習心得 [六角鼠年鐵人賽 Week 7 - Docker Container 操作指令](/llU_a500RHO3dHPH1rhwQw) ::: 首頁 [Kai 個人技術 Hackmd](/2G-RoB0QTrKzkftH2uLueA) ###### tags: `Docker`,`w3HexSchool`