# 六角鼠年鐵人賽 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
```

如果繼承的 Image 是 Local 沒有的話,那便會花幾分鐘或是數十分鐘從網路上下載 (依照 Image 大小),建置好後可以在 Image List 中看到我們所建置的新的 Image **tomcat8_demo**

### 簡單執行並檢視成果
```
docker run -d -p 8080:8080 tomcat8_demo
```


### 雜談
**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
```


### 簡單執行並檢視成果
```
docker run -d -p 3306:3306 --name mysql_demo -e MYSQL_ROOT_PASSWORD=supersecret mysql_demo
```

```
# 進入 container
docker exec -it mysql_demo bash
# 進入 mysql
mysql -u root -p
# 輸入密碼 (輸入過程不會看到任何字元) 但請打正確後按 Enter
supersecret
# 進入後下指令秀出所有 DB
show databases;
可以看到我們剛才用 scripts 建立的 store,其餘都是預設 DB
# 離開 mysql
exit
# 離開 container
exit
```

## 結語
:::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`