# Docker 容器化多用戶 VS Code Server 部署指導手冊
## 📋 目錄
1. [概述](#概述)
2. [系統需求](#系統需求)
3. [準備工作](#準備工作)
4. [Docker 環境安裝](#docker-環境安裝)
5. [容器化部署](#容器化部署)
6. [配置管理](#配置管理)
7. [用戶管理](#用戶管理)
8. [監控與維護](#監控與維護)
9. [故障排除](#故障排除)
10. [安全性考量](#安全性考量)
11. [Amazon Q CLI 自動化部署](#amazon-q-cli-自動化部署)
---
## 概述
本指導手冊將引導您完成 Docker 容器化多用戶 VS Code Server 的完整部署過程。相比傳統的 systemd 服務管理方式,Docker 容器化提供了以下優勢:
### 🐳 容器化優勢
- **完全隔離**: 每個用戶運行在獨立的容器中
- **資源管理**: 可設定 CPU 和記憶體限制
- **易於擴展**: 快速添加或移除用戶
- **統一管理**: 使用 Docker Compose 統一管理所有服務
- **可移植性**: 可輕鬆遷移到其他主機
- **自動恢復**: 容器異常時自動重啟
### 🏗️ 架構概覽
```
┌─────────────────────────────────────────────────────────────┐
│ AWS EC2 Instance │
│ ┌─────────────────────────────────────────────────────────┤
│ │ Docker Engine │
│ │ ┌──────────────────┐ ┌──────────────────┐ │
│ │ │ vscode-apple │ │ vscode-orange │ │
│ │ │ Container │ │ Container │ │
│ │ │ Port: 8080 │ │ Port: 8081 │ │
│ │ │ User: apple │ │ User: orange │ │
│ │ └──────────────────┘ └──────────────────┘ │
│ │ │ │ │
│ │ ┌──────────────────────────────────────────────────┐ │
│ │ │ Docker Network │ │
│ │ │ vscode-network │ │
│ │ └──────────────────────────────────────────────────┘ │
│ └─────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────┤
│ │ Host File System │
│ │ ./data/apple/ ./data/orange/ │
│ │ ├── workspace/ ├── workspace/ │
│ │ ├── config/ ├── config/ │
│ │ └── local/ └── local/ │
│ └─────────────────────────────────────────────────────────┤
└─────────────────────────────────────────────────────────────┘
```
---
## 系統需求
### 🖥️ 硬體需求
- **CPU**: 最少 2 vCPU (建議 4 vCPU 以上)
- **記憶體**: 最少 4GB RAM (建議 8GB 以上)
- **儲存空間**: 最少 20GB 可用空間
- **網路**: 穩定的網際網路連線
### 🐧 軟體需求
- **作業系統**: Amazon Linux 2023 或 Ubuntu 22.04+
- **Docker**: 版本 24.0 以上
- **Docker Compose**: 版本 2.20 以上
- **SSH**: 用於遠端管理
### ☁️ AWS 資源需求
- **EC2 實例**: t3.medium 或更高規格
- **安全群組**: 開放端口 22, 8080, 8081
- **SSH 金鑰對**: 用於安全連線
---
## 準備工作
### 1. 創建 EC2 實例
```bash
# 使用 AWS CLI 創建 Amazon Linux 2023 實例
aws ec2 run-instances \
--image-id ami-0230bd60aa48260c6 \
--count 1 \
--instance-type t3.medium \
--key-name your-key-name \
--security-group-ids sg-xxxxxxxxx \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=Docker-VSCode-Server-AL2023}]'
```
### 2. 配置安全群組
```bash
# 創建安全群組
aws ec2 create-security-group \
--group-name docker-vscode-sg \
--description "Security group for Docker VS Code Server"
# 添加規則
aws ec2 authorize-security-group-ingress \
--group-id sg-xxxxxxxxx \
--protocol tcp \
--port 22 \
--cidr 0.0.0.0/0
aws ec2 authorize-security-group-ingress \
--group-id sg-xxxxxxxxx \
--protocol tcp \
--port 8080 \
--cidr 0.0.0.0/0
aws ec2 authorize-security-group-ingress \
--group-id sg-xxxxxxxxx \
--protocol tcp \
--port 8081 \
--cidr 0.0.0.0/0
```
### 3. 連線到實例
```bash
# SSH 連線
ssh -i your-key.pem ec2-user@your-instance-ip
```
---
## Docker 環境安裝
### 1. 系統更新
```bash
# Amazon Linux 2023
sudo dnf update -y
# Ubuntu 22.04+
sudo apt update && sudo apt upgrade -y
```
### 2. 安裝 Docker
### 2. 安裝 Docker
#### Amazon Linux 2023
```bash
# 安裝 Docker
sudo dnf install -y docker
# 啟動 Docker 服務
sudo systemctl start docker
sudo systemctl enable docker
# 將用戶添加到 docker 群組
sudo usermod -a -G docker ec2-user
# 重新登入以應用群組變更
newgrp docker
# 驗證安裝
docker --version
```
#### Ubuntu 22.04+
```bash
# 安裝必要套件
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
# 添加 Docker GPG 金鑰
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 添加 Docker 儲存庫
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安裝 Docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 啟動 Docker 服務
sudo systemctl start docker
sudo systemctl enable docker
# 將用戶添加到 docker 群組
sudo usermod -a -G docker $USER
# 驗證安裝
docker --version
```
### 3. 安裝 Docker Compose
#### 方法 1: 使用 Docker Compose Plugin (推薦)
```bash
# Amazon Linux 2023 - Docker Compose Plugin 通常已包含在 Docker 安裝中
# 驗證安裝
docker compose version
# 如果未安裝,手動安裝
sudo dnf install -y docker-compose-plugin
```
#### 方法 2: 獨立安裝 Docker Compose
```bash
# 下載最新版本的 Docker Compose
DOCKER_COMPOSE_VERSION=$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep 'tag_name' | cut -d\" -f4)
sudo curl -L "https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 設定執行權限
sudo chmod +x /usr/local/bin/docker-compose
# 建立符號連結
sudo ln -sf /usr/local/bin/docker-compose /usr/bin/docker-compose
# 驗證安裝
docker-compose --version
```
#### 使用建議
```bash
# 推薦使用 docker compose (plugin 版本)
docker compose up -d
# 而不是 docker-compose (獨立版本)
docker-compose up -d
```
---
## 容器化部署
### 1. 創建項目目錄結構
```bash
# 創建主目錄
mkdir -p ~/vscode-docker
cd ~/vscode-docker
# 創建子目錄
mkdir -p scripts data/{apple,orange}/{workspace,config,local}
```
### 2. 創建 Dockerfile
```bash
cat > Dockerfile << 'EOF'
FROM codercom/code-server:4.21.1
USER root
# 更新套件列表並安裝基礎工具
RUN apt-get update && apt-get install -y \
git \
curl \
wget \
nano \
vim \
htop \
net-tools \
sudo \
build-essential \
&& rm -rf /var/lib/apt/lists/*
# 安裝 Python 3.11 和相關工具
RUN apt-get update && apt-get install -y \
python3.11 \
python3.11-pip \
python3.11-venv \
python3.11-dev \
&& ln -sf /usr/bin/python3.11 /usr/bin/python3 \
&& ln -sf /usr/bin/python3.11 /usr/bin/python \
&& rm -rf /var/lib/apt/lists/*
# 安裝 Node.js 20 LTS
RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - \
&& apt-get install -y nodejs
# 安裝常用的全域 npm 套件
RUN npm install -g \
typescript \
ts-node \
nodemon \
pm2 \
@angular/cli \
create-react-app \
vue-cli
# 安裝 Go 1.21
RUN wget https://go.dev/dl/go1.21.6.linux-amd64.tar.gz \
&& tar -C /usr/local -xzf go1.21.6.linux-amd64.tar.gz \
&& rm go1.21.6.linux-amd64.tar.gz
# 安裝 Rust
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
# 設定環境變數
ENV PATH="/usr/local/go/bin:/home/coder/.cargo/bin:${PATH}"
ENV GOPATH="/home/coder/go"
ENV GOROOT="/usr/local/go"
# 建立用戶腳本
COPY scripts/entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/entrypoint.sh
# 設定工作目錄
WORKDIR /home/coder
# 暴露端口
EXPOSE 8080
# 健康檢查
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
CMD curl -f http://localhost:8080 || exit 1
# 使用自定義入口點
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
EOF
```
### 3. 創建入口點腳本
```bash
cat > scripts/entrypoint.sh << 'EOF'
#!/bin/bash
# 設定預設值
USER_NAME=${USER_NAME:-coder}
USER_PASSWORD=${USER_PASSWORD:-password}
WORKSPACE_DIR=${WORKSPACE_DIR:-/home/coder/workspace}
# 建立工作目錄
mkdir -p "$WORKSPACE_DIR"
# 建立配置目錄
mkdir -p /home/coder/.config/code-server
# 建立配置檔案
cat > /home/coder/.config/code-server/config.yaml << CONFIG_EOF
bind-addr: 0.0.0.0:8080
auth: password
password: $USER_PASSWORD
cert: false
disable-telemetry: true
disable-update-check: true
disable-getting-started-override: true
CONFIG_EOF
# 設定 Git 全域配置
sudo -u coder git config --global user.name "$USER_NAME"
sudo -u coder git config --global user.email "$USER_NAME@example.com"
sudo -u coder git config --global init.defaultBranch main
# 設定 Python 虛擬環境
sudo -u coder python3 -m venv "$WORKSPACE_DIR/.venv"
# 建立常用目錄
sudo -u coder mkdir -p "$WORKSPACE_DIR"/{projects,scripts,docs,temp}
# 設定權限
chown -R coder:coder /home/coder
chmod 600 /home/coder/.config/code-server/config.yaml
# 建立歡迎檔案
cat > "$WORKSPACE_DIR/README.md" << WELCOME_EOF
# 歡迎使用 $USER_NAME 的 Docker VS Code Server!
## 🐳 容器化環境特色
### 📋 基本資訊
- **用戶名稱**: $USER_NAME
- **工作目錄**: $WORKSPACE_DIR
- **密碼**: $USER_PASSWORD
- **Code Server 版本**: $(code-server --version | head -n1)
### 🛠️ 預安裝開發環境
#### Python 3.11
- **版本**: $(python3 --version)
- **虛擬環境**: $WORKSPACE_DIR/.venv
- **啟動虛擬環境**: \`source .venv/bin/activate\`
#### Node.js 20 LTS
- **版本**: $(node --version)
- **npm 版本**: $(npm --version)
- **全域套件**: TypeScript, Angular CLI, React CLI, Vue CLI
#### Go 1.21
- **版本**: $(go version)
- **GOPATH**: $GOPATH
- **GOROOT**: $GOROOT
#### Rust
- **版本**: $(rustc --version 2>/dev/null || echo "正在初始化...")
- **Cargo**: $(cargo --version 2>/dev/null || echo "正在初始化...")
### 📁 目錄結構
- \`projects/\` - 您的專案檔案
- \`scripts/\` - 實用腳本
- \`docs/\` - 文件和筆記
- \`temp/\` - 臨時檔案
### 🚀 快速開始
#### Python 開發
\`\`\`bash
# 啟動虛擬環境
source .venv/bin/activate
# 安裝套件
pip install requests flask django
# 創建新專案
mkdir projects/my-python-app
cd projects/my-python-app
\`\`\`
#### Node.js 開發
\`\`\`bash
# 創建 React 應用
cd projects
npx create-react-app my-react-app
# 創建 Angular 應用
ng new my-angular-app
# 創建 Vue 應用
vue create my-vue-app
\`\`\`
#### Go 開發
\`\`\`bash
# 初始化 Go 模組
cd projects
mkdir my-go-app && cd my-go-app
go mod init my-go-app
\`\`\`
#### Rust 開發
\`\`\`bash
# 創建新的 Rust 專案
cd projects
cargo new my-rust-app
cd my-rust-app
cargo run
\`\`\`
### 🔧 實用指令
\`\`\`bash
# 檢查系統資源
htop
# 檢查網路狀態
netstat -tlnp
# Git 操作
git status
git add .
git commit -m "Initial commit"
# 檢查已安裝的套件
pip list # Python 套件
npm list -g --depth=0 # 全域 npm 套件
go list -m all # Go 模組
cargo --list # Rust 工具
\`\`\`
### 📚 學習資源
- [VS Code 官方文件](https://code.visualstudio.com/docs)
- [Python 官方教學](https://docs.python.org/3/tutorial/)
- [Node.js 官方文件](https://nodejs.org/en/docs/)
- [Go 官方教學](https://tour.golang.org/)
- [Rust 官方書籍](https://doc.rust-lang.org/book/)
祝您開發愉快! 🐳✨
WELCOME_EOF
# 建立實用腳本
cat > "$WORKSPACE_DIR/scripts/setup-python-project.sh" << SCRIPT_EOF
#!/bin/bash
# Python 專案快速設定腳本
PROJECT_NAME=\$1
if [ -z "\$PROJECT_NAME" ]; then
echo "使用方法: \$0 <專案名稱>"
exit 1
fi
cd "$WORKSPACE_DIR/projects"
mkdir -p "\$PROJECT_NAME"
cd "\$PROJECT_NAME"
# 創建虛擬環境
python3 -m venv venv
source venv/bin/activate
# 創建基本檔案
cat > requirements.txt << REQ_EOF
requests>=2.31.0
flask>=2.3.0
pytest>=7.4.0
black>=23.0.0
flake8>=6.0.0
REQ_EOF
cat > main.py << MAIN_EOF
#!/usr/bin/env python3
"""
$PROJECT_NAME - 主程式
"""
def main():
print("Hello, $PROJECT_NAME!")
if __name__ == "__main__":
main()
MAIN_EOF
cat > README.md << README_EOF
# \$PROJECT_NAME
## 安裝依賴
\`\`\`bash
source venv/bin/activate
pip install -r requirements.txt
\`\`\`
## 執行
\`\`\`bash
python main.py
\`\`\`
README_EOF
# 安裝依賴
pip install -r requirements.txt
echo "Python 專案 '\$PROJECT_NAME' 已建立完成!"
echo "位置: $WORKSPACE_DIR/projects/\$PROJECT_NAME"
SCRIPT_EOF
chmod +x "$WORKSPACE_DIR/scripts/setup-python-project.sh"
# 設定最終權限
chown -R coder:coder "$WORKSPACE_DIR"
# 切換到 coder 用戶並啟動 code-server
exec sudo -u coder code-server --config /home/coder/.config/code-server/config.yaml "$WORKSPACE_DIR"
EOF
```
### 4. 創建 Docker Compose 配置
```bash
cat > docker-compose.yml << 'EOF'
# Docker Compose 版本 (可選,新版本會自動檢測)
name: vscode-multi-user
services:
vscode-apple:
build:
context: .
dockerfile: Dockerfile
container_name: vscode-apple
hostname: vscode-apple
ports:
- "8080:8080"
environment:
- USER_NAME=apple
- USER_PASSWORD=appleCode2024!
- WORKSPACE_DIR=/home/coder/workspace
volumes:
- ./data/apple/workspace:/home/coder/workspace
- ./data/apple/config:/home/coder/.config
- ./data/apple/local:/home/coder/.local
restart: unless-stopped
networks:
- vscode-network
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/healthz"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
deploy:
resources:
limits:
cpus: '2.0'
memory: 2G
reservations:
cpus: '0.5'
memory: 512M
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
cap_add:
- CHOWN
- DAC_OVERRIDE
- FOWNER
- SETGID
- SETUID
vscode-orange:
build:
context: .
dockerfile: Dockerfile
container_name: vscode-orange
hostname: vscode-orange
ports:
- "8081:8080"
environment:
- USER_NAME=orange
- USER_PASSWORD=orangeCode2024!
- WORKSPACE_DIR=/home/coder/workspace
volumes:
- ./data/orange/workspace:/home/coder/workspace
- ./data/orange/config:/home/coder/.config
- ./data/orange/local:/home/coder/.local
restart: unless-stopped
networks:
- vscode-network
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/healthz"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
deploy:
resources:
limits:
cpus: '2.0'
memory: 2G
reservations:
cpus: '0.5'
memory: 512M
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
cap_add:
- CHOWN
- DAC_OVERRIDE
- FOWNER
- SETGID
- SETUID
networks:
vscode-network:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/16
driver_opts:
com.docker.network.bridge.name: vscode-br0
# 可選:定義 volumes 用於資料持久化
volumes:
apple_workspace:
driver: local
driver_opts:
type: none
o: bind
device: ./data/apple/workspace
orange_workspace:
driver: local
driver_opts:
type: none
o: bind
device: ./data/orange/workspace
EOF
```
### 5. 建立和啟動容器
```bash
# 建立 Docker 映像(使用 BuildKit 加速建立)
DOCKER_BUILDKIT=1 docker compose build --no-cache
# 啟動容器(背景執行)
docker compose up -d
# 檢查容器狀態
docker compose ps
# 查看容器日誌
docker compose logs -f
# 檢查健康狀態
docker compose ps --format "table {{.Name}}\t{{.Status}}\t{{.Ports}}"
```
### 6. 驗證部署
```bash
# 檢查容器是否正常運行
docker compose ps
# 測試網路連通性
curl -I http://localhost:8080
curl -I http://localhost:8081
# 檢查容器資源使用
docker stats --no-stream
# 檢查容器健康狀態
docker inspect --format='{{.State.Health.Status}}' vscode-apple
docker inspect --format='{{.State.Health.Status}}' vscode-orange
```
---
## 配置管理
### 1. 容器配置
每個容器都有獨立的配置,可以通過環境變數進行自定義:
```yaml
environment:
- USER_NAME=username # 用戶名稱
- USER_PASSWORD=password # 登入密碼
- WORKSPACE_DIR=/path # 工作目錄路徑
```
### 2. 資料持久化
容器資料通過 Docker volumes 持久化到主機:
```bash
# 資料目錄結構
./data/
├── apple/
│ ├── workspace/ # 用戶工作檔案
│ ├── config/ # VS Code 配置
│ └── local/ # 本地資料
└── orange/
├── workspace/
├── config/
└── local/
```
### 3. 網路配置
容器使用自定義網路進行通訊:
```bash
# 檢查網路
docker network ls
docker network inspect vscode-docker_vscode-network
```
---
## 用戶管理
### 1. 添加新用戶
創建新用戶容器的步驟:
```bash
# 1. 創建用戶資料目錄
mkdir -p ./data/newuser/{workspace,config,local}
# 2. 在 docker-compose.yml 中添加新服務
cat >> docker-compose.yml << 'EOF'
vscode-newuser:
build: .
container_name: vscode-newuser
ports:
- "8082:8080"
environment:
- USER_NAME=newuser
- USER_PASSWORD=newuserCode2024!
- WORKSPACE_DIR=/home/coder/workspace
volumes:
- ./data/newuser/workspace:/home/coder/workspace
- ./data/newuser/config:/home/coder/.config
- ./data/newuser/local:/home/coder/.local
restart: unless-stopped
networks:
- vscode-network
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080"]
interval: 30s
timeout: 10s
retries: 3
EOF
# 3. 重新部署
docker-compose up -d
```
### 2. 移除用戶
```bash
# 1. 停止並移除容器
docker-compose stop vscode-username
docker-compose rm vscode-username
# 2. 從 docker-compose.yml 中移除服務定義
# 3. 備份並移除用戶資料(可選)
tar -czf username-backup-$(date +%Y%m%d).tar.gz ./data/username/
rm -rf ./data/username/
```
### 3. 用戶管理腳本
創建自動化用戶管理腳本:
```bash
cat > manage-users.sh << 'EOF'
#!/bin/bash
# 用戶管理腳本
show_usage() {
echo "用戶管理腳本"
echo
echo "使用方法:"
echo " $0 add <用戶名> <密碼> [端口] - 添加新用戶"
echo " $0 remove <用戶名> - 移除用戶"
echo " $0 list - 列出所有用戶"
echo " $0 reset-password <用戶名> <新密碼> - 重設密碼"
}
add_user() {
local username=$1
local password=$2
local port=${3:-8082}
if [ -z "$username" ] || [ -z "$password" ]; then
echo "錯誤: 用戶名和密碼不能為空"
return 1
fi
# 檢查用戶是否已存在
if [ -d "./data/$username" ]; then
echo "錯誤: 用戶 $username 已存在"
return 1
fi
# 創建用戶資料目錄
mkdir -p "./data/$username"/{workspace,config,local}
# 添加到 docker-compose.yml
cat >> docker-compose.yml << USER_EOF
vscode-$username:
build: .
container_name: vscode-$username
ports:
- "$port:8080"
environment:
- USER_NAME=$username
- USER_PASSWORD=$password
- WORKSPACE_DIR=/home/coder/workspace
volumes:
- ./data/$username/workspace:/home/coder/workspace
- ./data/$username/config:/home/coder/.config
- ./data/$username/local:/home/coder/.local
restart: unless-stopped
networks:
- vscode-network
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080"]
interval: 30s
timeout: 10s
retries: 3
USER_EOF
# 重新部署
docker-compose up -d
echo "用戶 $username 已成功添加"
echo "存取 URL: http://$(curl -s http://169.254.169.254/latest/meta-data/public-ipv4):$port"
echo "密碼: $password"
}
remove_user() {
local username=$1
if [ -z "$username" ]; then
echo "錯誤: 請指定用戶名"
return 1
fi
# 停止並移除容器
docker-compose stop "vscode-$username" 2>/dev/null
docker-compose rm -f "vscode-$username" 2>/dev/null
# 備份用戶資料
if [ -d "./data/$username" ]; then
tar -czf "${username}-backup-$(date +%Y%m%d_%H%M%S).tar.gz" "./data/$username/"
rm -rf "./data/$username/"
echo "用戶 $username 已移除,資料已備份"
else
echo "用戶 $username 不存在"
fi
}
list_users() {
echo "=== 現有用戶列表 ==="
for dir in ./data/*/; do
if [ -d "$dir" ]; then
username=$(basename "$dir")
echo "- $username"
fi
done
}
case $1 in
add)
add_user "$2" "$3" "$4"
;;
remove)
remove_user "$2"
;;
list)
list_users
;;
*)
show_usage
exit 1
;;
esac
EOF
chmod +x manage-users.sh
```
---
## 監控與維護
### 1. 容器管理腳本
創建完整的容器管理腳本:
```bash
cat > docker-manage.sh << 'EOF'
#!/bin/bash
# Docker VS Code Server 管理腳本 (Amazon Linux 2023 版本)
# 顏色定義
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
show_usage() {
echo "Docker VS Code Server 管理腳本 (Amazon Linux 2023)"
echo
echo "使用方法:"
echo " $0 start - 啟動所有容器"
echo " $0 stop - 停止所有容器"
echo " $0 restart - 重啟所有容器"
echo " $0 status - 檢查容器狀態"
echo " $0 logs [用戶名] - 查看日誌"
echo " $0 shell [用戶名] - 進入容器 shell"
echo " $0 backup - 備份用戶資料"
echo " $0 update - 更新容器映像"
echo " $0 cleanup - 清理未使用的資源"
echo " $0 health - 檢查容器健康狀態"
echo " $0 rebuild - 重建容器映像"
}
start_containers() {
log_info "啟動 VS Code Server 容器..."
docker compose up -d
if [ $? -eq 0 ]; then
log_success "容器啟動完成!"
show_status
else
log_error "容器啟動失敗!"
return 1
fi
}
stop_containers() {
log_info "停止 VS Code Server 容器..."
docker compose down
if [ $? -eq 0 ]; then
log_success "容器已停止!"
else
log_error "容器停止失敗!"
return 1
fi
}
restart_containers() {
log_info "重啟 VS Code Server 容器..."
docker compose restart
if [ $? -eq 0 ]; then
log_success "容器重啟完成!"
show_status
else
log_error "容器重啟失敗!"
return 1
fi
}
show_status() {
echo "=== VS Code Server 容器狀態 ==="
echo
docker compose ps --format "table {{.Name}}\t{{.Status}}\t{{.Ports}}"
echo
echo "=== 容器資源使用 ==="
docker stats --no-stream --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}\t{{.BlockIO}}"
echo
echo "=== 存取資訊 ==="
local public_ip=$(curl -s http://169.254.169.254/latest/meta-data/public-ipv4 2>/dev/null || echo 'localhost')
# 檢查每個服務的端口
for service in $(docker compose config --services); do
local container_name=$(docker compose ps -q $service)
if [ -n "$container_name" ]; then
local port=$(docker port $container_name 8080/tcp 2>/dev/null | cut -d: -f2)
if [ -n "$port" ]; then
echo "$service 用戶: http://$public_ip:$port"
fi
fi
done
}
show_logs() {
local user=$1
if [ -z "$user" ]; then
log_info "顯示所有容器日誌..."
docker compose logs -f --tail=50
else
log_info "顯示用戶 $user 的日誌..."
docker compose logs -f --tail=50 "vscode-$user"
fi
}
enter_shell() {
local user=$1
if [ -z "$user" ]; then
log_error "請指定用戶名 (apple 或 orange)"
return 1
fi
log_info "進入用戶 $user 的容器..."
docker exec -it "vscode-$user" /bin/bash
}
backup_data() {
local backup_dir="./backup/$(date +%Y%m%d_%H%M%S)"
log_info "備份用戶資料到 $backup_dir..."
mkdir -p "$backup_dir"
cp -r ./data/* "$backup_dir/" 2>/dev/null || true
tar -czf "${backup_dir}.tar.gz" -C ./backup "$(basename $backup_dir)"
rm -rf "$backup_dir"
log_success "備份完成: ${backup_dir}.tar.gz"
}
update_containers() {
log_info "更新容器映像..."
docker compose pull
docker compose up -d --build
log_success "容器更新完成!"
}
cleanup_resources() {
log_info "清理未使用的 Docker 資源..."
docker system prune -f
docker volume prune -f
docker network prune -f
log_success "清理完成!"
}
check_health() {
log_info "檢查容器健康狀態..."
echo
for service in $(docker compose config --services); do
local container_name="vscode-$service"
if docker ps --format "{{.Names}}" | grep -q "^$container_name$"; then
local health=$(docker inspect --format='{{.State.Health.Status}}' $container_name 2>/dev/null || echo "no-healthcheck")
case $health in
"healthy")
log_success "$service: 健康 ✓"
;;
"unhealthy")
log_error "$service: 不健康 ✗"
;;
"starting")
log_warning "$service: 啟動中 ⏳"
;;
*)
log_warning "$service: 無健康檢查"
;;
esac
else
log_error "$service: 容器未運行"
fi
done
}
rebuild_containers() {
log_info "重建容器映像..."
docker compose down
docker compose build --no-cache
docker compose up -d
log_success "容器重建完成!"
}
# 檢查 Docker Compose 是否可用
if ! command -v docker &> /dev/null; then
log_error "Docker 未安裝或不在 PATH 中"
exit 1
fi
if ! docker compose version &> /dev/null; then
log_error "Docker Compose 未安裝或不可用"
exit 1
fi
case $1 in
start)
start_containers
;;
stop)
stop_containers
;;
restart)
restart_containers
;;
status)
show_status
;;
logs)
show_logs "$2"
;;
shell)
enter_shell "$2"
;;
backup)
backup_data
;;
update)
update_containers
;;
cleanup)
cleanup_resources
;;
health)
check_health
;;
rebuild)
rebuild_containers
;;
*)
show_usage
exit 1
;;
esac
EOF
chmod +x docker-manage.sh
```
### 2. 健康檢查
```bash
# 檢查容器健康狀態
docker-compose ps
# 檢查特定容器的健康狀態
docker inspect --format='{{.State.Health.Status}}' vscode-apple
# 查看健康檢查日誌
docker inspect --format='{{range .State.Health.Log}}{{.Output}}{{end}}' vscode-apple
```
### 3. 日誌管理
```bash
# 查看容器日誌
docker-compose logs -f vscode-apple
# 限制日誌行數
docker-compose logs --tail=100 vscode-apple
# 查看所有容器日誌
docker-compose logs -f
```
### 4. 資源監控
```bash
# 即時監控容器資源使用
docker stats
# 檢查磁碟使用
docker system df
# 檢查網路狀態
docker network ls
```
---
## 故障排除
### 1. 常見問題
#### 容器無法啟動
```bash
# 檢查容器狀態
docker-compose ps
# 查看容器日誌
docker-compose logs vscode-username
# 檢查 Docker 服務狀態
sudo systemctl status docker
# 重啟 Docker 服務
sudo systemctl restart docker
```
#### 無法存取 Web 介面
```bash
# 檢查端口是否開放
netstat -tlnp | grep 8080
# 檢查防火牆設定
sudo iptables -L
# 檢查安全群組設定
aws ec2 describe-security-groups --group-ids sg-xxxxxxxxx
```
#### 容器記憶體不足
```bash
# 檢查系統記憶體
free -h
# 檢查容器記憶體使用
docker stats --no-stream
# 設定記憶體限制
# 在 docker-compose.yml 中添加:
# deploy:
# resources:
# limits:
# memory: 1G
```
### 2. 除錯指令
```bash
# 進入容器進行除錯
docker exec -it vscode-username /bin/bash
# 檢查容器內部網路
docker exec vscode-username netstat -tlnp
# 檢查容器內部程序
docker exec vscode-username ps aux
# 檢查容器檔案系統
docker exec vscode-username df -h
```
### 3. 效能調優
```bash
# 設定容器資源限制
cat >> docker-compose.yml << 'EOF'
deploy:
resources:
limits:
cpus: '1.0'
memory: 1G
reservations:
cpus: '0.5'
memory: 512M
EOF
# 調整 Docker daemon 設定
sudo tee /etc/docker/daemon.json << 'EOF'
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
EOF
sudo systemctl restart docker
```
---
## 安全性考量
### 1. 網路安全
```bash
# 限制存取來源 IP
# 在安全群組中設定特定 IP 範圍
aws ec2 authorize-security-group-ingress \
--group-id sg-xxxxxxxxx \
--protocol tcp \
--port 8080 \
--cidr 192.168.1.0/24
```
### 2. 容器安全
```bash
# 使用非 root 用戶運行容器
# 在 Dockerfile 中:
USER coder
# 限制容器權限
# 在 docker-compose.yml 中:
security_opt:
- no-new-privileges:true
read_only: true
tmpfs:
- /tmp
- /var/tmp
```
### 3. 資料加密
```bash
# 使用 HTTPS(需要 SSL 憑證)
# 在容器中配置 SSL
# 或使用反向代理(如 Nginx)
```
### 4. 定期更新
```bash
# 定期更新基礎映像
docker pull codercom/code-server:latest
# 重建容器
docker-compose build --no-cache
docker-compose up -d
```
---
## Amazon Q CLI 自動化部署
### 🤖 使用 Amazon Q CLI 快速部署
Amazon Q CLI 可以大幅簡化 Docker 容器化多用戶 VS Code Server 的部署過程。以下是一些實用的 prompt 技巧和自動化工作流程。
### 📝 Prompt 技巧與範例
#### 1. 基礎部署 Prompt
```
我需要在 AWS EC2 上部署一個 Docker 容器化的多用戶 VS Code Server 環境。請幫我:
1. 創建一個 t3.medium EC2 實例(Amazon Linux 2023)
2. 配置安全群組,開放端口 22, 8080, 8081
3. 安裝最新版本的 Docker 和 Docker Compose
4. 創建兩個用戶的 VS Code Server 容器:
- apple 用戶:端口 8080,密碼 appleCode2024!
- orange 用戶:端口 8081,密碼 orangeCode2024!
5. 提供完整的 Dockerfile 和 docker-compose.yml 配置
6. 包含以下開發環境:
- Python 3.11 + pip + venv
- Node.js 20 LTS + npm
- Go 1.21
- Rust 最新版
- 常用開發工具
7. 包含容器管理腳本和健康檢查
請提供詳細的步驟和所有必要的配置檔案,確保相容 Amazon Linux 2023。
```
#### 2. 進階配置 Prompt
```
基於現有的 Docker 容器化 VS Code Server 環境,請幫我:
1. 添加健康檢查和自動重啟機制
2. 設定容器資源限制(CPU: 1核心, 記憶體: 1GB)
3. 配置日誌輪轉和監控
4. 創建用戶管理腳本,支援動態添加/移除用戶
5. 實作資料備份和恢復機制
6. 添加 SSL/HTTPS 支援
7. 設定防火牆和安全性最佳實務
請提供完整的配置和腳本。
```
#### 3. 故障排除 Prompt
```
我的 Docker 容器化 VS Code Server 遇到以下問題:
[描述具體問題,例如:]
- 容器無法啟動,顯示 "port already in use" 錯誤
- 無法透過瀏覽器存取 VS Code 介面
- 容器記憶體使用過高
- 用戶資料沒有正確持久化
請幫我診斷問題並提供解決方案,包括:
1. 問題診斷步驟
2. 具體的修復指令
3. 預防措施
4. 監控和警報設定
```
#### 4. 擴展功能 Prompt
```
請幫我擴展現有的 Docker VS Code Server 環境:
1. 添加 Nginx 反向代理,支援域名存取
2. 整合 Let's Encrypt 自動 SSL 憑證
3. 設定用戶認證系統(LDAP 或 OAuth)
4. 添加檔案共享功能
5. 整合 Git 伺服器
6. 設定自動備份到 S3
7. 添加監控儀表板(Grafana + Prometheus)
請提供完整的架構設計和實作步驟。
```
### 🚀 自動化部署工作流程
#### 完整部署 Prompt 範本
```
# Docker 容器化多用戶 VS Code Server 自動化部署 (Amazon Linux 2023)
請幫我創建一個完整的自動化部署解決方案,包含以下需求:
## 基礎設施需求
- AWS EC2 實例:t3.medium,Amazon Linux 2023 (最新 AMI)
- 安全群組:開放 SSH(22), HTTP(80), HTTPS(443), VS Code(8080-8090)
- 彈性 IP:固定公共 IP 地址
- EBS 儲存:30GB gp3,用於資料持久化和開發環境
## 容器化需求
- Docker Engine:最新穩定版 (24.0+)
- Docker Compose:v2.20+ (使用 plugin 版本)
- 基礎映像:codercom/code-server:4.21.1
- BuildKit:啟用以加速映像建立
## 開發環境需求
- Python 3.11 + pip + venv + 常用套件
- Node.js 20 LTS + npm + TypeScript + 前端框架 CLI
- Go 1.21 + 模組支援
- Rust 最新版 + Cargo
- Git + 全域配置
- 建置工具和實用程式
## 多用戶配置
- 支援動態用戶管理
- 每用戶獨立容器和資料目錄
- 自定義密碼和端口分配
- 資料持久化和備份
- 資源限制 (CPU: 2核心, 記憶體: 2GB)
## 管理功能
- 容器生命週期管理腳本 (使用 docker compose)
- 健康檢查和自動重啟
- 日誌管理和監控
- 資源使用監控
- 自動備份機制
- 用戶管理自動化
## 安全性
- 最小權限原則
- 容器安全配置 (no-new-privileges, cap-drop)
- 網路隔離
- 資料加密
- 存取控制
## 相容性要求
- 確保所有指令相容 Amazon Linux 2023
- 使用 dnf 套件管理器
- 支援最新的 Docker Compose 語法
- 包含錯誤處理和相容性檢查
請提供:
1. 完整的部署腳本 (相容 Amazon Linux 2023)
2. 所有配置檔案 (使用最新語法)
3. 管理和維護腳本
4. 故障排除指南
5. 最佳實務建議
6. 效能調優建議
格式要求:
- 提供可執行的 bash 腳本
- 包含詳細註解
- 錯誤處理和驗證
- 使用者友善的輸出訊息
- 支援 Amazon Linux 2023 特有功能
```
### 🔧 實用的 Q CLI 指令範例
#### 快速部署指令
```bash
# 使用 Q CLI 生成部署腳本
q chat "生成一個 Docker 容器化 VS Code Server 的完整部署腳本,包含 EC2 創建、Docker 安裝、容器配置和用戶管理功能"
# 生成故障排除指南
q chat "為 Docker 容器化 VS Code Server 創建一個完整的故障排除指南,包含常見問題和解決方案"
# 生成監控腳本
q chat "創建一個 Docker 容器監控腳本,包含資源使用、健康檢查和警報功能"
```
#### 互動式部署
```bash
# 啟動互動式部署會話
q chat -a
# 然後輸入:
"我要部署 Docker 容器化的多用戶 VS Code Server,請引導我完成整個過程,一步一步詢問我的需求並提供相應的配置"
```
### 📊 部署後驗證 Prompt
```
部署完成後,請幫我創建一個完整的驗證和測試腳本,包含:
1. 基礎設施驗證
- EC2 實例狀態檢查
- 安全群組規則驗證
- 網路連通性測試
2. Docker 環境驗證
- Docker 服務狀態
- 容器運行狀態
- 映像和網路配置
3. 應用程式驗證
- VS Code Server 可存取性
- 用戶認證測試
- 檔案系統權限檢查
4. 效能測試
- 資源使用監控
- 回應時間測試
- 並發用戶測試
5. 安全性檢查
- 端口掃描
- 權限審計
- 日誌檢查
請提供自動化測試腳本和預期結果。
```
### 🎯 最佳實務 Prompt
```
基於 Docker 容器化多用戶 VS Code Server 的部署經驗,請提供:
1. 生產環境最佳實務
- 高可用性配置
- 負載平衡
- 災難恢復
2. 安全性強化
- 容器安全掃描
- 網路分段
- 存取控制
3. 效能優化
- 資源調優
- 快取策略
- 監控指標
4. 維護和更新
- 自動更新策略
- 備份和恢復
- 版本管理
5. 成本優化
- 資源右調
- 自動縮放
- 成本監控
請提供具體的實作建議和配置範例。
```
### 💡 進階應用場景
#### 1. CI/CD 整合
```
請幫我設計一個 CI/CD 流水線,自動化 Docker 容器化 VS Code Server 的部署和更新:
1. 使用 GitHub Actions 或 AWS CodePipeline
2. 自動化測試和部署
3. 藍綠部署策略
4. 回滾機制
5. 通知和監控整合
```
#### 2. 多環境管理
```
請設計一個多環境(開發、測試、生產)的 Docker VS Code Server 管理方案:
1. 環境隔離策略
2. 配置管理
3. 資料同步
4. 存取控制
5. 監控和日誌分離
```
#### 3. 企業級部署
```
請設計一個企業級的 Docker 容器化 VS Code Server 解決方案:
1. 多租戶架構
2. 企業認證整合(AD/LDAP)
3. 資源配額管理
4. 審計和合規
5. 高可用性和災難恢復
```
### 🔄 持續改進 Prompt
```
基於現有的 Docker 容器化 VS Code Server 部署,請幫我:
1. 分析當前架構的優缺點
2. 識別改進機會
3. 提供升級建議
4. 設計遷移計劃
5. 評估風險和影響
請提供詳細的分析報告和行動計劃。
```
---
## 📚 總結
本指導手冊提供了完整的 Docker 容器化多用戶 VS Code Server 部署方案,針對 **Amazon Linux 2023** 進行了最佳化,包含:
### ✅ 主要特色
- **🐳 完全容器化**: 每個用戶運行在獨立的 Docker 容器中
- **🚀 現代化技術棧**:
- Amazon Linux 2023 (最新穩定版)
- Docker 24.0+ with BuildKit
- Docker Compose v2.20+ (Plugin 版本)
- Code Server 4.21.1
- **🛠️ 豐富的開發環境**:
- Python 3.11 + 虛擬環境
- Node.js 20 LTS + 現代前端工具
- Go 1.21 + 模組支援
- Rust 最新版 + Cargo
- **📊 易於管理**: 使用 Docker Compose 統一管理所有服務
- **🔄 高度可擴展**: 支援動態添加和移除用戶
- **💾 資料持久化**: 用戶資料安全儲存在主機檔案系統
- **🔧 自動化管理**: 提供完整的管理和監控腳本
- **🛡️ 安全隔離**: 容器級別的安全隔離和資源限制
- **💪 效能優化**: 資源限制、健康檢查、自動重啟
### 🆕 Amazon Linux 2023 優勢
- **📦 現代套件管理**: 使用 `dnf` 替代 `yum`,更快的依賴解析
- **🔒 增強安全性**: 最新的安全補丁和強化配置
- **⚡ 效能提升**: 優化的核心和更好的容器支援
- **🔄 長期支援**: 5年的安全更新和維護
- **🐳 原生 Docker 支援**: 更好的容器化效能和穩定性
### 🚀 Amazon Q CLI 優勢
透過 Amazon Q CLI,您可以:
- **🗣️ 快速部署**: 使用自然語言描述需求,自動生成配置
- **🔍 智能故障排除**: 描述問題,獲得精確的解決方案
- **🔄 持續優化**: 根據使用情況不斷改進架構
- **📚 最佳實務**: 獲得業界最佳實務建議
- **🤖 自動化腳本**: 生成各種管理和維護腳本
- **🆕 技術更新**: 自動獲得最新技術棧的建議
### 📈 相比傳統方案的改進
#### vs SystemD 方式
- ✅ 更好的隔離性和安全性
- ✅ 統一的管理介面
- ✅ 自動重啟和健康檢查
- ✅ 資源使用監控
- ✅ 易於擴展和遷移
#### vs Amazon Linux 2
- ✅ 更現代的套件管理 (dnf vs yum)
- ✅ 更好的容器支援
- ✅ 增強的安全性
- ✅ 更長的支援週期
- ✅ 更好的效能
### 📈 後續發展
- **🔧 整合更多開發工具**: Docker, Kubernetes, Terraform
- **🏢 實作企業級認證**: LDAP, OAuth, SAML
- **📊 添加更多監控功能**: Prometheus, Grafana, ELK Stack
- **🌐 支援更多程式語言**: Java, .NET, PHP, Ruby
- **🚀 整合 CI/CD 流水線**: GitHub Actions, GitLab CI, Jenkins
- **☁️ 雲端原生功能**: EKS 部署, Fargate 支援
### 💡 最佳實務建議
1. **🔄 定期更新**: 保持基礎映像和套件的最新版本
2. **📊 監控資源**: 定期檢查容器資源使用情況
3. **💾 備份策略**: 實施自動化備份和災難恢復
4. **🛡️ 安全審計**: 定期檢查安全配置和存取權限
5. **📈 效能調優**: 根據使用情況調整資源限制
6. **📚 文件維護**: 保持部署文件和程序的更新
透過本指導手冊和 Amazon Q CLI 的結合使用,您可以在 Amazon Linux 2023 上快速建立一個強大、安全、可擴展的現代化多用戶開發環境!
---
*最後更新:2025年8月*
*版本:2.0 (Amazon Linux 2023 版)*
*技術棧:Amazon Linux 2023, Docker 24.0+, Docker Compose v2.20+, Code Server 4.21.1*