Windows 下使用 Docker 部署 Go 应用与 Nginx 详细教程
一、环境准备
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 main
import (
"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-certificates
WORKDIR /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/static
EXPOSE 80
五、Docker Compose 配置
docker-compose.yml
version: '3.8'
services:
# Go应用服务
app:
build: . # 使用当前目录的Dockerfile
container_name: go-app
restart: unless-stopped
environment:
- APP_ENV=production
# 开发时可以挂载代码目录
# volumes:
# - .:/app
# ports:
# - "8080:8080" # 开发时可以直接访问
# Nginx服务
nginx:
build: ./nginx
container_name: nginx-proxy
ports:
- "80:80" # 映射主机80端口
depends_on:
- app
restart: 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: air
volumes:
- .:/app
environment:
- 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: 30s timeout: 10s retries: 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反向代理。