# Docker好好玩 ### 幹訓特別課程 *YoMin Su* --- ## 回想一下 ---- ### 身旁有沒有朋友打手遊打到走火入魔? ---- ![](https://i.imgur.com/xVRLp9h.jpg) 13開的「天堂2革命」 ---- ### 或是拿買賣遊戲帳號當日常的朋友? ---- ![](https://i.imgur.com/7w3XCED.jpg) 為了賺小錢,連虛擬機都拿來用了 ---- ### 甚至是,在一台電腦上裝多個系統?! ---- ![](https://i.imgur.com/otejJPs.png) 這一台主機裝了7個Windows... ---- ### 以上皆為取自網路的真實案例 ---- ### 今天要說的Docker則是在Linux的容器 ![](https://i.imgur.com/4gwSdo4.png =500x) (虛擬機的一種) ---- ### 有沒有想過開Minecraft伺服器可以... ---- ### 從這樣 ![](https://i.imgur.com/jw9aUYm.png) ---- ### 變這樣 ![](https://i.imgur.com/m9cbnDx.png) ---- ### 你一定會問,那兩張有差嗎? 有差,當然有差,不然幹嘛提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 ---- #### 執行畫面 ![](https://i.imgur.com/caZDzET.png) ---- ### 指令分析 | 指令 | 用途 | | ----------- | ------------- | | docker | 一切的起頭 | | run | 執行一個Image | | hello-world | Image的名稱 | ---- ### 拿Minecraft伺服器當範例 若想開一個伺服器的話... > docker run > -e EULA=TRUE > -d > -p 25565:25565 > \-\-name mc > itzg/minecraft-server ---- ## 看起來是不是超複雜,超難懂? ![](https://i.imgur.com/yQYy8f7.png) 一臉黑人問號...嗎? ---- ## 我們一個一個參數來解釋吧! ---- ### 「-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之一 ![](https://i.imgur.com/6t5VklK.png) > 也就10M+人在用而已啦~ ---- ### 若你玩的是Bedrock(基岩)版的話... ![](https://i.imgur.com/Lu7w6MS.png) > 好像也有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 ![](https://i.imgur.com/nVsjp6M.png =800x) 幫你把所有設定集合起來,一次執行的好方法 ---- ### 首先提一下如何使用 ---- ### 啟動容器 > docker-compose up 加上「-f」可以指定設定檔 加上「-d」可以在背景執行 ---- ### 停止容器 > docker-compose down 若是以指定檔名的方式去啟動的話,記得一樣要指定檔名來結束 ---- ### 接下來來看內容大概長怎樣 ---- #### 範例的說 ![](https://i.imgur.com/z49neWK.png) ---- #### 還是範例的說,多個服務 ![](https://i.imgur.com/FYjX4mL.png) ---- ### 格式的部分 首先要注意的是,這是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中管理你的容器的方法 ![](https://i.imgur.com/ayXlDid.png) > github.com/docker/dockercraft ---- ### 感謝你的聆聽 ![](https://i.imgur.com/PwULMqk.png =700x) 快去吃午餐吧!! <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}]"}
    352 views