# Docker好好玩
### 幹訓特別課程
*YoMin Su*
---
## 回想一下
----
### 身旁有沒有朋友打手遊打到走火入魔?
----

13開的「天堂2革命」
----
### 或是拿買賣遊戲帳號當日常的朋友?
----

為了賺小錢,連虛擬機都拿來用了
----
### 甚至是,在一台電腦上裝多個系統?!
----

這一台主機裝了7個Windows...
----
### 以上皆為取自網路的真實案例
----
### 今天要說的Docker則是在Linux的容器

(虛擬機的一種)
----
### 有沒有想過開Minecraft伺服器可以...
----
### 從這樣

----
### 變這樣

----
### 你一定會問,那兩張有差嗎?
有差,當然有差,不然幹嘛提xD
----
### 那,差在哪?
一個需要你從官網下載檔案,自己處理所有東西
另一個只需要一條指令,便將所有東西都準備好
----
### 除了方便架伺服器外,還能做啥?
架各種服務、各種實驗環境、服務之間各自切分、etc...
---
## 那實際上該怎麼使用呢?
----
### 首先,你需要有Docker Engine
但令人難過的是,Docker沒辦法跑在你們目前的系統上,就算有WSL也是一樣(WSL 2除外)
----
### 解決辦法
①將 WSL 1升級到 WSL 2,並安裝Docker Desktop
~~②使用我提供的系統~~
③裝任一Linux系統到你的筆電上 <-- 推薦!!
----
### 良心建議
如果你覺得你之後依然會想玩Docker的話,建議用①或③
~~若覺得今天過後就不會用到的話,建議選擇②~~
> ~~辦法2的系統在幹訓後就會移除!~~
----
### 解決辦法①
```shell=
wsl -l -v #找到你使用的Distro
wsl --set-version <Distro> 2 #將版本修改為2
```
> 記得安裝Docker Desktop
----
### 解決辦法②
~~SSH到以下位置,帳號是學號,密碼是學號去頭~~
> ~~140.125.207.217:2270~~
----
### 解決辦法③
雖然很棒,但今天可能不太適合...
----
### 相信各位的Docker都應該可以使用了,無論你用哪種方法,可以上課的方法,就是好方法~
---
## 首次嘗試
----
### Hello-World 的部分
> docker run hello-world
----
#### 執行畫面

----
### 指令分析
| 指令 | 用途 |
| ----------- | ------------- |
| docker | 一切的起頭 |
| run | 執行一個Image |
| hello-world | Image的名稱 |
----
### 拿Minecraft伺服器當範例
若想開一個伺服器的話...
> docker run
> -e EULA=TRUE
> -d
> -p 25565:25565
> \-\-name mc
> itzg/minecraft-server
----
## 看起來是不是超複雜,超難懂?

一臉黑人問號...嗎?
----
## 我們一個一個參數來解釋吧!
----
### 「-e」參數
用於設定環境變數
> EULA=TRUE
----
### 「-d」參數
用於讓Container執行在背景
> 就在背後跑,沒啥好說的~
----
### 「-p」參數
Port映射,將容器裡面的Port對到容器外面
前面是外面,後面是裡面
> 25565:25565
----
#### 友情提醒
預設情況下,Docker會直接操作系統的iptables,因此會直接跨過ufw,若你希望服務只能在Local存取,請在Port前面加上127.0.0.1,就像範例這樣
> 127.0.0.1:25565:25565
----
### 「\-\-name」
幫容器取名字,方便你管理
> mc
----
### itzg/minecraft-server
就是MC伺服器的Image之一

> 也就10M+人在用而已啦~
----
### 若你玩的是Bedrock(基岩)版的話...

> 好像也有Image可以用呢!
----
### 除上述以外,「-v」參數
可以把裡面跟外面的檔案Mapping起來
路徑中間用「:」連接
> 前面是外面,後面是裡面
----
#### 小測驗時間
> /srv/gitlab:/etc/gitlab
哪個在內?哪個在外?
----
### 如果想在容器中執行指令的話
> docker exec -i mc rcon-cli
| 指令 | 用途 |
| ---- | -------------- |
| exec | 執行指令 |
| -i | 讓介面可以互動 |
| mc | Container名稱 |
| rcon-cli | 指令or功能 |
---
## Dockerfile
容器映像的起承轉合
----
### 用途
別人的映像很方便,我也想自己弄一個,可以嗎?
> 當然可以!
----
### 快速教學時間
```dockerfile=
FROM golang:1.15.5-alpine3.12
MAINTAINER YoMin_Su
WORKDIR /data
ADD . /data
RUN cd /data && go build
EXPOSE 8080
ENTRYPOINT ./data
```
----
### 快速解釋時間
| | |
| ---------- | ------------------------------ |
| FROM | 讓此映像建立在另一個映像上 |
| MAINTAINER | 此映像的設計者(製作者) |
| WORKDIR | 容器內的預設工作目錄 |
| ADD | 將目錄內的檔案複製到映像中 |
| RUN | 在映像中執行指令 |
| EXPOSE | 開一個"門"讓外側可以Bind通訊埠 |
| ENTRYPOINT | 在映像啟動後執行的指令(程式) |
----
### 範例內容
API.go
```go=
package main
import (
"fmt"
"log"
"net/http"
)
func main() {
http.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "API Working!")
})
log.Fatal(http.ListenAndServe(":8080", nil))
}
```
---
## Docker很厲害,但有沒有方便執行的工具?
----
### 當然有,就是Docker-Compose

幫你把所有設定集合起來,一次執行的好方法
----
### 首先提一下如何使用
----
### 啟動容器
> docker-compose up
加上「-f」可以指定設定檔
加上「-d」可以在背景執行
----
### 停止容器
> docker-compose down
若是以指定檔名的方式去啟動的話,記得一樣要指定檔名來結束
----
### 接下來來看內容大概長怎樣
----
#### 範例的說

----
#### 還是範例的說,多個服務

----
### 格式的部分
首先要注意的是,這是yml檔,也就是YAML格式
雖然不像Python那樣對空格極度敏感,但<span class=bluegreen>同級別的項目</span>需要在該行前面有<span class=bluegreen>相同的空格數量</span>
> 父項目與子項目,建議相差2格
----
### 實際操作時間
拿前面提到的麥塊伺服器當範例
我們來實際寫一下docker-compose.yml
----
### 特殊情況:只要啟動其中一個
若今天只需要啟動yml中的其中一個容器,可以透過在啟動指令的最後方加上服務名稱,即可單獨啟動
> docker-compose up -d minecraft
----
#### 額外補充
前一頁所提到「加上服務名稱」的方法,基本適用於大部分docker-compose指令。也就是說,如果今天有單一容器需要更新或是重建,可以單獨重新up該容器,就可以處理好。
---
## Image分享
----
### Dockercraft
在Minecraft中管理你的容器的方法

> github.com/docker/dockercraft
----
### 感謝你的聆聽

快去吃午餐吧!!
<style>
.orange {
color: #FF8800;
}
.red {
color: #FF0000;
}
.bluegreen {
color: #00FFCC;
}
.gray {
color: #272727;
}
.blue {
color: #00E3E3
}
</style>
{"metaMigratedAt":"2023-06-15T15:43:19.742Z","metaMigratedFrom":"YAML","title":"Docker好好玩","breaks":true,"slideOptions":"{\"transition\":\"concave\",\"allottedMinutes\":90}","contributors":"[{\"id\":\"86b6dc70-72ec-4014-84f0-bfb2a06c3dc4\",\"add\":5076,\"del\":206}]"}