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.pswp.cn/diannao/75526.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/75526.shtml
英文地址,請注明出處:http://en.pswp.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,…