---
# System prepended metadata

title: GDG on Campus NCU 11/13 Docker 工作坊
tags: [GDGoC, Docker]

---

# GDG on Campus NCU 11/13 Docker 工作坊
[本日簡報連結](https://docs.google.com/presentation/d/1Y9ujVcySOHQs-aGRMu3BR7QkYGrpcgN0FoVWderI530/edit?usp=sharing)
## 目錄
[ToC]

# 安裝Docker
:::spoiler Windows的注意事項
Docker 在 Windows 需要 WSL(Windows Subsystem for Linux) 才能運作，安裝WSL需要在Powershell輸入下列指令
```powershell
wsl --install
```
在安裝完成後電腦需要重新啟動
:::

## 官網下載
Docker 官網：[連結](https://www.docker.com/products/docker-desktop/)

:::spoiler 不知道下載哪一個？
Windows（Intel / AMD）：AMD64
Windows (高通 / ARM)：ARM64
MacOS：M系列選 Apple Silicon ，Intel選 Intel Chips
:::
## 套件管理器 (CLI)

Chocolately
```powershell
choco install docker-desktop docker-cli docker-compose -y
```
Homebrew
```zsh
brew install docker docker-compose
```

APT (Linux)
不同distro有各自要注意的部分，請直接從官網下載Docker Desktop或是參照[官方文件](https://docs.docker.com/engine/install/)。

### 驗證安裝
安裝完成後可以在 command line 輸入以下指令，確認是否有正常安裝！
```bash
docker --version
docker-compose --version
```
![image](https://hackmd.io/_uploads/BJPFoR0JWe.png)


# Hello World from Docker
來執行第一個容器吧！
```zsh
docker run hello-world:latest
```
# Build Your First Image via Docker
## 下載檔案
從GitHub上把今天會用到的檔案抓下來）
```zsh
git clone https://github.com/Yuyu-1115/docker-workshop.git
cd docker-workshop
```
也可以從[這邊](https://github.com/Yuyu-1115/docker-workshop)下載
## 建立 Docker 映像檔（Image）
在`docker-workshop`（repo的根目錄）下執行
```zsh
cd python-webapp
docker build . -t 00python-webapp
```
建立好 image 後可以透過 `docker image list` 來查看目前存在電腦中的所有 images ），也可以直接在 Docker Desktop 查看。
![image](https://hackmd.io/_uploads/ByHGtqdJbe.png)

## 執行容器
為了讓容器能夠正常運作，我們需要：
1. 讓容器跑起來
2. 讓容器能夠被外界存取（開放 port）
3. 幫容器取名字（以便管理）

只要輸入以下的指令，我們就能夠讓剛剛建立好的 image 跑起來了
- Unix-like shell (macOS / Linux)
```zsh
docker run -it \ # 讓容器跑起來（並讓我們能夠跟容器互動）
-p 3000:5000 \ # 讓容器能夠被外界（本機）存取
--name my-first-container \ # 幫容器取名字
python-webapp # 指定 image
```
- Powershell (Windows)
```powershell
docker run -it `
-p 3000:5000 `
--name my-first-container `
python-webapp
```



容器開始執行後 前往 [localhost:3000](http://localhost:3000) 就可以看到跑起來的網站了:D
# Persistent Storage: Volume

## 建立 Volume
```zsh
docker volume create todo-list
```

## 執行容器 w/ Volume
> 如果你有自己取其他的 image/volume 名稱，記得改成對應的名字:D
- Unix-like shell (macOS / Linux)
```zsh
docker run -it \
-p 3000:5000 \
-v todo-list:/app/data \ # 將 todo-list 這個 volume bind 到 /app/data
--name volume-example \
python-webapp
```
```zsh
docker run -it \
-p 3000:5000 \
-v todo-list:/app/data \ # 將 todo-list 這個 volume bind 到 /app/data
--name volume-example \
python-webapp
```
- Powershell (Windows)
```powershell
docker run -it `
-p 3000:5000 `
-v todo-list:/app/data ` # 將 todo-list 這個 volume bind 到 /app/data
--name volume-example `
python-webapp
```
容器開始執行後 前往 [localhost:3000](http://localhost:3000) 就可以看到跑起來的網站了:D
# Multiple Containers at Once: docker-compose
進入 `compose-example` 目錄
```zsh
cd compose-example
```
輸入一條~~魔法~~指令...... 三個容器就跑起來了！
```zsh
docker-compose up -d
```

# Deploy to the Cloud: Google Cloud Platform
這邊先跟大家提醒一下，GCP 託管[並非完全免費](https://docs.cloud.google.com/free/docs/free-cloud-features?hl=zh-tw#:~:text=units%20per%20month-,Learn%20more,vCPU%2Dseconds%20of%20compute%20time)，免費額度也不算太慷慨。
此外，由於使用Cloud Run需要**開啟免費試用**（90天的300美元試用額度）且綁定付款資訊（信用卡）後才能使用，如果不想綁定付款資訊的話這部份就沒辦法實作了。
如果之後有興趣拿GCP來玩看看的話，建議先不要開啟（~~當然也可以開複數帳號重複領取優惠~~），下面也有完整的圖文教學，可以在日後自己來玩看看XD。

（這邊還是會demo一次給大家看）
::: info
等等會介紹不用綁定付款資訊也有足夠免費額度的 Zeabur，敬請期待:D。
:::
## 新增專案
GCP對於服務的管理是以專案為單位，因此我們需要先新增一個專案。
1. 進入 [Google Cloud Console](https://console.cloud.google.com)，點選左上角的選取專案
![image](https://hackmd.io/_uploads/r1U7OKoJbx.png)
2. 點選右上角的新增專案
![image](https://hackmd.io/_uploads/B1lhOKskWe.png)
3. 輸入名字後按下建立即可
![image](https://hackmd.io/_uploads/S1RKdKjyWe.png)
## 部署應用程式
1. 選擇中間的部署應用程式，進入 Cloud Run 的主頁面
![image](https://hackmd.io/_uploads/SyMtJSCJZe.png)
2. 由於我們的 Image 目前存放在 Docker Hub，選擇部署容器
![image](https://hackmd.io/_uploads/rkDUfSA1Ze.png)
> 這邊選擇後會要求你連結「帳單帳戶」，這邊就是要求你輸入付款資訊的地方了
3. 輸入必要資訊
選擇 Artifact Registry / **Docker Hub**
映像檔網址：yuyu15/volume-example
（或是其他你想要部署的 container，這邊以前面build起來的`volume-example`為主）
區域：隨意
驗證：允許公開存取
計費功能：以要求為依據
服務資源調度：自動（下限0）
Ingress：全部
容器-通訊埠：5000（參照Dockerfile）
磁碟區-磁碟區名稱：自己取
bucket 或資料夾：開一個新的bucket，名字取好後其他預設即可
容器-磁碟區掛接：
	- 名稱：剛剛的磁碟區名稱
	- 掛接路徑：/app/data
其他保持預設即可，最後按下建立即完成
![image](https://hackmd.io/_uploads/SkxqVBCkbl.png)

最後透過給予的網址就成功把容器部署上去了！
![image](https://hackmd.io/_uploads/r1aLPBCkWl.png)

連結：[待補](https://volume-example1-519018217117.europe-west1.run.app/)

# Alternative: Zeabur
Zeabur是一個為了部署應用程式而生的 PaaS 平台，每個月提供免費的5美元的額度，基本上對於一些小服務來說，完全不用付錢就能夠 24/7 執行了。
~~如果遇到問題的時候，把問題發在 Threads 上，創辦人就會來幫你解決問題了~~
## 新增專案
Zeabur 網址： https://zeabur.com/zh-TW/
1. 進入控制台，點選建立專案
![image](https://hackmd.io/_uploads/Sy-aZCRkbx.png)
2. 選擇 Docker 容器映像檔
![image](https://hackmd.io/_uploads/rybMH0Aybe.png)
3. 輸入容器資訊後按下部署
映像檔名稱：yuyu15/volume-example
Port：5000（HTTP）
硬碟：（硬碟名稱），路徑：/app/data
![image](https://hackmd.io/_uploads/ByYy_R01-l.png)
![image](https://hackmd.io/_uploads/HJdM_RRkWl.png)
看到運作中就代表服務已經部署完成了
![image](https://hackmd.io/_uploads/HkFUd0AJWe.png)
## 開放公網存取
### Zeabur 子網域
1. 在網路分頁下，選擇綁定Zeabur子網域，輸入一個喜歡的子域名（不得重複）後按下確認綁定即可
> 記得確認右邊的 Port 是不是對的

連結：[Link](https://gdg-ncu-docker.zeabur.app/)

![image](https://hackmd.io/_uploads/r1n6dA0yZx.png)
### 自有網域（以 Cloudflare 為例）
::: info
如果你有自己的網域的話，操作還滿直觀的XD。
這邊主要還是以 demo 目的為主
:::
1. 在網路分頁下，選擇綁定自有網域，輸入你想要的域名（主域名要當然要是你所持有的）
![image](https://hackmd.io/_uploads/HyI1c0RJWx.png)
2. 到 Cloudflare 控制台的 DNS頁面，新增對應的 DNS Records
![image](https://hackmd.io/_uploads/SkQP9C0kZx.png)
![image](https://hackmd.io/_uploads/BJE95RCJ-l.png)
3. 看到綠色背景就代表更新完成了，可以點進去看看:D
![image](https://hackmd.io/_uploads/ryK6c0Ay-x.png)


