一、环境准备
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反向代理。