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

docker 部署 gin

编译与执行

✅「静态编译语言 + 生成原生二进制文件 + 操作系统直接执行」

Go 语言之所以在工程部署场景中大受欢迎的核心优势:它直接编译成原生二进制可执行文件(binary executable)

🔧 Go 是“静态编译语言”(编译型 + 静态链接)

go build -o myapp main.go

Go 会做三件事:

  1. 编译你的 .go 代码为机器码(CPU 可执行指令)
  2. 静态链接所有标准库、依赖库(打包进一个文件里)
  3. 生成一个二进制文件,比如 myapp(Linux/macOS)或 myapp.exe(Windows)

📦 所以你得到了一个真正的“自包含”程序,不依赖 Go 环境,不依赖 Python/Java/Node 运行时。

Go 编译出来的这个二进制文件本质上是:

  • CPU 能直接运行的 ELF(Linux) 或 Mach-O(macOS) 或 PE(Windows)格式的可执行文件
  • 包含了你代码 + 标准库 + 三方库 + TLS 支持等依赖

所以你只要上传 myapp 这个二进制文件到目标服务器/容器,直接运行即可

./myapp不需要:•	Go 环境•	包管理器•	解释器•	虚拟机•	容器也不需要装 runtime!

🧠 那 Go 编译出来的“二进制文件”底层到底是什么?

它就是我们操作系统认的那种:

  • Linux:ELF 格式
  • Windows:.exe 的 PE 格式
  • macOS:Mach-O
file myapp>>>>>myapp: Mach-O 64-bit executable x86_64 

Go 是直接编译成操作系统能执行的原生二进制文件的语言,部署时只需上传这个文件,直接运行,不需要 Go 环境、不需要解释器、不需要虚拟机,是工程部署最轻的一种形式。

特性GoC/C++
编译方式静态编译(go build)静态/动态编译(gcc, clang)
编译结果单个二进制文件可是二进制,也可能依赖动态库
是否默认静态链接✅ 是(不启用 CGO 默认静态)❌ 否(默认很多依赖 libc.so 等动态库)
标准库/网络支持✅ 标准库很全(http, json, etc.)❌ 需引入第三方库(如 Boost、libcurl)
交叉编译支持✅ 简单(GOOS/GOARCH)❌ 较复杂(需 toolchain、配置多)
内存安全性✅ 有垃圾回收、内存管理更安全❌ 容易出现野指针、内存泄漏
并发支持✅ 原生 goroutine,极简❌ pthread 很重,难用
编译速度⚡ 快⏳ 慢

docker 部署

Dockerfile

就是 build 形成一个二进制文件,然后使用 alpine 去运行这个二进制文件

# Dockerfile
# 构建阶段,	使用官方 Go 的 Alpine 版本(极小体积)作为构建镜像
FROM golang:alpine AS builderWORKDIR /buildCOPY go.mod go.sum ./
RUN go mod downloadCOPY . .RUN go build -o gin-api-template .# 运行阶段,	•	使用 alpine 最小基础镜像作为运行环境(无 Go 环境)FROM alpine:latestRUN apk add --no-cache ca-certificatesWORKDIR /appCOPY --from=builder /build/gin-api-template .
COPY .env .EXPOSE 8080CMD ["./gin-api-template"]

核心的命令:

  • 执行构建命令,生成二进制文件 gin-api-template
  • o 指定输出文件名为 gin-api-template
RUN go build -o gin-api-template .
阶段操作说明
构建FROM golang:alpine AS builder使用小巧的 Go 构建镜像
构建go build -o编译 Go 项目为独立二进制文件
运行FROM alpine:latest运行环境无 Go,仅运行编译好的二进制,
运行COPY .env支持读取配置
启动CMD [“./gin-api-template”]容器启动后运行主程序

✅ 什么是 Alpine?

Alpine Linux 是一个体积极小、安全、资源占用极低的 Linux 发行版:

  • 📦 镜像大小只有 5MB 左右
  • 🛡️ 默认关闭大多数服务,攻击面小,安全性高
  • 🚀 启动快、非常适合云原生和容器部署
  • 🧊 使用 musl libc 和 busybox 替代 glibc 和 coreutils,减少依赖

docker-compose.yml

version: '3.8'services:gin-api:build: .ports:- "8080:8080"volumes:- .env:/app/.env  # 确保文件名一致env_file:- .envrestart: unless-stopped
http://www.lryc.cn/news/2395897.html

相关文章:

  • 十三: 神经网络的学习
  • Qt OpenGL编程常用类
  • 数据结构 --- 顺序表
  • MySQL高级查询技巧:分组、聚合、子查询与分页【MySQL系列】
  • 无人机多旋翼倾转动力测试系统-适用于(eVTOL开发、缩比模型测试、科研教育)
  • .NET8入门:14.ASP.NET Core MVC进阶——Model
  • latex figure Missing number, treated as zero. <to be read again>
  • java CompletableFuture创建异步任务(Completable异步+ExecutorService线程池)
  • LeetCode 高频 SQL 50 题(基础版)之 【聚合函数】部分
  • 【AI学习】检索增强生成(Retrieval Augmented Generation,RAG)
  • 低成本高效图像生成:GPUGeek和ComfyUI的强强联合
  • 基于Matlab实现卫星轨道模拟仿真
  • 前端使用 spark-md5 实现大文件切片上传
  • 《操作系统真相还原》——进入内核
  • 【QQ音乐】sign签名| data参数 | AES-GCM加密 | webpack(上)
  • 【STM32】按键控制LED 光敏传感器控制蜂鸣器
  • M-OFDM模糊函数原理及仿真
  • 【MySQL】MVCC与Read View
  • 相机--双目立体相机
  • 多目标粒子群优化算法(MOPSO),用于解决无人机三维路径规划问题,Matlab代码实现
  • 工厂模式 vs 策略模式:设计模式中的 “创建者” 与 “决策者”
  • 23、Swift框架微调实战(3)-Qwen2.5-VL-7B LORA微调OCR数据集
  • 37. Sudoku Solver
  • C# Renci.SshNet 登陆 suse配置一粒
  • RV1126-OPENCV 图像叠加
  • 修改 vscode 左侧导航栏的文字大小 (更新版)
  • 从C++编程入手设计模式2——工厂模式
  • 云原生 Cloud Native Build (CNB)使用初体验
  • 格式工厂 FormatFactory v5.20.便携版 ——多功能媒体文件转换工具 长期更新
  • 数据可视化--使用matplotlib绘制高级图表