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

news2024/9/27 15:25:49

为在 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.coloradmin.cn/o/1379819.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Canopen学习笔记——sync同步报文增加数据域(同步计数器)

1.Canfestival同步报文sync的设置 在OD表中的配置如下: 如果0x1006索引的同步报文循环周期时间设置为0则禁用同步报文,这里要注意的就是,上面第一张图也提到了,时间单位是us。第二张图,我的0x1006就设置为0xF4240,也就…

【C++】- 类和对象(运算符重载!!const!!详解!!)

类和对象③ 介绍运算符重载赋值运算符重载运算符重载const 在学习C语言时,我们首先接触的就是变量,再深入学习,我们可以利用运算符对变量进行操作,当我们使用C编写程序时,经常会遇到一些需要对特殊的例如自定义数据类型…

8.云原生存储之Ceph集群

1. 私有云实战之基础环境搭建 2. 云原生实战之kubesphere搭建 3.云原生之kubesphere运维 4. 云原生之kubesphere基础服务搭建 5.云原生安全之kubesphere应用网关配置域名TLS证书 6.云原生之DevOps和CICD 7.云原生之jenkins集成SonarQube 8.云原生存储之Ceph集群 文章目录 为什么…

Linux 内核学习 3a - 如何查看虚拟内存和物理内存,以及虚拟内存和物理内存之间转换

/proc/iomem, ioremap(), mmap() The kernel manages device resources like registers as physical addresses(物理地址). These are the addresses in /proc/iomem. The physical address is not directly useful to a driver; it must use ioremap() to map the space and …

出租车费 C语言xdoj697

问题描述 某城市普通出租车计费标准如下: 起步里程为 3 公里,起步费 10 元; 超起步里程后 10 公里内,每公里 2 元; 超过 10 公里以上的部分,每公里加收 50%的回空补贴费; 营运过程中&#xff0c…

若依基于jsencrypt实现前后端登录密码加密

若依虽然有加密解密功能,然后只有前端有,在用户点击保存密码的时候,会将密码保存到本地,但是为了防止密码泄露,所以在保存的时候,进行加密,在回显密码的时候进行解密显示,用户在登录…

【iOS】数据持久化(四)之FMDB基本使用

正如我们前面所看到的,原生SQLite API在使用时还是比较麻烦的,于是,开源社区就出现了一系列将SQLite API进行封装的库,其中FMDB的被大多数人所使用 FMDB和SQLite相比较,SQLite比较原始,操作比较复杂&#…

AI副业拆解:人像卡通化,赋予你的形象全新生命力

大家好我是在看,记录普通人学习探索AI之路。 🔥让你的形象瞬间穿越二次元!🚀人像卡通化,捕捉你的独特魅力,让真实与梦幻在此刻交融。🎨 今天为大家介绍如何免费把人像卡通化--漫画风 https://w…

关系型数据库和MySQL概述

关系型数据库概述 数据持久化 - 将数据保存到能够长久保存数据的存储介质中,在掉电的情况下数据也不会丢失。数据库发展史 - 网状数据库、层次数据库、关系数据库、NoSQL 数据库、NewSQL 数据库。1970年,IBM的研究员E.F.Codd在_Communication of the ACM_上发表了名为_A Rela…

PyCharm连接服务器(利用PyCharm实现远程开发)

利用PyCharm实现远程开发 注:该功能只有在PyCharm专业版下才可以使用,并且必须是官方的正版许可,破解版的是不可以使用的!!!可以通过免费教育许可申请使用权限(申请流程)。 pycharm…

【算法分析与设计】最短路径和

题目: 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 示例: 示例 1: 输入:grid [[1,3,1],…

基于JAVA开发的数字化智慧工地管理平台源码,可私有化部署、带可视化大屏

智能工地应用价值 智慧工地现场构建了基于物联网的智能化数据传感器通用的管理平台。利用计算机、人工智能、无线通信,全天候现场监视、施工检查、质量管理、服务,提高数字化管理、安全、绿色、施工等现场管理能力,标志着现场管理进入信息化时…

Mysql如何优化慢查询

如何优化慢查询 慢 SQL 的优化,主要从两个方面考虑,SQL 语句本身的优化,以及数据库设计的优化。 1、避免不必要的列 覆盖索引会导致回表,且增大了IO 2、分页优化 深分页解决方案 使用子查询in 使用连接表 left join 使用游标&a…

IDEA新建SpringBoot工程时java版本只有17和21

解决方法:替换源 参考博客:https://www.kuazhi.com/post/712799571.html

C#编程-实现重写

实现重写 实现派生类中基类的成员称为重写。在C#中,可以重写方法、属性和索引器。 重写是多态性的一种形式,因为它使您能够创建具有相同名称和不同功能的不同代码块。 重写函数 在面向对象编程中,子类可以提供超类中已定义的专门版本的函数。这称为函数重写。 函数重写是…

ASP.NET作业批改系统源码

ASP.NET作业批改系统源码 源码描述: 该系统主要完成学生注册,登陆,作业的上传,教师对作业进行发布,批改等功能。 包括登陆子系统,学生子系统,教师子系统和管理员子系统。 管理员功能 资料管理:修…

网络安全B模块(笔记详解)- 隐藏信息探索

隐藏信息探索 1.访问服务器的FTP服务,下载图片QR,从图片中获取flag,并将flag提交; ​ 通过windows电脑自带的图片编辑工具画图将打乱的二维码分割成四个部分,然后将四个部分通过旋转、移动拼接成正确的二维码 ​ 使用二维码扫描工具CQR.exe扫描该二维码 ​ 获得一串…

c++临时对象的探讨及相关性能提升

产生临时对象的情况 我们定义一个类进行测试 class tempVal { public:int v1, v2;tempVal(int v1 0, int v2 0);tempVal(const tempVal& t) :v1(t.v1), v2(t.v2) {cout << "调用拷贝构造函数" << endl;}virtual ~tempVal() {cout << "…

14、强化学习Soft Actor-Critic算法:推导、理解与实战

基于LunarLander登陆器的Soft Actor-Critic强化学习&#xff08;含PYTHON工程&#xff09; Soft Actor-Critic算法是截至目前的T0级别的算法了&#xff0c;当前正在学习&#xff0c;在此记录一下下。 其他算法&#xff1a; 07、基于LunarLander登陆器的DQN强化学习案例&#…

第二百六十三回 给geolocator插件提交问题

文章目录 1. 知识回顾2. 问题描述与解决2.1 问题描述2.2 问题解决 3. 心得与感受 1. 知识回顾 我们在前面章回中介绍过如何获取位置信息&#xff0c;主要介绍的是geolocator这个三方包&#xff0c;不过在最近使用时却发现了问题&#xff0c;尝试搜索解决&#xff0c;但是没有结…