一、環境準備
1. 安裝必要軟件
-
Docker Desktop for Windows
-
下載地址:Docker Desktop: The #1 Containerization Tool for Developers | Docker
-
安裝時勾選"使用 WSL 2 引擎"(推薦)
-
-
WSL 2(Windows Subsystem for Linux)
-
以管理員身份打開 PowerShell 運行:
wsl --install
-
-
VS Code(可選但推薦)
-
安裝 Docker 和 WSL 擴展
-
2. 驗證安裝
docker --version
docker-compose --version
wsl -l -v
二、項目初始化
1. 創建項目目錄結構
/my-go-app
├── /nginx
│ ├── Dockerfile
│ └── nginx.conf
├── Dockerfile
├── docker-compose.yml
├── go.mod
└── main.go
2. 初始化 Go 模塊
go mod init myapp
三、編寫 Go 應用
1. 創建簡單 HTTP 服務 (main.go
)
package mainimport ("fmt""net/http"
)func main() {http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, "Hello from Go app!")})fmt.Println("Server running on port 8080")http.ListenAndServe(":8080", nil)
}
四、配置 Docker
1. Go 應用的 Dockerfile
# 第一階段:構建應用
FROM golang:1.21 AS builder# 設置工作目錄
WORKDIR /app# 先復制依賴文件
COPY go.mod go.sum ./# 下載依賴
RUN go mod download# 復制源代碼
COPY . .# 構建應用(禁用CGO,靜態編譯)
RUN CGO_ENABLED=0 GOOS=linux go build -o myapp .# 第二階段:運行環境
FROM alpine:latest# 安裝CA證書(HTTPS需要)
RUN apk --no-cache add ca-certificatesWORKDIR /root/# 從構建階段復制可執行文件
COPY --from=builder /app/myapp .# 暴露端口
EXPOSE 8080# 運行應用
CMD ["./myapp"]
2. Nginx 配置
nginx/nginx.conf
worker_processes auto;events {worker_connections 1024;
}http {# 上游Go應用服務upstream goapp {server app:8080; # 對應docker-compose中的服務名}server {listen 80;server_name localhost;# 靜態文件服務(可選)location /static/ {alias /var/www/static/;}# 反向代理配置location / {proxy_pass http://goapp;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# WebSocket支持(如需)proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";}# 錯誤頁面error_page 500 502 503 504 /50x.html;location = /50x.html {root /usr/share/nginx/html;}}
}
nginx/Dockerfile
FROM nginx:alpine# 刪除默認配置
RUN rm /etc/nginx/conf.d/default.conf# 復制自定義配置
COPY nginx.conf /etc/nginx/nginx.conf# 復制靜態文件(如有)
# COPY static /var/www/staticEXPOSE 80
五、Docker Compose 配置
docker-compose.yml
version: '3.8'services:# Go應用服務app:build: . # 使用當前目錄的Dockerfilecontainer_name: go-apprestart: unless-stoppedenvironment:- APP_ENV=production# 開發時可以掛載代碼目錄# volumes:# - .:/app# ports:# - "8080:8080" # 開發時可以直接訪問# Nginx服務nginx:build: ./nginxcontainer_name: nginx-proxyports:- "80:80" # 映射主機80端口depends_on:- apprestart: unless-stopped
六、構建與運行
1. 構建鏡像
docker-compose build
2. 啟動服務
docker-compose up -d
3. 查看運行狀態
docker-compose ps
4. 查看日志
# 查看全部日志
docker-compose logs# 實時查看Go應用日志
docker-compose logs -f app# 實時查看Nginx日志
docker-compose logs -f nginx
七、訪問測試
-
通過Nginx訪問:
-
瀏覽器打開:http://localhost
-
應顯示 "Hello from Go app!"
-
-
直接訪問Go應用(開發時):
-
修改docker-compose.yml取消app的ports注釋
-
瀏覽器打開:http://localhost:8080
-
八、開發環境優化
1. 熱重載配置
-
安裝Air熱重載工具:
go install github.com/cosmtrek/air@latest
-
修改docker-compose.yml:
services:app:command: airvolumes:- .:/appenvironment:- APP_ENV=development
2. 文件監視問題解決
Windows文件系統性能問題解決方案:
-
將項目移動到WSL2文件系統:
# 在WSL中創建目錄
wsl
mkdir -p /home/username/projects/my-go-app
exit# 在Windows中訪問
\\wsl$\Ubuntu\home\username\projects\my-go-app
-
或配置Docker Desktop:
-
設置 -> Resources -> File Sharing
-
添加項目目錄
-
九、生產環境建議
-
HTTPS配置:
-
使用Let's Encrypt免費證書
-
修改nginx.conf添加SSL配置
-
-
多階段構建優化:
# 在Go的Dockerfile中添加 RUN go install -tags 'postgres' -v ./...
-
健康檢查:
healthcheck:test: ["CMD", "curl", "-f", "http://localhost:8080/health"]interval: 30stimeout: 10sretries: 3
十、常見問題解決
-
端口沖突:
# 查找占用80端口的進程 netstat -ano | findstr :80# 結束進程(謹慎操作) taskkill /PID <PID> /F
-
容器無法啟動:
# 查看詳細錯誤信息 docker inspect <container_id> | Select-String -Pattern "Error"
-
清理Docker資源:
# 停止并刪除所有容器 docker-compose down# 刪除未使用的鏡像 docker image prune# 刪除所有未使用的資源 docker system prune -a
本教程提供了從零開始到生產部署的完整流程,涵蓋了Windows環境下的特殊注意事項,幫助您高效地在Windows上使用Docker部署Go應用和Nginx反向代理。