脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Golang - 使用 Docker 进行 Go 应用程序引导指南

使用 Docker 进行 Go 应用程序引导指南

2024-01-15 14:31技术的游戏 Golang

在本文中,我们将探讨在 Docker 容器内集成 Golang 栈的方法,这是一个被广泛采用的方法,并使用 Docker Compose 进行编排。

使用 Docker 进行 Go 应用程序引导指南

为在 Docker 中部署的 Go 应用程序做准备

在使用 Go 开发 Web 应用程序时,无论是用于 HTTP 还是其他类型的服务,部署到不同的阶段或环境(本地开发、生产环境等)都是一个常见的考虑因素。在本文中,我们将探讨在 Docker 容器内集成 Golang 栈的方法,这是一个被广泛采用的方法,并使用 Docker Compose 进行编排。

准备您的 Go 应用程序

首先,您需要一个功能齐全的 Go 应用程序。以下是我们 main.go 文件的代码及其简要说明:

// /src/main.go

package main

import (
    "fmt"
    "net/http"
    "os"
)

func main() {
    var PORT string
    if PORT = os.Getenv("PORT"); PORT == "" {
        PORT = "3001"
    }

    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello World from path: %s\n", r.URL.Path)
    })

    http.ListenAndServe(":"+PORT, nil)
}

这段代码设置了一个基本的 HTTP 服务器,当接收到请求时返回“Hello World”,并根据环境变量动态分配一个端口。

创建您的 Dockerfile

接下来的步骤是创建一个 Dockerfile,该文件定义了构建和运行您的 Go 应用程序的环境。

# /Dockerfile

FROM golang:alpine

ADD ./src /go/src/app
WORKDIR /go/src/app

ENV PORT=3001

CMD ["go", "run", "main.go"]

Dockerfile 的解释如下:

  • 使用 Alpine Linux 发行版从官方 Golang 镜像构建容器,因为它轻量级。
  • 将当前目录挂载到容器的标准 Go 路径上。
  • 设置工作目录到我们应用程序的 Go 路径。
  • 定义一个名为“PORT”的环境变量,其默认值为“3001”。
  • 指定构建和运行我们应用程序的命令。

构建和运行容器

假设您已安装 Docker 运行环境,请按照以下步骤操作:

(1) 构建 Docker 镜像:

docker build . -t my-golang-app-image

(2) 从该镜像运行一个容器:

docker run -p 3030:3001 -it --rm --name my-golang-app-run my-golang-app-image

在这里,我们指示 Docker 运行一个新容器,将主机端口 3030 绑定到容器的内部端口 3001,将 stdout 输出显示在当前终端上,在其进程终止后删除容器,并为容器分配一个自定义名称。

试一试!

在您的浏览器中访问 localhost:3030,您应该会看到文本“Hello World from path: /”。要停止容器,请按 Ctrl + C。

使用 Docker Compose 进行编排

Docker Compose 允许集成多个容器。虽然对于此练习来说可能有些大材小用,但对于未来的场景是宝贵的知识。创建一个 docker-compose.yml 文件:

# /docker-compose.yml

version: '2'
services:
  my-golang-app-run:
    container_name: my-golang-app-run
    build: .
    command: go run main.go
    volumes:
      - ./src:/go/src/app
    working_dir: /go/src/app
    ports:
      - "3030:3000"
    environment:
      PORT: 3001

现在,运行以下命令:

docker-compose up

再次在浏览器中访问 localhost:3030,您将看到与之前使用 Docker Compose 相同的结果。要停止容器,请按 Ctrl + C。

为什么在本地使用 Docker?

请注意,我们从未在本地环境中安装 Go。只需安装 Docker,您就可以避免在本地环境中安装各种运行时,这在处理具有不同运行时的多个项目时非常有用。

总结

我们成功地配置了一个 Dockerfile,用于构建图像和运行具有 Go 应用程序所需环境的容器。此外,Docker Compose 定义文件允许我们在需要时无缝运行容器与其他服务。

希望这个指南对您有所帮助!

原文地址:https://mp.weixin.qq.com/s?__biz=MzUzMTY1MDAwMQ==&mid=2247487023&idx=1&sn=a43a8db4258a29399a8e13563e4d1723

延伸 · 阅读

精彩推荐
  • GolangGo gRPC服务proto数据验证进阶教程

    Go gRPC服务proto数据验证进阶教程

    这篇文章主要为大家介绍了Go gRPC服务proto数据验证进阶教程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...

    烟花易冷人憔悴5212022-10-21
  • GolangGolang通过SSH执行交换机操作实现

    Golang通过SSH执行交换机操作实现

    这篇文章主要介绍了Golang通过SSH执行交换机操作实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们...

    moakia9242020-07-20
  • GolangGo singleflight使用以及原理

    Go singleflight使用以及原理

    singleflight官方解释其为:singleflight提供了一个重复的函数调用抑制机制。通俗的解释其作用是,若有多个协程运行某函数时,只让一个协程去处理,然后批...

    胡桃姓胡,蝴蝶也姓胡11002023-06-21
  • Golang泛型版 Singleflight:Go 中如何防止缓存击穿?

    泛型版 Singleflight:Go 中如何防止缓存击穿?

    并发是 Go 的优势,但并发也需要很好的进行控制。标准库中有 sync 包,经常使用的功能有 sync.Mutex、sync.WaitGroup 等。其实,除了标准库,还有一个官方的扩...

    polarisxu11452021-12-31
  • GolangGo语言学习otns示例分析

    Go语言学习otns示例分析

    这篇文章主要为大家介绍了Go语言学习otns示例分析详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...

    LiP10422023-04-25
  • GolangGo泛型缺陷?Go Stream是如何解决Go不支持泛型方法的问题的?

    Go泛型缺陷?Go Stream是如何解决Go不支持泛型方法的问题的?

    Go-Stream实现了 java8 stream框架常用的操作,包括 过滤(Filter),转换一对一(Map), 转换一对多(FlatMap),转Map(toMap), 聚合(Reduce),数据统计(Statistic), 分组(GroupingB...

    TodoCoder10062023-11-29
  • GolangGolang中HTTP路由设计的使用与实现

    Golang中HTTP路由设计的使用与实现

    这篇文章主要介绍了Golang中HTTP路由设计的使用与实现,为什么要设计路由规则,因为路由规则是HTTP的请求按照一定的规则 ,匹配查找到对应的控制器并传...

    未来谁可知8642023-05-11
  • Golanggolang如何通过viper读取config.yaml文件

    golang如何通过viper读取config.yaml文件

    这篇文章主要介绍了golang通过viper读取config.yaml文件,围绕golang读取config.yaml文件的相关资料展开详细内容,需要的小伙伴可以参考一下...

    峰啊疯了6282022-09-07