> For the complete documentation index, see [llms.txt](https://philipzheng.gitbook.io/docker_practice/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://philipzheng.gitbook.io/docker_practice/install/ubuntu.md).

# Ubuntu

Ubuntu 是 Docker 最常用的執行環境之一。本節將介紹如何在 Ubuntu 系統上安裝 Docker，並設定大陸映像檔加速。

## 為什麼推薦 APT 源安裝而不是腳本？

雖然 Docker 官方提供了便捷的安裝腳本（`get.docker.com`），但筆者在生產環境中**強烈推薦透過 Docker 官方 APT 倉庫安裝**，原因如下：

* **版本管理**：透過 APT 倉庫安裝後，可以像管理其他系統軟體套件一樣升級、回滾和鎖定版本
* **安全更新**：Docker 官方倉庫會持續發布新版本和安全修復，適合長期維護
* **一致性**：團隊更容易鎖定同一版本，避免「在我的機器上可以執行」的問題
* **解除安裝乾淨**：APT 套件管理系統會負責清理所有相關檔案，腳本安裝的清理往往不夠徹底

如果你只是想快速嘗試 Docker，腳本安裝沒有問題；但一旦涉及持久維運，APT 源是更成熟的選擇。

> 警告：切勿在沒有設定 Docker APT 源的情況下直接使用 apt 命令安裝 Docker。

## 準備工作

在開始安裝之前，我們需要確認系統版本是否滿足要求，並清理可能存在的舊版本。

### 系統要求

根據 Docker 官方安裝文件，目前受支援的 [Ubuntu](https://ubuntu.com/server) 64 位元版本包括（具體以官方 [安裝文件](https://docs.docker.com/engine/install/ubuntu/) 為準）：

* Ubuntu Resolute Raccoon 26.04 (LTS)
* Ubuntu Questing Quokka 25.10
* Ubuntu Noble 24.04 (LTS)
* Ubuntu Jammy 22.04 (LTS)

> **警告**：Ubuntu 20.04 LTS 已不在 Docker 目前支援列表中，不建議用於新部署。對於仍在執行 20.04 的生產系統，應盡快升級到 22.04 LTS 或 24.04 LTS；若短期內無法遷移，可透過 Ubuntu Pro 取得作業系統層面的擴展安全維護（ESM），但這並不改變 Docker 官方支援矩陣。

在 Ubuntu LTS 版本上，目前 Docker 支援 amd64、arm64、armhf、ppc64el、s390x 等 5 個平台；而非 LTS 版本支援的平台通常較少。同時，LTS 版本會獲得 5 年的升級維護支援，這樣的系統會獲得更長期的安全保障，因此在生產環境中推薦使用 LTS 版本。

### 解除安裝舊版本

Docker 官方建議先解除安裝可能衝突的非官方軟體套件：

```bash
$ for pkg in docker.io docker-compose docker-compose-v2 docker-doc podman-docker containerd runc;
do
    sudo apt remove $pkg;
done
```

## 使用 APT 安裝

先安裝基礎相依，並準備 Docker 官方金鑰目錄：

```bash
$ sudo apt update

$ sudo apt install ca-certificates curl
$ sudo install -m 0755 -d /etc/apt/keyrings
```

如果企業內網已經維護了受信任的軟體套件映像檔，可在後續步驟中替換 `URIs` 的網域名稱；預設建議優先用 Docker 官方倉庫為準。

為了確認所下載軟體套件的合法性，需要新增倉庫簽名金鑰：

```bash
$ sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
$ sudo chmod a+r /etc/apt/keyrings/docker.asc
```

然後向 `apt` 新增 Docker 倉庫：

```bash
$ sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
```

> 如果需要測試頻道，可將 `Components: stable` 改為 `test`，或改用 `test.docker.com` 腳本在測試環境驗證。

更新 APT 快取，並安裝 Docker Engine 及常用 CLI 外掛：

```bash
$ sudo apt update

$ sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```

## 使用腳本自動安裝

在測試或開發環境中，Docker 官方提供了便捷安裝腳本，但官方明確不建議把它作為生產環境的標準安裝方式。

在真正執行前，建議先用 `--dry-run` 預覽腳本動作：

```bash
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh ./get-docker.sh --dry-run

# 若需要測試頻道：
# curl -fsSL https://test.docker.com -o test-docker.sh
# sudo sh ./test-docker.sh
```

確認無誤後，再執行 `sudo sh ./get-docker.sh` 安裝穩定版。

## 啟動 Docker

```bash
$ sudo systemctl enable --now docker
```

## 建立 docker 使用者群組

預設情況下，`docker` 命令會使用 [Unix socket](https://en.wikipedia.org/wiki/Unix_domain_socket) 與 Docker 引擎通訊。而只有 `root` 使用者和 `docker` 群組的使用者才可以存取 Docker 引擎的 Unix socket。出於安全考慮，一般 Linux 系統上不會直接使用 `root` 使用者。因此，更好的做法是將需要使用 `docker` 的使用者加入 `docker` 使用者群組。

> ⚠️ **安全警告：`docker` 使用者群組等同於 `root` 權限**
>
> 將使用者加入 `docker` 群組免去了每次執行 `docker` 命令時輸入 `sudo` 的繁瑣，但這也意味著該使用者可以輕易取得主機的最高 root 權限（例如透過掛載根目錄執行容器）。 如果你在一個多使用者共享的生產系統上設定，切勿隨意將普通使用者加入此群組。此時，更安全的替代方案是使用官方提供的 [**Rootless 模式 (Rootless mode)**](https://docs.docker.com/engine/security/rootless/)，它允許在沒有任何 root 權限的情況下執行 Docker 常駐程式和容器。

建立 `docker` 群組：

```bash
$ sudo groupadd docker
```

將目前使用者加入 `docker` 群組：

```bash
$ sudo usermod -aG docker $USER
```

退出目前終端機並重新登入，進行如下測試。

## 測試 Docker 是否安裝正確

```bash
$ docker run --rm hello-world

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:308866a43596e83578c7dfa15e27a73011bdd402185a84c5cd7f32a88b501a24
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
```

若能正常輸出以上資訊，則說明安裝成功。

## 映像檔加速

如果在使用過程中發現拉取 Docker 映像檔十分緩慢，可以設定 Docker [大陸映像檔加速](/docker_practice/install/mirror.md)。
