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

devtools/2025/4/1 5:32:58/

一、环境准备

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 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
 

七、访问测试

  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: airvolumes:- .:/appenvironment:- 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: 30stimeout: 10sretries: 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.ppmy.cn/devtools/171371.html

相关文章

Python 3.8 Requests 爬虫教程(2025最新版)

遵守网站的爬虫规则、避免爬取敏感信息、保护个人隐私&#xff01; 一、环境配置与基础验证 # 验证 Python 版本&#xff08;需 ≥3.8&#xff09; import sys print(sys.version) # 应输出类似 3.8.12 的信息# 安装 requests 库&#xff08;若未安装&#xff09; # 命令行执…

洛谷: P1443 马的遍历

原题地址:P1443 马的遍历 - 洛谷 题目描述 有一个 nm 的棋盘&#xff0c;在某个点 (x,y) 上有一个马&#xff0c;要求你计算出马到达棋盘上任意一个点最少要走几步。 输入格式 输入只有一行四个整数&#xff0c;分别为 n,m,x,y。 输出格式 一个 nm 的矩阵&#xff0c;代表…

html和css 实现元素顺时针旋转效果(椭圆形旋转轨迹)

一 实现效果 二 实现代码 我自己是用react写的。 1. react 代码如下&#xff1a; import React from "react"; import styles from "./index.less";export default () > {return <div className{styles.containers}><div className{styles.c…

MySQL:数据库基础

数据库基础 1.什么是数据库&#xff1f;2.为什么要学习数据库&#xff1f;3.主流的数据库&#xff08;了解&#xff09;4.服务器&#xff0c;数据库&#xff0c;表之间的关系5.数据的逻辑存储6.MYSQL架构7.存储引擎 1.什么是数据库&#xff1f; 数据库(Database,简称DB)&#x…

RabbitMQ的高级特性介绍(二)

发送方确认 当消息的⽣产者将消息发送出去之后&#xff0c;消息到底有没有正确地到达服务器呢? 如果在消息到 达服务器之前已经丢失(比如RabbitMQ重启, 那么RabbitMQ重启期间⽣产者消息投递失败), 持久化操作也解决不了这个问题&#xff0c;因为消息根本没有到达服务器&#…

物联网系统部署与运维实训室

一、引言 在数字化时代&#xff0c;物联网技术正以前所未有的速度蓬勃发展&#xff0c;广泛渗透到各个领域&#xff0c;深刻改变着人们的生活和工作方式。从智能家居、智能交通到工业自动化、医疗健康等&#xff0c;物联网的应用无处不在&#xff0c;推动着各行业的智能化变革…

“零拷贝”(Zero-Copy)技术详解以及使用场景

“零拷贝”(Zero-Copy)是一种优化数据传输效率的技术,通过减少或消除数据在内存中的复制次数,显著提高I/O操作性能。以下是使用Java代码实现的零拷贝技术示例。 Java NIO 中的零拷贝实现 1. 内存映射文件(Memory Mapped File) import java.io.IOException; import jav…

工作记录 2017-03-07

工作记录 2017-03-07 序号 工作 相关人员 1 修改邮件上的问题。 更新RD服务器。 郝 更新的问题 1、增加了2个菜单Global Fee Category、Global Fee List。 2、增加了Global Fee Category页面。 3、增加了Global Fee List页面。 我在把邮件上的文件生成导入数据库…