---
# System prepended metadata

title: docker筆記_ubuntu
tags: ["docker\_", linux學習]

---


# 使用 Docker 筆記

## 完整的 Docker 卸載指南

### 步驟 1：識別已安裝的 Docker 套件
執行以下命令以列出已安裝的 Docker 套件：

```bash
dpkg -l | grep -i docker
```

### 步驟 2：卸載 Docker
使用以下命令來完全卸載 Docker：

```bash
sudo apt-get purge -y docker-engine docker docker.io docker-ce docker-ce-cli docker-compose-plugin
sudo apt-get autoremove -y --purge docker-engine docker docker.io docker-ce docker-compose-plugin
```

**注意：** 這些命令不會刪除映像、容器、卷或使用者創建的配置文件。

### 步驟 3：刪除 Docker 映像、容器和卷
如果希望刪除所有 Docker 映像、容器和卷，執行以下命令：

```bash
sudo rm -rf /var/lib/docker /etc/docker
sudo rm /etc/apparmor.d/docker
sudo groupdel docker
sudo rm -rf /var/run/docker.sock
sudo rm -rf /var/lib/containerd
sudo rm -r ~/.docker
```

執行這些命令後，Docker 會完全從系統中移除。

---

## Docker 安裝

### 1. 設定 Docker 的 apt 源

首先，添加 Docker 官方 GPG 金鑰：

```bash
# 安裝所需的證書與工具
$ sudo apt-get update
$ sudo apt-get install ca-certificates curl

# 創建 GPG 金鑰存儲目錄
$ sudo install -m 0755 -d /etc/apt/keyrings

# 下載並安裝 Docker 的 GPG 金鑰
$ sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc

# 給 GPG 金鑰設置訪問權限
$ sudo chmod a+r /etc/apt/keyrings/docker.asc
```

接下來，將 Docker 的 apt 源添加到系統的源列表中：

```bash
$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

$ sudo apt-get update
```

### 2. 安裝 Docker 相關套件

安裝 Docker 引擎及相關的命令行工具：

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

### 3. 驗證 Docker 是否安裝成功

運行 `hello-world` 圖像來檢查 Docker 引擎是否安裝成功：

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

### 如何使 Docker 無需使用 sudo
:::info
非常建議使用，如果使用vscode docker插件，必定要使用底下命令，不用會造成插件異常
:::

如果希望能夠不使用 `sudo` 就啟動 Docker，可以按照以下步驟操作：

```bash
# 1. 創建名為 docker 的組
$ sudo groupadd docker

# 2. 將當前用戶加入 docker 組
$ sudo gpasswd -a ${USER} docker

# 3. 重啟 Docker 服務
$ sudo systemctl restart docker

# 4. 給 /var/run/docker.sock 添加訪問和執行權限
$ sudo chmod a+rw /var/run/docker.sock

# 5. 驗證：現在可以不帶 sudo 啟動 Docker
```

---

## 常用 Docker 指令

- 查看拉取的鏡像：

```bash
$ docker images
```

- 查看所有容器（包括停止的）：

```bash
$ docker ps -a
```

- 將正在運行的容器保存為新的鏡像：

```bash
$ docker commit [OPTIONS] CONTAINER_ID [REPOSITORY[:TAG]]
$ docker commit 8b0d15d4381c my_image:v1.0
```

- 進入正在運行的容器並啟動新的終端會話：

```bash
$ docker exec -it <CONTAINER_ID> /bin/bash
$ docker exec -it 1f3149936998 /bin/bash
```

- 刪除已停止的容器：

```bash
$ docker rm -f <CONTAINER_ID>
```

- 退出容器並讓容器繼續運行：

使用 `Ctrl + P + Q` 來退出容器的交互模式，容器會繼續在後台運行。

- 刪除鏡像：

```bash
$ docker rmi -f IMAGE_ID
# 例如：$ docker rmi -f d2c94e258dcb
```

- 使用 `docker run` 啟動容器：

```bash
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
```

### 參數解釋

- **IMAGE**：必須提供的參數，指定容器的鏡像名稱，`TAG` 用來指定鏡像的版本，默認為 `latest`。
- **OPTIONS**：可選參數，用於設置容器的運行行為。
- **COMMAND**：指定在容器內運行的命令（可選）。
- **ARG**：傳遞給 `COMMAND` 的參數。

### 常用選項

| 參數             | 說明                                                   |
|------------------|--------------------------------------------------------|
| `-d`             | 容器在後台運行，不會阻塞終端（detach 模式）。               |
| `-p HOST_PORT:CONTAINER_PORT` | 將容器內的端口映射到主機的端口，讓容器可被外部訪問。 |
| `--name`         | 指定容器名稱，否則 Docker 會隨機生成一個名稱。            |
| `-v HOST_PATH:CONTAINER_PATH` | 將主機目錄掛載到容器中，實現數據共享與持久化。      |
| `--rm`           | 容器停止後自動刪除，不保留中間文件。                      |
| `-e ENV_VAR`     | 設置環境變量，傳遞給容器中的應用。                       |
| `--network`      | 設定容器的網絡模式（如 bridge、host）。                   |

### 使用範例

1. **啟動一個容器：**

   ```bash
   docker run ubuntu
   ```

   這會啟動一個 `ubuntu` 鏡像的容器，並進入交互模式。

2. **在後台運行一個 Nginx 容器並映射端口：**

   ```bash
   docker run -d -p 8080:80 nginx
   ```

   這會啟動一個 `nginx` 容器，並將容器內部的 `80` 端口映射到主機的 `8080` 端口。

3. **指定容器名稱並啟用自動刪除：**

   ```bash
   docker run --rm --name my_app ubuntu echo "Hello, Docker!"
   ```

   容器執行完 `echo "Hello, Docker!"` 後會自動刪除。

4. **掛載主機目錄到容器中：**

   ```bash
   docker run -v /path/to/host:/path/to/container ubuntu
   ```

   這會將主機的 `/path/to/host` 目錄掛載到容器的 `/path/to/container` 目錄。

### 常見應用場景

- **開發測試**：使用 `-v` 參數同步主機和容器中的文件，實現即時更新。
- **服務部署**：使用 `-p` 參數將應用的端口暴露給外部訪問。
- **批次作業**：使用 `--rm` 在容器停止後自動刪除，保持環境整潔。

### 鏡像導出與導入

如果需要在不同機器之間傳輸 Docker 鏡像，可以使用以下命令將鏡像導出為 `.tar` 檔案，然後再將它導入到其他機器上。

#### 1. 使用 `docker save` 導出鏡像

假設要導出的鏡像名稱為 `your-image:tag`，可以使用以下命令將其保存為 `.tar` 檔案：

```bash
docker save -o your-image.tar your-image:tag
```

#### 2. 傳輸或備份鏡像

導出後，你會擁有一個 `.tar` 檔案（例如 `your-image.tar`）。你可以將這個檔案傳輸到其他機器或備份。

#### 3. 在其他機器上導入鏡像

如果需要將這個鏡像檔案導入到另一台機器，可以使用以下命令：

```bash
docker load -i your-image.tar
```

---

### 範例

假設你有一個名為 `myapp:v1` 的 Docker 鏡像，並希望將它導出為 `myapp_v1.tar` 檔案：

```bash
docker save -o myapp_v1.tar myapp:v1
```

然後，將 `myapp_v1.tar` 傳輸到另一台機器並加載它：

```bash
docker load -i myapp_v1.tar
```


在 Docker 佔滿磁碟的情況下，`/var/lib/docker` 通常是最大宗空間使用者（儲存 image、container、volume、overlay 等）。
以下是幾個安全清理與**完全刪除**的選項👇

---

## 🧹 一、安全清理不影響運作的方式

這類指令清理無用的資源，不會刪除正在使用的容器或映像。

```bash
# 清除已停止的容器、無用的 image、volume、network
sudo docker system prune -a -f --volumes
```

說明：

* `-a`：刪除所有沒用到的 image（不僅是 dangling）
* `-f`：不詢問確認
* `--volumes`：連同無用的 volume 一起清掉

---

## 🔥 二、完全清空 `/var/lib/docker`

⚠️ **這會移除所有 Docker 資料**（包含容器、映像、volume、設定）。請先確認不需要保留任何內容。

```bash
sudo systemctl stop docker
sudo rm -rf /var/lib/docker
sudo systemctl start docker
```

如果你也有使用 `containerd`，可以一併清除：

```bash
sudo systemctl stop containerd
sudo rm -rf /var/lib/containerd
sudo systemctl start containerd
```

---

## 📊 三、查看哪些佔空間最多

```bash
sudo du -h --max-depth=1 /var/lib/docker | sort -hr | head -n 10
```

可以讓你知道是 `overlay2`、`containers` 還是 `volumes` 佔最多空間。

---

## ✅ 建議組合腳本（安全清理）

若你只是想釋放空間又不想破壞系統，可以用這段：

```bash
sudo docker system prune -a -f --volumes
sudo du -sh /var/lib/docker
```

---

