当前位置: 首页 > article >正文

Windows 下使用 Docker 部署 Go 应用与 Nginx 详细教程

一、环境准备

1. 安装必要软件

  1. Docker Desktop for Windows

    • 下载地址:Docker Desktop: The #1 Containerization Tool for Developers | Docker

    • 安装时勾选"使用 WSL 2 引擎"(推荐)

  2. WSL 2(Windows Subsystem for Linux)

    • 以管理员身份打开 PowerShell 运行:

      wsl --install
       
  3. 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
 

七、访问测试

  1. 通过Nginx访问

    • 浏览器打开:http://localhost

    • 应显示 "Hello from Go app!"

  2. 直接访问Go应用(开发时):

    • 修改docker-compose.yml取消app的ports注释

    • 浏览器打开:http://localhost:8080

八、开发环境优化

1. 热重载配置

  1. 安装Air热重载工具:

go install github.com/cosmtrek/air@latest
 
  1. 修改docker-compose.yml:

services:
  app:
    command: air
    volumes:
      - .:/app
    environment:
      - APP_ENV=development
 

2. 文件监视问题解决

Windows文件系统性能问题解决方案:

  1. 将项目移动到WSL2文件系统:

# 在WSL中创建目录
wsl
mkdir -p /home/username/projects/my-go-app
exit

# 在Windows中访问
\\wsl$\Ubuntu\home\username\projects\my-go-app
 
  1. 或配置Docker Desktop:

    • 设置 -> Resources -> File Sharing

    • 添加项目目录

九、生产环境建议

  1. HTTPS配置

    • 使用Let's Encrypt免费证书

    • 修改nginx.conf添加SSL配置

  2. 多阶段构建优化

    # 在Go的Dockerfile中添加
    RUN go install -tags 'postgres' -v ./...
     
  3. 健康检查

    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
      interval: 30s
      timeout: 10s
      retries: 3
     

十、常见问题解决

  1. 端口冲突

    # 查找占用80端口的进程
    netstat -ano | findstr :80
    
    # 结束进程(谨慎操作)
    taskkill /PID <PID> /F
     
  2. 容器无法启动

    # 查看详细错误信息
    docker inspect <container_id> | Select-String -Pattern "Error"
     
  3. 清理Docker资源

    # 停止并删除所有容器
    docker-compose down
    
    # 删除未使用的镜像
    docker image prune
    
    # 删除所有未使用的资源
    docker system prune -a
     

本教程提供了从零开始到生产部署的完整流程,涵盖了Windows环境下的特殊注意事项,帮助您高效地在Windows上使用Docker部署Go应用和Nginx反向代理。


http://www.kler.cn/a/601197.html

相关文章:

  • DeepSeek smallpond为何选中DuckDB?轻量级分析数据库的“屠龙术“
  • 内核编程十三:进程状态详解
  • React 知识回顾(HOC、合成事件、Fiber)
  • 【数据结构进阶】位图
  • Python Sanic面试题及参考答案
  • 手动创建kkFileView4.4.0镜像
  • 嵌入式八股RTOS与Linux--hea4与TLSF篇
  • 算法题(107):function
  • ARM异常处理流程与中断机制总结,与常见丢中断情况
  • 【服务器环境安装指南-指定 cuda 版本】在 Ubuntu 22.04 上完成 cuda-toolkit 12.0 和 cudnn 12.x 的安装教程
  • 风格混合增强的解纠缠学习在医学图像分割的无监督域自适应中的应用|文献速递-医学影像人工智能进展
  • 程序化广告行业(31/89):人群分类与广告投放策略全解析
  • 沪深300股指期货的看涨看跌方式是怎样的?
  • 【鸿蒙开发】第五十一章 Camera Kit(相机服务)
  • ragflow安装es报错怎么办
  • 云原生进化:架构现代化的核心引擎
  • 优先级与环境变量的艺术:驾驭 Linux 系统的核心
  • 鸿蒙入门——ArkUI 跨页面数据同步和应用全局单例的UI状态存储AppStorage 小结(三)
  • 贪心算法——思路与例题
  • 华为云助力数字化转型