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 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.mzph.cn/diannao/75526.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# .net ai Agent AI视觉应用 写代码 改作业 识别屏幕 标注等

C# net deepseek RAG AI开发 全流程 介绍_c# 向量处理 deepseek-CSDN博客 视觉多模态大模型 通义千问2.5-VL-72B AI大模型能看懂图 看懂了后能干啥呢 如看懂图 让Agent 写代码 &#xff0c;改作业&#xff0c;识别屏幕 标注等等。。。 据说是目前最好的免费图片识别框架 通…

Docker多阶段构建:告别臃肿镜像的终极方案

Docker多阶段构建:告别臃肿镜像的终极方案 你是否遇到过这样的问题:一个简单的应用,Docker镜像却高达1GB?编译工具、临时文件、开发依赖全被打包进去,导致镜像臃肿且不安全。 多阶段构建(Multi-stage Build) 就是为解决这一问题而生——它像搬家时“只带必需品”,让生…

大模型应用开发之大模型工作流程

一&#xff1a;大模型的问答工作流程 1.1: 分词和向量化 如上图所示&#xff0c;我们如果让大模型去回答问题&#xff0c;首先我们会输入一些文字给到大模型&#xff0c;大模型本质上是个数学模型&#xff0c;它是理解不了人类的整句话的&#xff0c;所以它会把我们的对应的句…

SpringMVC 请求处理

SpringMVC 请求处理深度解析&#xff1a;从原理到企业级应用实践 一、架构演进与核心组件协同 1.1 从传统Servlet到前端控制器模式 SpringMVC采用前端控制器架构模式&#xff0c;通过DispatcherServlet统一处理请求&#xff0c;相比传统Servlet的分散处理方式&#xff0c;实…

12届蓝桥杯—货物摆放

货物摆放 题目描述 小蓝有一个超大的仓库&#xff0c;可以摆放很多货物。 现在&#xff0c;小蓝有 nn 箱货物要摆放在仓库&#xff0c;每箱货物都是规则的正方体。小蓝规定了长、宽、高三个互相垂直的方向&#xff0c;每箱货物的边都必须严格平行于长、宽、高。 小蓝希望所…

Reactor/Epoll为什么可以高性能?

在 Reactor 模式中使用 epoll_wait 实现低 CPU 占用率的核心原理是 ​事件驱动的阻塞等待机制&#xff0c;而非忙等待。以下通过分步骤解析其工作原理和性能优势&#xff1a; void network_thread() {int epoll_fd epoll_create1(0);epoll_event events[MAX_EVENTS];// 添加U…

批量优化与压缩 PPT,减少 PPT 文件的大小

我们经常能够看到有些 PPT 文档明明没有多少内容&#xff0c;但是却占用了很大的空间&#xff0c;存储和传输非常的不方便&#xff0c;这时候通常是因为我们插入了一些图片/字体等资源文件&#xff0c;这些都可能会导致我们的 PPT 文档变得非常的庞大&#xff0c;今天就给大家介…

Java基础 3.22

1.break练习 //1-100之内的数求和&#xff0c;求当和第一次大于20的当前数i public class Break01 {public static void main(String[] args) {int n 0;int count 0;for (int i 1; i < 100; i) {count i;System.out.println("当前和为" count);if (count &g…

高性能MySQL笔记

高性能MySQL笔记 《高性能MySQL》第1章 MySQL架构**第一章核心知识点总结****多选题**多选题答案**答案与详解总结** 《高性能MySQL》第2章 可靠性程世界中的监控核心知识点多选题答案及解析重点巩固方向 《高性能MySQL》第3章 Performance Schema**第三章核心知识点总结****多…

导游职业资格考试:从迷茫到清晰的备考指南

当你决定报考导游职业资格考试时&#xff0c;可能会感到有些迷茫&#xff0c;不知道从何处入手。别担心&#xff0c;这份备考指南将带你从迷茫走向清晰。​ 第一步&#xff0c;全面了解考试。导游职业资格考试分为笔试和面试。笔试的四个科目各有特点&#xff0c;《政策与法律…

【BFS】《BFS 攻克 FloodFill:填平图形世界的技术密码》

文章目录 前言例题一、 图像渲染二、 岛屿数量三、岛屿的最大面积四、被围绕的区域 结语 前言 什么是BFS&#xff1f; BFS&#xff08;Breadth - First Search&#xff09;算法&#xff0c;即广度优先搜索算法&#xff0c;是一种用于图或树结构的遍历算法。以下是其详细介绍&am…

Linux安装MySQL数据库并使用C语言进行数据库开发

目录 一、前言 二、安装VMware运行Ubuntu 1.安装VMware 2.使用VMware打开Ubuntu 三、配置VMware使用网卡 1.添加NAT网卡 四、Linux下安装MySQL数据库 五、安装MySQL开发库 六、演示代码 sql_connect.c sql_connect.h main.c中数据库相关代码 结尾 一、前言 由于最…

ROS2 部署大语言模型节点

4GB GPU的DeepSeek-Coder 1.3B模型&#xff0c;并且它已经被量化或优化过。以下是具体的步骤&#xff1a; 安装必要的依赖项&#xff1a; pip install transformers torch grpcio googleapis-common-protos创建一个新的ROS 2包&#xff1a; cd ~/ros2_ws/src ros2 pkg creat…

本人设计的最完全的光压发电机模型

双螺旋转子光压发电机结构模型 作者&#xff1a;龚仕成 单位&#xff1a;四川水利职业技术学院电力工程系 日期&#xff1a;2024年3月25日 摘要 本文提出了一种基于梯形螺旋沟槽多层复合材料转子的光压发电机结构模型&#xff0c;通过光-机-电协同设计实现高效能量转换。通…

六十天Linux从0到项目搭建(第五天)(file、bash 和 shell 的区别、目录权限、默认权限umask、粘滞位、使用系统自带的包管理工具)

1. file [选项] 文件名 用于确定文件类型的实用工具。它会通过分析文件内容&#xff08;而不仅仅是文件扩展名&#xff09;来判断文件的实际类型 示例输出解析 $ file /bin/bash /bin/bash: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, i…

基于大模型预测的初治菌阳肺结核诊疗方案研究报告

目录 一、引言 1.1 研究背景与意义 1.2 研究目的 二、初治菌阳肺结核概述 2.1 疾病定义与病理机制 2.2 流行病学特征 2.3 传统诊疗方法与局限性 三、大模型在初治菌阳肺结核预测中的应用原理 3.1 大模型技术简介 3.2 数据收集与预处理 3.3 模型构建与训练 3.4 模型…

常见中间件漏洞之一 ----【Tomcat】

中间件Tomcat介绍&#xff1a; tomcat是⼀个开源⽽且免费的jsp服务器&#xff0c;默认端⼝ : 8080&#xff0c;属于轻量级应⽤服务器。它可以实现 JavaWeb程序的装载&#xff0c;是配置JSP&#xff08;Java Server Page&#xff09;和JAVA系统必备的⼀款环境。 在历史上也披露…

GoogleNet的简易实现

这里使用GooleNet对MNIST手写数据集进行分类&#xff0c;最后的效果达到了在测试集98%的准确率。这里关于该网络的细节可以在网络上搜索到&#xff0c;相关原理也可以搜索到&#xff0c;这里仅展示网络的代码实现&#xff0c;这里是基于pytorch实现的&#xff0c;详细的代码如下…

javaweb自用笔记:Mybatis

目录 mybatis 配置sql书写提示 JDBC 数据库连接池 lombok mybatis 只需要定义Mapper接口就好&#xff0c;不需要有实现类&#xff0c;因为框架底层会自动生成实现类 配置sql书写提示 JDBC 数据库连接池 lombok XML映射文件 动态SQL

Rust从入门到精通之精通篇:22.Unsafe Rust 详解

Unsafe Rust 详解 在 Rust 的设计哲学中,安全性是核心原则之一。Rust 的所有权系统、借用检查器和类型系统共同保证了内存安全和线程安全。然而,有些底层操作无法通过 Rust 的安全检查机制进行验证,这就是 unsafe Rust 存在的原因。在本章中,我们将深入探讨 unsafe Rust,…