安裝 Docker
強烈建議使用 Docker 官方提供的安裝腳本,而不是 Ubuntu 儲存庫中的版本,因為官方版本通常較新且穩定。
I. 前置準備
- 安裝必要套件:
sudo apt update
sudo apt install ca-certificates curl gnupg lsb-release -y
- 添加 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
- 設置 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 dockerIII. 測試 Docker 安裝
會看到一個訊息,表示 Docker 已經成功安裝並運行。
IV. 安裝Protainer管理容器:
- 創建專屬空間:
docker volume create portainer_data- 建立 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。
- 然後用瀏覽器打開:http://your-ip:9000
V. 移動 Docker 預設 Volume 存放位置 (optional)
前提條件
- 確認新硬碟:
- 已掛載到 Ubuntu,例如
/mnt/newdisk(可以是 RAID 陣列或其他硬碟)- 檢查:
lsblk或df -h,確認掛載點和可用空間
- 檢查:
- 確保有足夠權限(sudo 或 root),例如
drwxr-xr-x- 檢查:
ls -all可以看到詳細的權限
- 檢查:
- 備份資料:
- 為避免資料遺失,備份
/var/lib/docker或重要容器資料。
移動步驟
- 停止 Docker 服務
- 為了安全遷移,需先停止 Docker 服務以避免資料寫入衝突。
sudo systemctl stop docker
sudo systemctl stop docker.socket- 確認服務已停止:
sudo systemctl status docker(應顯示inactive)
Active: inactive (dead) since ...- 確認新硬碟掛載點
- 確認新硬碟已掛載到
/mnt/newdisk - 若未掛載,執行:
sudo mkdir /mnt/newdisk
sudo mount /dev/sdX1 /mnt/newdisk # 替換 /dev/sdX1 為實際硬碟分區- 設定權限
- 輸入
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- 複製 Docker 資料到新位置
- 將
/var/lib/docker複製到新硬碟:rsync -av保留權限和檔案結構,確保完整複製。
sudo rsync -av /var/lib/docker/ /mnt/newdisk/docker/- 檢查新目錄:
ls /mnt/newdisk/docker,應包含 containers、images、volumes 等。
- 驗證資料完整性
sudo du -sh /var/lib/docker
sudo du -sh /mnt/newdisk/docker- 若大小一致,則複製成功。若不一致,可進一步參考*2除錯
- 更新 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)
- 重新啟動 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)可能由以下原因造成:
- 檔案系統差異:
- 原始硬碟和新硬碟可能有不同區塊大小或資料開銷,導致
du -sh顯示的大小略有差異。例如,ext4 的預設區塊大小(4KB)與 BTRFS 的壓縮或資料可能導致大小報告不同。
- rsync 包含額外檔案:
- rsync -av 可能複製了隱藏檔案(如 . 或 ..)或日誌檔案,導致新資料夾包含額外內容。
- 如果 Docker 在複製時仍在運行,可能有臨時檔案(如日誌)被包含。
- 硬連結或符號連結:
/var/lib/docker可能包含硬連結或符號連結,複製時可能被解析為完整檔案,增加大小。
- 部分檔案損壞或遺漏:
- 如果複製不完整,某些檔案可能未正確傳輸,導致大小差異。
- 單位誤解:
- 確認
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/
Member discussion