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

为在 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 定义文件允许我们在需要时无缝运行容器与其他服务。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/317253.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

利用低代码技术,企业怎样开拓数字化转型新路径?

近年来,随着技术的发展和市场竞争的加剧,企业数字化转型已成为一种趋势。许多企业已经完成了线上协作办公的初步转型,这主要得益于像钉钉、企微等发展完善的平台,只需将员工全部拉入这些平台,就能实现线上协作办公。 然…

js逆向第17例:猿人学第13题入门级cookie

文章目录 一、前言二、定位关键参数三、代码实现一、前言 任务十三:还是抓取这5页的数字,计算加和并提交结果 二、定位关键参数 通过题名已经知道需要破解cookie值,控制台查看请求数据,接口https://match.yuanrenxue.cn/api/match/13?page=2中的yuanrenxue_cookie值应该…

R2机器人加载棋盘与棋子模型,对urdf、sdf的解释(区分srdf)

1、概述 urdf、sdf、srdf文件都属于xml的规范格式,解释分别如下:urdf(unified robot description format)叫做"统一机器人描述格式",主要目的就是提供一种尽可能通用的机器人描述规范,这样对于机器人的描述就可以互相移…

Multi-Concept Customization of Text-to-Image Diffusion——【代码复现】

本文是发表于CVPR 2023上的一篇论文:[2212.04488] Multi-Concept Customization of Text-to-Image Diffusion (arxiv.org) 一、引言 本文主要做的工作是对stable-diffusion的预训练模型进行微调,需要的显存相对较多,论文中测试时是在两块GP…

npmvue详解

1、npm是node.js的一个软件依赖包管理工具 2、当前目录下面一般会有一个package.json文件 3、npm install 会去按照package.json文件中的依赖去下载依赖包 默认会下载到当前目录中的node_modules文件夹下,-g会进行全局安装 4、package.json文件中有两种依赖关系 …

Mybatis实现映射,一次查询和嵌套查询

1.实现映射 Mybatis的最大魅力就在于它的语句映射。实现映射一般有一下三种方法: 当我们在数据库的列名和java中的属性名完全相同时,mybatis会自动映射并将查询结果封装。 对于由多个单词组成的名字时(例如studentgender)&…

MATLAB | 龙年大吉,使用MATLAB绘制会动的中国风神龙

hey各位好久不见,龙年到了,这期画一期配色非常中国风的龙,这个造型的龙参考了某些html绘制龙的视频,但是由于html版全网都是也不咋给代码和代码出处,因此自己写了个MATLAB版本: 可以看到还是非常酷炫的&…

Linux 内核学习 2 - 用户程序如何被塞进内核进行调度?

Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。 fork里copy了父进程的信息,并激活task放到运行队列,当系统发生调度并获得执行机会时开始执行,但这时还不是hello程序…

【RHEL】Vivado调用VCS+Verdi联合仿真报错解决

问题描述 在使用VCS Verdi仿真Vivado工程时,点击行为仿真按钮进度条窗口消失后,Verdi窗口并未出现,查看消息报错如下: vcs: line 34205: 119837 Segmentation fault (core dumped) ${TOOL_HOME}/bin/cfs_ident_exec -f ${X…

vulnhub靶场之DC-7

一.环境搭建 1.靶场描述 DC-7 is another purposely built vulnerable lab with the intent of gaining experience in the world of penetration testing. While this isnt an overly technical challenge, it isnt exactly easy. While its kind of a logical progression …

7个向量数据库对比:Milvus、Pinecone、Vespa、Weaviate、Vald、GSI 和 Qdrant

本文简要总结了当今市场上正在积极开发的7个向量数据库,Milvus、Pinecone、Vespa、Weaviate、Vald、GSI 和 Qdrant 的详细比较。 我们已经接近在搜索引擎体验的基础层面上涉及机器学习:在多维多模态空间中编码对象。这与传统的关键字查找不同&#xff08…

Android Studio个性化修改

Android Studio原始界面看着也太无趣了叭,话不多说跟步骤走就可以。 1.更改Android Studio主题及背景 1.背景修改 File->Settings->Plugins,搜索Sexy Editor 重启后,左侧边栏出现Other Settings选项,点击SexyEditor进行背…

K8S后渗透横向节点与持久化隐蔽方式探索

前言 通常在红蓝对抗中,我们可能会通过各种方法如弱口令、sql注入、web应用漏洞导致的RCE等方法获得服务器的权限;在当前云原生迅猛发展的时代,这台服务器很可能是一个容器,在后续的后渗透由传统的提权变为容器逃逸,内…

在程序中链接静态库 和 动态库

9. 链接库 在编写程序的过程中,可能会用到一些系统提供的动态库或者自己制作出的动态库 或者静态库文件,cmake中也为我们提供了相关的加载动态库的命令hehedalinux:~/Linux/loveDBTeacher-v3$ tree . ├── CMakeLists.txt ├── include │ └── …

Java合并两个有序链表

思路: 创建一个临时的节点,命名傀儡节点,可以理解成临时的头节点,newHead,list1和list2的两两元素比较,小的连接newHead(升序)newHead的路径(蓝色)就是连接后…

MySQL 基于 GTID 主从复制

GTID 定义 GTID 是 MySQL 事务标识,为每一个提交的事务都生成一个标识,并且是全局唯一的,这个特性是从 MySQL5.6 引进的。 组成 GTID 是由 UUID TID,UUID 是MySQL的唯一标识,每个MySQL实例之间都是不同的。TID是代表…

Servlet-执行流程生命周期

一、思考 在上一篇文章Servlet基本概念中,我们抛出了一个问题:我们定义一个类实现了Servlet接口后,是谁创建了这个类的对象呢,又是谁调用了类中的service方法呢?本篇我们将介绍Servlet的执行流程。 二、执行流程 根…

Dreamweaver CS 操作

服务器 在Windows 10中添加IIS 可以将自己的电脑设置为服务器,在Windows 10中添加IIS的步骤如下: 在开始按钮上点击右键,选择“控制面板”。从控制面板选择“程序”。然后选择“启用或关闭Windows功能”。在弹出的对话框中,找到…

【华为OD机试真题2023CD卷 JAVAJS】查找一个有向网络的头节点和尾节点

华为OD2023(C&D卷)机试题库全覆盖,刷题指南点这里 查找一个有向网络的头节点和尾节点 知识点图DFS搜索 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 给定一个有向图,图中可能包含有环,图使用二维矩阵表示,每一行的第一列表示起始节点,第二列表示终止节…

Error: Failed to download template from registry: fetch failed

第一次构建Nuxt项目时,出现在这样的错误!!! 如果你也是这样得错误,修改hosts也没用。我试了 是因为你的npm安装了其他镜像源, 这个时候你就需要手动下载了: web端访问: https://ra…
最新文章