6 min read

安裝 Docker

安裝 Docker

強烈建議使用 Docker 官方提供的安裝腳本,而不是 Ubuntu 儲存庫中的版本,因為官方版本通常較新且穩定。

I. 前置準備

  1. 安裝必要套件:
sudo apt update
sudo apt install ca-certificates curl gnupg lsb-release -y
  1. 添加 Docker 官方 GPG 金鑰:
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
  1. 設置 Docker 儲存庫:

將 docker 的來源庫加入 apt 下載的來源,就可以透過 apt 安裝

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

安裝 Docker Engine:

sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

II. 將使用者加到docker群組 (optional)

這個做法可以不用sudo,tobiichi3227教授說:多輸入一次密碼就多一次被別人知道的風險

sudo usermod -aG docker $USER
newgrp docker

III. 測試 Docker 安裝

會看到一個訊息,表示 Docker 已經成功安裝並運行。

IV. 安裝Protainer管理容器:

  1. 創建專屬空間:
docker volume create portainer_data
  1. 建立 protainer 容器:
docker run -d \
  --restart=always \
  -p 9000:9000 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  --name portainer \
  portainer/portainer-ce:latest
  • 8000:9000 中:
    • 8000:你電腦(主機)的對外連接埠
    • → 外部用戶(你用瀏覽器)會連到這個 port,例如:https://localhost:8000
    • 9000:容器內部服務的實際 port(Portainer 預設是 9000)
    • → 這是服務在 Docker container 裡運行的 port。
  1. 然後用瀏覽器打開:http://your-ip:9000

V. 移動 Docker 預設 Volume 存放位置 (optional)

前提條件

  1. 確認新硬碟:
  • 已掛載到 Ubuntu,例如 /mnt/newdisk(可以是 RAID 陣列或其他硬碟)
    • 檢查:lsblkdf -h,確認掛載點和可用空間
  • 確保有足夠權限(sudo 或 root),例如 drwxr-xr-x
    • 檢查:ls -all 可以看到詳細的權限
  1. 備份資料:
  • 為避免資料遺失,備份 /var/lib/docker 或重要容器資料。

移動步驟

  1. 停止 Docker 服務
  • 為了安全遷移,需先停止 Docker 服務以避免資料寫入衝突。
sudo systemctl stop docker
sudo systemctl stop docker.socket
  • 確認服務已停止:sudo systemctl status docker(應顯示 inactive
Active: inactive (dead) since ...
  1. 確認新硬碟掛載點
  • 確認新硬碟已掛載到 /mnt/newdisk
  • 若未掛載,執行:
sudo mkdir /mnt/newdisk
sudo mount /dev/sdX1 /mnt/newdisk  # 替換 /dev/sdX1 為實際硬碟分區
  1. 設定權限
  • 輸入ls -all確保新目錄屬於正確用戶(Docker 通常使用 root),輸出範例:
drwxrwxrwx * root root  <size> <time> .
drwxr-xr-x * root root  <size> <time> ..
drwxr-xr-x * root root  <size> <time> docker
  • 若不正確 (例如: drwxr-xr-x * user user <size> <time> docker ),執行:
sudo chown root:root /mnt/newdisk/docker
sudo chmod 755 /mnt/newdisk/docker
  1. 複製 Docker 資料到新位置
  • /var/lib/docker 複製到新硬碟:
    • rsync -av 保留權限和檔案結構,確保完整複製。
sudo rsync -av /var/lib/docker/ /mnt/newdisk/docker/
  • 檢查新目錄:ls /mnt/newdisk/docker,應包含 containers、images、volumes 等。
  1. 驗證資料完整性
sudo du -sh /var/lib/docker
sudo du -sh /mnt/newdisk/docker
  • 若大小一致,則複製成功。若不一致,可進一步參考*2除錯
  1. 更新 Docker 配置
  • 編輯 Docker 的 daemon 設定檔 /etc/docker/daemon.json(若不存在,創建)
  • 添加或修改以下內容,指定新資料目錄:
{
  "data-root": "/mnt/newdisk/docker"
}
  • 為避免混淆,可重命名原始 Docker 資料夾 sudo mv /var/lib/docker /var/lib/docker.bak (optional)
  • 測試成功後可刪除備份:sudo rm -rf /var/lib/docker.bak (optional)
  1. 重新啟動 Docker
  • 啟動 Docker 服務:
sudo systemctl start docker
sudo systemctl start docker.socket
  • 確認服務運行:sudo systemctl status docker ,輸出範例:
Active: active (running) since ...
  • 檢查是否使用新目錄:docker info --format '{{.DockerRootDir}}'
  • 列出容器和鏡像,確保無資料遺失:
docker ps -a
docker images

補充說明:

*1 為什麼移動 Docker Volume?

  • 空間不足:預設的 /var/lib/docker 位於系統分區,可能因鏡像和卷快速填滿。
  • 效能優化:將資料移到專用硬碟(如 RAID 或 SSD)可提升 I/O 效能。
  • 資料管理:在 NAS 環境中,RAID 陣列提供冗餘,適合長期儲存 Docker 資料。

*2 為什麼資料夾大小不一致?

當使用 rsync -av 複製 /var/lib/docker 到新位置時,理論上新舊資料夾大小應完全一致,因為 rsync 會保留檔案內容、權限和結構。大小差異(256KB vs 324KB)可能由以下原因造成:

  1. 檔案系統差異
  • 原始硬碟和新硬碟可能有不同區塊大小資料開銷,導致 du -sh 顯示的大小略有差異。例如,ext4 的預設區塊大小(4KB)與 BTRFS 的壓縮或資料可能導致大小報告不同。
  1. rsync 包含額外檔案
  • rsync -av 可能複製了隱藏檔案(如 . 或 ..)或日誌檔案,導致新資料夾包含額外內容。
  • 如果 Docker 在複製時仍在運行,可能有臨時檔案(如日誌)被包含。
  1. 硬連結或符號連結
  • /var/lib/docker 可能包含硬連結或符號連結,複製時可能被解析為完整檔案,增加大小。
  1. 部分檔案損壞或遺漏
  • 如果複製不完整,某些檔案可能未正確傳輸,導致大小差異。
  1. 單位誤解
  • 確認 du -sh 的單位是否一致(例如 KB vs KiB)。

解決方案:驗證並修正大小差異

  • 確認是否是檔案系統差異:
    • --apparent-size 顯示實際檔案大小,忽略區塊開銷。
sudo du -sh --apparent-size /var/lib/docker
sudo du -sh --apparent-size /mnt/newdisk/docker
  • 若仍不一致,列出兩資料夾的檔案數和內容繼續排查:
sudo find /var/lib/docker -type f | wc -l
sudo find /mnt/newdisk/docker -type f | wc -l
  • 如果檔案數不同,檢查多出的檔案:
    • 這會顯示哪些檔案或目錄不同(例如多出臨時檔案)
diff -r /var/lib/docker /mnt/newdisk/docker
  • 檢查硬連結或符號連結
find /var/lib/docker -type l
    • 若有符號連結,rsync -av 可能複製了目標檔案,導致大小增加。改用複製:
sudo rsync -aH /var/lib/docker/ /mnt/newdisk/docker/
  • 使用更精確的 rsync
    • 先清空新資料夾:sudo rm -rf /mnt/newdisk/docker/*
    • -aH:保留權限和硬連結。
    • --delete:刪除目標中多餘的檔案,確保一致。
sudo rsync -aH --delete /var/lib/docker/ /mnt/raid6/docker/