使用Docker开发GO应用程序

news2025/7/18 8:18:46

根据Stack Overflow的2022开发者调查,Go(或Golang)是最受欢迎和最受欢迎的编程语言之一。由于与许多其他语言相比,Go的二进制大小更小,开发人员经常使用Go进行容器化应用程序开发。
Mohammad Quanit在他的社区全能课程中探索了Docker和围棋之间的联系。Mohammad分享了如何Dockerize一个基本的围棋应用程序,同时探索了过程中涉及的每个核心组件:

随着我们深入这些集装箱化步骤。我们将探索使用Go应用程序和HTTP web服务器,以及关键的最佳实践、优化技巧和增强安全性的方法。
Go应用程序组件
创建一个成熟的围棋应用程序需要您创建一些特定于围棋的组件。这些对许多围棋项目至关重要,集装箱化过程同样严重依赖于它们。现在让我们仔细看看这些。
使用main。去吧,去吧
穆罕默德主要强调主要内容。go文件,因为没有可执行代码就无法运行应用程序。在Mohammad的案例中,他创建了一个简单的web服务器,有两条独特的路径:一条具有打印功能的I/O格式,另一条返回当前时间。

穆罕默德的例子的好处是它不太长也不太复杂。您可以在创建自己的web服务器时模拟这一点,或者将其用作更多定制的垫脚石。
注意:您也可以使用包main来代替main。go文件。你不需要明确的main。为web服务器指定,因为您可以随意命名文件,但您确实需要在代码中定义一个func-main()。这存在于我们上面的示例中。
我们始终建议确认您的代码是否按预期工作。输入命令go run main。去启动你的应用程序。您也可以替换main。使用文件的特定名称。然后,打开浏览器并访问http://localhost:8081查看您的“Hello World”消息或等效消息。因为我们有两条路线,导航到http://localhost:8081/time由于Mohammad的第二个功能,显示当前时间。
接下来,我们开始了。mod文件。您将使用它作为Go包的根文件、导入的模块路径(如上所示)以及依赖性要求。Go模块还可以帮助您为项目代码选择目录。
有了这两个部分,就可以创建Dockerfile了!
创建Dockerfile
构建和部署Dockerized Go应用程序意味着从软件映像开始。虽然您可以直接从Docker Hub(使用CLI)获取此信息,但从Dockerfile开始可以为您提供更多的配置灵活性。
你可以在你喜欢的编辑器中创建这个文件,比如VS代码。我们推荐VS代码,因为它支持官方Docker扩展。此扩展支持调试、自动完成和轻松的项目文件导航。
选择一个基本映像并包含应用程序代码非常简单。由于Mohammad正在使用Go,他通过指定golang Docker官方图像作为父图像来启动Dockerfile。Docker将以此构建最终的容器映像。
你可以选择你想要的任何版本,但像golang:1.19.2牛眼这样的固定版本既稳定又苗条。像这样的新图像版本也可以安全地抵御2022年10月的Text4Shell漏洞。
您还需要在Dockerfile中执行以下操作:
包含源代码的应用程序目录
将所有内容从根目录复制到应用程序目录
将Go文件复制到应用程序目录并安装依赖项
使用配置构建应用程序
告诉Docker容器在运行时侦听某个端口
定义容器启动后运行的可执行命令
考虑到这几点,穆罕默德是如何构建他的基本Dockerfile的:

# Specifies a parent image
FROM golang:1.19.2-bullseye

# Creates an app directory to hold your app’s source code
WORKDIR /app

# Copies everything from your root directory into /app
COPY . .

# Installs Go dependencies
RUN go mod download

# Builds your app with optional configuration
RUN go build -o /godocker

# Tells Docker which network port your container listens on
EXPOSE 8080

# Specifies the executable command that runs when the container starts
CMD [ “/godocker” ]

 从这里,您可以运行一个快速CLI命令从该文件构建映像:
docker build--rm-t[您的图像名称]:alpha。
这将创建一个图像,同时在整个构建过程中移除使用每个图像层(或步骤)创建的任何中间容器。您还可以用名称标记您的图像,以便以后参考。
通过运行Docker image ls命令,确认Docker成功构建了您的映像:

如果您已经在过去提取或构建了图像并保存了它们,它们也会出现在CLI输出中。然而,你可以看到穆罕默德的码头工人形象被列在最前面,因为这是最新的。
更改生产工作负载
如果您想考虑在生产Go应用程序中不可避免地发生的代码或依赖项更改,该怎么办?根据Mohammad的说法,您需要调整原始Dockerfile并添加一些说明,以便更改可见,构建过程成功:


FROM golang:1.19.2-bullseye
 
WORKDIR /app
 
# Effectively tracks changes within your go.mod file
COPY go.mod .
 
RUN go mod download
 
# Copies your source code into the app directory
COPY main.go .
 
RUN go mod -o /godocker
 
EXPOSE 8080
 
CMD [ “/godocker” ]

进行这些更改后,您将希望运行相同的docker build和docker image ls命令。现在,是时候运行您的新图像了!输入以下命令以从图像启动容器:

docker run -d -p 8080:8081 --name go-docker-app [YOUR IMAGE NAME]:alpha

 通过输入docker-ps命令来确认这是否有效,该命令将生成容器列表。如果您安装了Docker Desktop,您也可以从Docker Dashboard访问Containers选项卡,并在列表中找到您的新容器。这也适用于您的图像构建,而不是使用“图像”选项卡。
祝贺通过跟踪Mohammad的步骤,您成功地将一个正常运行的围棋应用程序封装起来。
最佳实践和优化
当我们的围棋应用程序完成任务时,Mohammad的最终图像相当大,达到913MB。客户端(或最终用户)不必下载如此庞大的文件。
Mohammad建议使用多阶段构建,只在图像层之间向前复制所需的组件。尽管我们以golang:version作为构建者图像开始,但定义第二个构建阶段并选择像alpine这样的苗条替代方案有助于减小图像大小。你可以看到他一步步解决这个问题的方法。
这在许多用例中都是有益的和常见的。然而,通过在多阶段构建中使用FROM,您可以更进一步。这个空文件是我们提供的最小的文件,并接受静态二进制文件作为可执行文件-这使它非常适合Go应用程序开发。
您可以在Docker Hub上了解更多关于我们的scratch图像的信息。尽管在Hub上,您只能直接将scratch添加到Dockerfile中,而不是将其拉出。

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

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

相关文章

小程序vant-tabbar使用示例,及报错处理

小程序vant-tabbar使用示例,及报错处理1. 配置信息2. 添加 tabBar 代码文件3. 编写 tabBar 代码custom-tab-bar/index.tscustom-tab-bar/index.jsoncustom-tab-bar/index.wxml使小程序使用vant-tabbar组件时,遇到以下报错:Couldn’t found th…

Java基于springboot+vue的儿童玩具销售购物网站 多商家

爱玩儿是所有孩子的天性。尤其是在婴幼儿阶段。选择一个好的玩具,不仅能够让孩子玩儿的开心,而且有助于孩子智力的开发。很多家长在选择玩具的时候,不知道选择什么样的玩具。且当前玩具市场的玩具鱼目混杂,种类繁多,而…

SAR信号处理基础1——线性调频信号

关键字:线性调频信号,LFM信号,chirp信号,驻定相位原理(POSP),泰勒展开,Taylor展开,脉冲压缩,匹配滤波,sinc,分辨率,峰值旁…

QProgressDialog.close()失败,进度条关闭感觉失败了,无法彻底关闭

开发环境:我是在deepin(深度)系统下开发的,在我本机上,一点问题也没有,但是我移植到了ubantu的机子上,就偶尔出现出个问题,出现了一个模态框,需要重启软件才能关闭。 问题…

Vue的computed和watch的区别是什么?

一、computed介绍 computed 用来监控自己定义的变量&#xff0c;该变量在 data 内没有声明&#xff0c;直接在 computed 里面定义&#xff0c;页面上可直接使用。 //基础使用 {{msg}} <input v-model"name" /> //计算属性 computed:{msg:function(){return …

【MySQL】MySQL日志系统以及InnoDB背后的技术(MySQL专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码&#xff0c;就职于大型金融公司后端高级工程师&#xff0c;擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1…

Java基于springboot+vue的个人博客网站 前后端分离

随着现在网络的快速发展&#xff0c;网上管理系统也逐渐快速发展起来&#xff0c;网上管理模式很快融入到了许多网站的之中&#xff0c;随之就产生了“博客网站”&#xff0c;这样就让博客网站更加方便简单。 对于本博客网站的设计来说&#xff0c;系统开发主要是采用java语言技…

2022国产8K摄像机介绍

摄像机是一种把光学图像信号转变为电信号&#xff0c;以便于存储或者传输的设备。当我们拍摄一个物体时&#xff0c;此物体上反射的光被摄像机镜头收集&#xff0c;使其聚焦在摄像器件的受光面&#xff08;例如摄像管的靶面&#xff09;上&#xff0c;再通过摄像器件把光转变为…

N-HiTS: Neural Hierarchical Interpolation for Time Series Forecasting

N-HiTS: Neural Hierarchical Interpolation for Time Series Forecasting 神经预测的最新进展加速了大规模预测系统性能的提高。然而,长期预测仍然是一项非常困难的任务。影响这项任务的两个常见挑战是预测的波动性和它们的计算复杂性。本文提出N-HiTS,一种通过结合新的分层…

不同字符编码对比

目录 1. ASCII码 2. Unicode 3. GBK编码 1. ASCII码 ASCII码使用一个字节编码&#xff0c;但只适用于英文&#xff1b; 2. Unicode Unicode定义了字符集&#xff0c;有 17 个 code plane&#xff0c;总共规划了 1,114,112 个 code point。而这些字符可以使用UTF-8、UTF-1…

Windows无法访问指定设备、路径或文件怎么办?

如何解决Windows 无法访问指定的设备、路径或文件错误&#xff1f; 1.修改安全中心的设置 如果在安装程序的过程中&#xff0c;遇到该错误&#xff0c;可以进入到【Windows安全中心】进行设置修改。 第一步&#xff1a;点击左下角的开始按钮&#xff0c;然后依次点击【设置】…

直接安装WSL2及安装Ubuntu到F盘

1. 勾选这三项&#xff0c;重启 2. 以管理员方式运行powersell wsl --updatewsl --shutdownwsl --set-default-version 2wsl --status3. 解压缩ubuntu 解压缩Ubuntu_1804.2019.522.0_x64.appx到F盘 4. 安装ubuntu 双击ubuntu1804.exe安装 5. 运行 双击ubuntu1804.exe …

AI人工智能实践技术系统性教学方案

郁磊老师【副教授】 &#xff1a;长期从事Python、Matlab机器学习及深度学习等研究工作&#xff0c;具备良好的数学及信号处理基础&#xff0c;熟悉如神经网络、支持向量机、决策树、随机森林等&#xff0c;以及群优 化算法&#xff0c;如遗传算法、蚁群算法、蝙蝠算法等&#…

React源码解读之更新的创建

React 的鲜活生命起源于 ReactDOM.render &#xff0c;这个过程会为它的一生储备好很多必需品&#xff0c;我们顺着这个线索&#xff0c;一探婴儿般 React 应用诞生之初的悦然。 更新创建的操作我们总结为以下两种场景 ReactDOM.rendersetStateforceUpdate ReactDom.render …

k8s-dynamic-pvc

安装 storage class: external-storage/nfs-client/deploy at master kubernetes-retired/external-storage GitHub 下载文件并安装: class.yaml deployment.yaml rbac.yaml 其中修改: 安装 测试: [rootmaster test-dir]# cat nginx-1.yaml apiVersion: v1 kind: Pers…

【Pytorch with fastai】第 4 章 :底层训练数字分类器

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

一切为了喵喵 | 攻防世界 x Nepnep x CATCTF邀你一战!

各位极客请注意❗ 各位极客请注意❗❗ 为了坚决捍卫每只小猫咪吃饱饭的权利 为了彻底贯彻“可爱就是王道”的正义 攻防世界 x Nepnep x CATCTF 邀你一战&#xff01; 此战若成&#xff0c;8333只流浪喵星人将能饱餐一顿&#xff01; 没有一只修猫咪饿肚子的明天在等着我们…

【Python】初始Python

文章目录一. Python背景知识1. Python的起源2. Python的作用3. Python的优缺点4. Python的前景二. 搭建Python环境1. 安装Python2. 安装 PyCharm一. Python背景知识 1. Python的起源 Python祖师爷吉多 范罗苏姆&#xff08;Guido van Rossum&#xff09;是一个荷兰程序员&am…

简易的Python小游戏,上班可玩一天,零基础小白可练手

文章目录 一、第一次写Python小游戏二、对小游戏进行改进 1.对玩家进行提示2.提供多次机会给玩家3.每次答案应该是随机的 三、总结 一、第一次写Python小游戏 刚开始学习Python这门计算机语言&#xff0c;所以在网上找了一个非常简易的小游戏来进行模仿编写&#xff0c;目的…

【数据挖掘】聚类分析

聚类分析 Cluster Analysis 肝到爆炸呜呜呜 一、什么是聚类分析 关键词 1️⃣ 簇 Cluster&#xff1a;数据对象的集合&#xff0c;相同簇中的数据彼此相似&#xff0c;不同簇中的数据彼此相异。 2️⃣ 聚类分析 Cluster analysis&#xff1a;根据数据特征找到数据中的相似性…