在 Docker 中运行 Golang 应用程序,如何做?

ops/2024/12/18 23:15:09/

文章精选推荐

1 JetBrains Ai assistant 编程工具让你的工作效率翻倍
2 Extra Icons:JetBrains IDE的图标增强神器
3 IDEA插件推荐-SequenceDiagram,自动生成时序图
4 BashSupport Pro 这个ides插件主要是用来干嘛的 ?
5 IDEA必装的插件:Spring Boot Helper的使用与功能特点
6 Ai assistant ,又是一个写代码神器

文章正文

在 Docker 中运行 Go 应用程序是现代开发流程中的常见做法,能够确保应用程序在不同环境中一致性运行,同时简化部署和管理流程。Go 应用程序通常是编译成静态二进制文件,这使得它们特别适合容器化,因为容器不需要依赖外部环境的库。

下面是详细步骤,展示如何在 Docker 中构建、运行和管理 Go 应用程序。

1. 创建 Go 应用程序

首先,创建一个简单的 Go 应用程序。假设你正在开发一个简单的 REST API 服务,代码如下:

// main.go
package mainimport ("fmt""log""net/http"
)func handler(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, "Hello, Docker!")
}func main() {http.HandleFunc("/", handler)log.Fatal(http.ListenAndServe(":8080", nil))
}

这个简单的程序监听 8080 端口并返回 “Hello, Docker!”。

2. 编写 Dockerfile

Dockerfile 是 Docker 容器的构建脚本,它描述了如何构建应用程序的 Docker 镜像。对于 Go 应用,Dockerfile 主要包括以下几个步骤:

  1. 使用 Go 官方镜像作为构建基础镜像。
  2. 编译 Go 应用程序。
  3. 使用更小的基础镜像运行编译后的 Go 二进制文件。

创建一个 Dockerfile,如下所示:

# Step 1: Build the Go binary
FROM golang:1.21 AS builder# Set the Current Working Directory inside the container
WORKDIR /app# Copy the Go Modules and Sum files
COPY go.mod go.sum ./# Download all dependencies. Dependencies will be cached if the go.mod and go.sum files are not changed
RUN go mod download# Copy the source code into the container
COPY . .# Build the Go app
RUN GOOS=linux GOARCH=amd64 go build -o main .# Step 2: Run the Go binary
FROM alpine:latest  # Set the Current Working Directory inside the container
WORKDIR /root/# Copy the Pre-built binary file from the previous stage
COPY --from=builder /app/main .# Expose port 8080 to the outside world
EXPOSE 8080# Command to run the executable
CMD ["./main"]
解释:
  • golang:1.21:这是构建 Go 应用所需的基础镜像,包含了 Go 环境。
  • alpine:latest:这是一个非常小巧的 Linux 镜像,用于运行应用程序。Alpine Linux 是一个非常小的 Linux 发行版,适合用于构建小巧的 Docker 镜像。
  • GOOS=linux GOARCH=amd64:通过这个命令将 Go 程序编译为 Linux 平台的 64 位二进制文件(适合在 Linux 容器中运行)。

3. 构建 Docker 镜像

Dockerfile 所在的目录下,运行以下命令来构建镜像:

docker build -t my-go-app .
  • my-go-app 是镜像的名字,你可以根据自己的需要修改。
  • . 表示当前目录,Dockerfile 会根据该目录下的文件来构建镜像。

4. 运行 Docker 容器

构建完成后,可以使用以下命令来启动容器

docker run -p 8080:8080 my-go-app
  • -p 8080:8080 表示将容器内部的 8080 端口映射到本地主机的 8080 端口。
  • my-go-app 是你构建的镜像名称。

现在,你可以通过访问 http://localhost:8080 来查看 Go 应用程序输出的 “Hello, Docker!”。

5. 验证应用是否在 Docker 容器中运行

你可以使用以下命令检查容器是否正在运行:

docker ps

此命令会列出所有正在运行的 Docker 容器。你应该能看到一个正在运行 my-go-app 镜像的容器

6. 容器化开发的优势

  • 环境一致性:Go 应用程序与其运行环境(如操作系统、依赖库等)被完全打包在 Docker 容器中。无论在哪台机器上运行,只要有 Docker 环境,应用就能一致运行。
  • 便于部署:Docker 容器化的应用可以轻松地部署到任何支持 Docker 的平台上(如 AWS、Azure、Kubernetes 等)。
  • 易于扩展和更新:你可以轻松地通过 Docker Compose 或 Kubernetes 扩展应用实例数量,进行负载均衡。

7. 使用 Docker Compose 管理多个容器(可选)

如果你的 Go 应用程序依赖于其他服务(如数据库、缓存等),你可以使用 Docker Compose 来管理多个容器

dockercomposeyml_134">示例:docker-compose.yml
version: "3.8"services:app:build: .ports:- "8080:8080"db:image: postgres:latestenvironment:POSTGRES_USER: userPOSTGRES_PASSWORD: passwordPOSTGRES_DB: mydbports:- "5432:5432"

在这个例子中,app 服务是你的 Go 应用,而 db 服务是一个 PostgreSQL 数据库。你可以使用以下命令来启动所有服务:

docker-compose up --build

这会启动 Go 应用和数据库容器,并将它们连接在一起。

8. 生产环境中的优化建议

  • 多阶段构建:通过 Dockerfile 中的多阶段构建,可以确保生产镜像只包含必要的文件(例如编译后的二进制文件和最小的运行时环境),从而减小镜像的体积。
  • 镜像压缩:可以使用诸如 docker-slim 等工具来进一步优化 Docker 镜像的大小。
  • 资源限制:可以为容器设置 CPU 和内存限制,避免容器占用过多的资源。例如:
    docker run -p 8080:8080 --memory=256m --cpus=1.0 my-go-app
    

9. 总结

通过将 Go 应用程序容器化,你可以:

  • 在不同的环境中轻松部署和运行应用。
  • 简化依赖管理,避免环境不一致带来的问题。
  • 通过 Docker 和 Kubernetes 等工具,方便地进行应用的扩展和管理。

上述步骤展示了如何在 Docker 中构建和运行 Go 应用程序,最终你将得到一个高效、便捷、易于部署的 Go Web 服务环境。


http://www.ppmy.cn/ops/143019.html

相关文章

浅谈Java注解之CachePut

一、CachePut的介绍 Java注解CachePut是Spring框架中用于缓存操作的一部分,主要用于更新缓存中的数据。 功能说明 CachePut注解用于在方法执行后更新缓存中的数据。与Cacheable不同,CachePut注解的方法总是会被执行,并且其返回结果会被放入缓…

概率论得学习和整理27:关于离散的数组 随机变量数组的均值,方差的求法3种公式,思考和细节。

目录 1 例子1:最典型的,最简单的数组的均值,方差的求法 2 例子1的问题:例子1只是1个特例,而不是普遍情况。 2.1 例子1各种默认假设,导致了求均值和方差的特殊性,特别简单。 2.2 我觉得 加权…

[图形渲染]【Unity】【游戏开发】Shader基础9 什么是固定管线渲染?

在图形渲染领域,**固定管线渲染(Fixed-Function Pipeline)**是一种历史悠久的渲染方法,曾是早期图形API(如OpenGL和DirectX)的核心设计思想。尽管它已经逐步被现代的可编程管线取代,但理解固定管线的概念对于学习图形渲染的演进和基础非常重要。 1. 什么是固定管线? …

Leetcode3264:K 次乘运算后的最终数组 I

题目描述: 给你一个整数数组 nums ,一个整数 k 和一个整数 multiplier 。 你需要对 nums 执行 k 次操作,每次操作中: 找到 nums 中的 最小 值 x ,如果存在多个最小值,选择最 前面 的一个。将 x 替换为…

FastAPI 的进阶应用与扩展技术:异步编程与协程、websocket、celery

FastAPI 的进阶应用与扩展技术:异步编程与协程、websocket、celery 目录 🌐 学习异步编程与协程📡 WebSocket 与实时通信🛠 部署微服务架构🕒 使用 Celery 处理异步任务 1. 🌐 学习异步编程与协程 在现代…

【Flask+OpenAI】利用Flask+OpenAI Key实现GPT4-智能AI对话接口demo - 从0到1手把手全教程(附源码)

文章目录 前言环境准备安装必要的库 生成OpenAI API代码实现详解导入必要的模块创建Flask应用实例配置OpenAI API完整代码如下(demo源码)代码解析 利用Postman调用接口 了解更多AI内容结尾 前言 Flask作为一个轻量级的Python Web框架,凭借其…

c++:std::map下标运算符的不合理使用

这是我分析之前遗留代码时发现的一个隐藏点&#xff1b;不过我并不认为这样使用std::map是合理的。 看看简化后的代码&#xff0c;v1、v2的值应该是多少呢&#xff1f; #include <map>std::map<int, int> cm[2];int get_cm_value(int device, int ctrl) { auto …

RabbitMQ Work Queues (工作队列模式) 使用案例

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;RabbitMQ &#x1f4da;本系列文章为个人学…