> ## Documentation Index
> Fetch the complete documentation index at: https://felimet-hub.jmcores.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Docker 核心概念與兩種介面

> Docker 的 Image、Container、Volume 三個核心概念，以及桌面版 GUI 與 docker CLI 的關係。

`Docker` `概念`

裝好 Docker（見 [安裝](/notes/docker/install-windows/)）之後，先把骨架概念與兩種操作介面分清楚，後面的指令、設定與 Compose 才不會學得零碎。

## 桌面版與 CLI 是同一個引擎

Docker Desktop 的圖形介面，和終端機裡的 `docker` 指令，操作的是**同一個 Docker 引擎**，只是兩種介面：

| 介面                 | 適合                     |
| ------------------ | ---------------------- |
| Docker Desktop GUI | 快速看容器狀態、改設定、開關服務、看資源用量 |
| `docker` CLI       | 可重現、可寫進腳本、可組合管線的操作     |

WSL 2 後端下，`docker` 指令在 **WSL 的 Linux 終端機**裡跑體驗最好：檔案系統與引擎同在 Linux 側，少一層跨 OS 開銷（這點在 [資料落點](/notes/docker/guide/storage/) 與 [效能設定](/notes/docker/guide/config/) 會再展開）。

## 三個核心概念

Image、Container、Volume 是 Docker 的骨架，用意要分清楚：

<Tabs>
  <Tab title="Image（映像檔）">
    唯讀的模板，把應用程式的程式碼、執行環境、函式庫與設定全打包進去。

    * 可想成一張「安裝光碟」：本身不會動，是拿來「開」容器的藍本。
    * 由 [Dockerfile](/notes/docker/dockerfile/basics/) 一層層建出來，或從 [Docker Hub](/notes/docker/guide/hub/) 拉現成的。
    * 映像由多個唯讀層（layer）疊成，相同的層在不同映像間共用，省磁碟也加速下載。
  </Tab>

  <Tab title="Container（容器）">
    映像的執行實例。

    * 從同一張映像可以開出多個容器，彼此隔離、各自啟動停止刪除。
    * 可想成從光碟安裝後實際在跑的那套系統。
    * 容器在唯讀映像層之上多一層「**可寫層**」，跑起來後寫進去的東西都在這層；這層跟著容器生死，`docker rm` 就消失（細節見 [資料落點](/notes/docker/guide/storage/)）。
  </Tab>

  <Tab title="Volume（卷）">
    Docker 管理的持久化儲存區，獨立於容器之外。

    * 容器刪了 volume 還在，所以資料庫、使用者上傳這類「要留住」的資料放這。
    * 它解決的正是容器可寫層「容器一刪資料就沒」的問題。
    * 除了 volume，還有 bind mount 與 tmpfs 兩種掛載方式，差別與「不掛載時資料存哪」整理在 [資料落點](/notes/docker/guide/storage/)。
  </Tab>
</Tabs>

用 **Dockerfile** 建出 **Image**，從 Image 開出 **Container** 來跑，需要留住的資料掛到 **Volume**。

## 接下來

* [Docker CLI 指令](/notes/docker/guide/cli/)：每天會用到的指令。
* [Docker Hub](/notes/docker/guide/hub/)：映像從哪來、怎麼判斷可不可信。
* [效能設定](/notes/docker/guide/config/)：WSL 2 後端的資源分配。
* [資料落點](/notes/docker/guide/storage/)：volume、bind mount、tmpfs 與不掛載的差別。
* [Docker Compose](/notes/docker/guide/compose/)：把多個容器兜成一套應用。
