用 Shell 腳本管理 Docker 容器 文章首圖

用 Shell 腳本管理 Docker 容器

用 Shell 腳本管理 Docker 容器

在日常的系統管理與開發工作中,我們經常需要重複執行 Docker 容器的建立、啟動、停止或清理工作。雖然 docker 指令本身已經相當強大,但透過 Shell 腳本將這些操作自動化,不僅能減少人為錯誤,更能大幅提升工作效率。本文將介紹如何撰寫簡單實用的 Shell 腳本,來管理 Docker 容器的生命週期。

建立標準化的容器啟動腳本

許多初學者會手動輸入長串的 docker run 指令,這不僅容易遺漏參數,也難以維護。我們可以將這些參數封裝成變數,並透過腳本動態生成指令。以下是一個通用的啟動腳本範例,適用於大多數的 Web 應用程式或後端服務。

#!/bin/bash

# 定義容器相關變數
CONTAINER_NAME="my-app"
IMAGE_NAME="nginx:latest"
HOST_PORT=8080
CONTAINER_PORT=80
DATA_DIR="./html"

# 檢查 Docker 是否運行中
if ! docker info > /dev/null 2>&1; then
    echo "錯誤:Docker 服務未運行,請先啟動 Docker。"
    exit 1
fi

# 檢查容器是否已存在,若存在則移除以避免衝突
if docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
    echo "容器 ${CONTAINER_NAME} 已存在,正在移除舊容器..."
    docker rm -f ${CONTAINER_NAME}
fi

# 檢查資料夾是否存在,若不存在則建立
if [ ! -d "${DATA_DIR}" ]; then
    mkdir -p ${DATA_DIR}
    echo "已建立資料夾:${DATA_DIR}"
fi

# 啟動容器
echo "正在啟動容器 ${CONTAINER_NAME}..."
docker run -d \
    --name ${CONTAINER_NAME} \
    --restart unless-stopped \
    -p ${HOST_PORT}:${CONTAINER_PORT} \
    -v ${DATA_DIR}:/usr/share/nginx/html:ro \
    ${IMAGE_NAME}

# 驗證容器是否成功啟動
sleep 2
if docker ps --filter "name=${CONTAINER_NAME}" --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
    echo "✅ 容器 ${CONTAINER_NAME} 已成功啟動!"
    echo "可透過 http://localhost:${HOST_PORT} 訪問服務。"
else
    echo "❌ 容器啟動失敗,請檢查日誌:"
    docker logs ${CONTAINER_NAME}
    exit 1
fi

這段腳本展示了幾個關鍵技巧:首先,使用 docker ps -a 搭配 grep 來檢查容器狀態,避免重複啟動導致端口衝突;其次,利用 -v 參數將主機目錄掛載到容器內,確保資料持久化;最後,啟動後透過 sleep 短暫等待並再次檢查狀態,確保服務真正運行無誤。

自動化清理閒置容器與映像檔

隨著開發進程的推進,磁碟空間往往會被大量未使用的容器和 dangling 映像檔佔據。手動執行 docker system prune 雖然有效,但缺乏彈性。我們可以撰寫一個更精簡的清理腳本,僅針對特定條件進行清理,避免誤刪重要資料。

#!/bin/bash

# 清理停止運行的容器
echo "正在清理停止的容器..."
docker container prune -f

# 清理懸浮映像檔(未標籤的映像檔)
echo "正在清理懸浮映像檔..."
docker image prune -f

# 清理無用的卷(Volume)
echo "正在清理無用卷..."
docker volume prune -f

echo "✅ 清理完成!"
echo "您可以使用 'docker system df' 查看當前磁碟使用情況。"

這個腳本使用了 -f(force)參數來跳過確認提示,適合放入 crontab 定期執行。建議每週執行一次,以保持系統環境的乾淨。

常見問題與解決方案

1. 腳本執行時出現「Permission denied」錯誤

這是因為 Shell 腳本預設沒有執行權限。您需要在執行前賦予執行權限:

chmod +x manage_docker.sh
./manage_docker.sh

2. 容器啟動後立即退出(Exit Code 0 或 1)

這通常是因為容器內的進程沒有在前台運行,或者配置錯誤。您可以使用 docker logs <container_name> 查看具體錯誤訊息。例如,若使用 Nginx 卻未正確配置 index.html,容器可能會因找不到主頁而異常退出。確保您的應用進程能持續運行,或使用 tail -f 監控日誌以進行除錯。

小結

透過 Shell 腳本管理 Docker 容器,能將複雜的指令簡化為一鍵操作,特別適合在 CI/CD 流程或批量部署場景中使用。建議您根據實際需求,將變數抽取至環境變數檔(.env)中,以增強腳本的靈活性與安全性。掌握這些基礎技巧,將能讓您更專注於核心業務邏輯,而非瑣碎的環境設定。