# Docker 學習

透過 coursera 課程進行學習\
\
&#x20;<https://www.coursera.org/learn/docker-for-the-absolute-beginner>

## Docker Image

**Image（映像檔）是不可變的「應用程式模板」**。

你可以把它想像成：

* 📀 一個安裝光碟（包含程式、系統、設定）
* 是「靜態」的，不能直接執行
* 裡面通常包含 OS、程式碼、環境、設定等

## Docker Container

**Container（容器）是根據 Image 啟動的「執行實體」**。

你可以把它想像成：

* 🖥️ 從映像檔開出來的「虛擬機器」
* 可以執行、修改、停止、刪除
* 是「動態」的、可互動

## Docker File

簡單來說，Dockerfile 是一個「指令清單」，當你執行 `docker build` 時，Docker 會按照 Dockerfile 的指令一步步去做，最後產生出一個可以執行的映像檔（image）。

#### 📌 常見的 Dockerfile 指令：

| 指令        | 說明                                         |
| --------- | ------------------------------------------ |
| `FROM`    | 指定 base image（例如：`ubuntu`、`node`、`python`） |
| `WORKDIR` | 設定容器內的工作目錄                                 |
| `COPY`    | 複製檔案到映像檔中                                  |
| `RUN`     | 執行一個指令（例如：安裝套件）                            |
| `CMD`     | 設定容器啟動時預設執行的指令                             |
| `EXPOSE`  | 指定容器會開放的 port（只是告知用途，沒實際開 port）            |

***

#### 🧱 範例 Dockerfile：

```
# 使用 Python 3.10 作為基底
FROM python:3.10

# 設定容器內的工作目錄
WORKDIR /app

# 複製 requirements.txt 進去
COPY requirements.txt .

# 安裝 Python 套件
RUN pip install -r requirements.txt

# 複製所有檔案到容器
COPY . .

# 容器啟動時執行的指令
CMD ["python", "app.py"]

```

## Docker build

`Docker build` 是 Docker CLI 中的一個指令，用來**根據 Dockerfile 建立一個映像檔（image）**。

#### 範例：

假設你有這個資料夾結構：

```
my-app/
├── app.py
├── requirements.txt
└── Dockerfile

```

執行：

```
docker build -t my-app-image .
```

這個指令的意思是：

* `-t my-app-image`：給這個 image 命名為 `my-app-image`
* `.`：指定 build context 是目前資料夾（也就是 `Dockerfile` 所在的地方）

## Docker run

`docker run` 是 Docker 中用來「啟動容器」的指令。它會根據你指定的 **映像檔（image）** 開出一個新的 **容器（container）**，並執行其中的程式。

###

你可以把 `docker run` 想成是：

> 💿「用映像檔開機 → 執行應用程式」

***

### 🧠 指令格式

```
docker run [選項] 映像檔名稱 [命令]
```

### 📦 最常用的選項說明

| 選項                    | 說明                       |
| --------------------- | ------------------------ |
| `-it`                 | 互動模式（terminal 可操作）       |
| `-d`                  | 背景執行（detached）           |
| `--name my-container` | 自訂容器名稱                   |
| `-p 本機port:容器port`    | 映射 port，常用於 web 服務       |
| `-v 本機資料夾:容器路徑`       | 掛載 volume（用於 hot reload） |
| `--rm`                | 容器停止後自動刪除                |
| `--env` 或 `-e`        | 設定環境變數                   |

## Docker Volumn

Docker volumes 的作用是：

> ✅ **在容器與主機（或不同容器）之間共享或持久保存資料。**

***

### 📦 為什麼需要 Volume？

當你使用 Docker 容器時，容器的檔案系統是 **臨時的（ephemeral）**，只要容器刪除，裡面的資料就會跟著不見。

舉例：

* 你跑了一個 PostgreSQL 容器，裡面有資料
* 如果你執行 `docker rm`，那些資料就會永久消失！

為了讓資料「持久化」，Docker 提供 Volume 來解決這個問題。

***

### 📁 Volume 的幾個用途：

| 用途               | 說明                                                                 |
| ---------------- | ------------------------------------------------------------------ |
| ✅ **持久化資料**      | 例如 PostgreSQL 的資料夾 `/var/lib/postgresql/data` 掛在 Volume 上，容器刪了資料還在 |
| ✅ **熱更新程式碼（開發）** | 把主機的程式碼（如 Next.js 專案）掛到容器裡，修改會即時同步                                 |
| ✅ **多容器共用資料**    | 不同的容器可以存取同一個 Volume                                                |
| ✅ **備份 / 移植**    | Volume 可以獨立於容器管理與備份                                                |
