当前位置: 首页 > news >正文

Docker 化你的 Go 应用程序

在这篇文章中,我们将学习如何 Dockerize 一个 Go 应用程序。具体来说,我们将学习如何通过一个名为 Dockerfile 的文件在 Docker 容器中安装 Go。不用担心——随着我们的继续,我们将了解更多关于 Dockerfiles 的信息。

如果您不熟悉,Go 是一种开源、静态类型、编译的编程语言,可让您构建简单、可靠和高效的软件。它用于构建 Web 应用程序、云原生应用程序、CLI 等等——甚至 Docker 也是用 Go 编写的!

我们将创建一个用于演示目的的最小 Go 项目,并展示如何在 Docker 容器内公开本地文件夹以便于开发。这样我们就不必在每次对 Go 应用程序进行更改时都重新构建 Docker 容器。

跳跃前进:

  • Docker 化您的应用程序的优势

  • 先决条件

  • 设置我们的开发环境

  • Dockerfiles 简介

  • 为我们的应用程序构建 Docker 镜像

  • 在容器内运行我们的 Docker 镜像

Docker 化您的应用程序的优势

Docker 是一个开源项目,允许开发人员将其应用程序与所有必要的依赖项、配置、脚本等打包在该容器内,并将其部署为单个实体。这很容易在称为容器的环境中自动部署应用程序,并允许这些应用程序轻松地在任何主机操作系统上运行。

这种方法的优点是,不是将我们的应用程序部署在虚拟机中,这会带来一些与可用操作系统相关的瓶颈,而是部署在 Docker 容器中,因为它可以使用单个主机(在这种情况下) ,一个 Linux 操作系统及其所有底层资源)来服务我们的应用程序。使用这种方法,我们不必关心如何或在何处部署应用程序,因为我们不再需要考虑目标操作系统。

例如,虚拟机在客户操作系统中运行应用程序。另一方面,容器为我们提供了一种沙盒方式来打包我们的应用程序并将其从它实际运行的环境(即主机)中抽象出来。这使得使用 Docker 构建的应用程序可以轻松部署,而与目标操作系统无关。因此,开发人员可以更轻松地创建可以在任何地方运行的应用程序,并且可以确保它们正常运行,因为它们与其他主机操作系统进程隔离。

先决条件

对于这篇文章,我们只需要熟悉命令行和文本编辑器的基本用法就可以了。使用 Go 开发 Web 应用程序的先前经验会有所帮助,但不是绝对必需的。要开始使用 Go,请查看文档中的此链接。

最后,请在 DockerHub 上创建一个帐户,并根据您选择的操作系统将其安装在您的开发机器上。

设置我们的开发环境

要继续,我们需要根据我们的操作系统安装以下内容。


超过 20 万开发人员使用 LogRocket 来创造更好的数字体验了解更多 →


  • Go 版本≥ 1.16。您可能需要先下载并安装 Go

  • Docker 在本地运行。按照说明下载并安装 Docker

  • 用于编辑文件的 IDE 或文本编辑器。在这篇文章中,我们将使用Visual Studio Code,但任何其他现代代码编辑器也可以

在这篇文章中,我们将使用 macOS。下载Go后,点击文件,解压系统路径下的Go包,安装Go。安装 Go 后,我们可以通过在终端中运行以下命令来确认版本:.pkg

之后,继续在本地机器上下载并安装 Docker 桌面。安装后的 Docker 桌面图像如下所示。

此外,要确认我们的系统上安装了 Docker,我们可以运行以下命令:

个体码头——版本

接下来,让我们继续引导一个最小的 Go 应用程序,因为对于这篇文章,我们的重点不是学习 Go。首先,创建一个新文件夹并将其命名为本地计算机上的任何路径。go-demo

mkdir go - docker -演示

导航到目录。

cd go - docker -演示

运行以下命令来启动一个新的 Go 模块:

go mode init go - docker - demo

在代码编辑器中打开该文件夹。在我们的项目文件夹中,创建一个名为 的文件,并将以下代码粘贴到文件中。保存文件并见下文。main.go


来自 LogRocket 的更多精彩文章:

  • 不要错过来自 LogRocket 的精选时事通讯The Replay

  • 使用 React 的 useEffect优化应用程序的性能

  • 在多个 Node 版本之间切换

  • 了解如何使用 AnimXYZ 为您的 React 应用程序制作动画

  • 探索 Tauri,一个用于构建二进制文件的新框架

  • 比较NestJS 与 Express.js

  • 发现TypeScript 领域中使用的流行 ORM


包主导
入“fmt” 
​
函数主要(){ 
    fmt 。Println (“你好,世界!” )} 

要测试代码是否按预期运行,请从终端运行or命令。输出如下所示。go run .``go run main.go

现在一切都按预期工作了,在下一节中,我们将继续学习如何创建 Dockerfile。让我们继续。

Dockerfiles 简介

Dockerfile 通常包含为您的程序构建 Docker 映像的必要说明。使用docker buildCLI 上的命令,我们可以创建一个连续执行多个命令行指令的自动构建。

例如,我们可以在命令中使用标志来指向系统路径中任何位置的 Dockerfile。此命令根据 Dockerfile 中的说明构建 Docker 映像。-f``docker build

docker build -f / path / to / docker / file

为了为我们的应用程序创建一个 Dockerfile,Dockerfile在我们项目的根目录中创建一个新的。

在 中Dockerfile,继续编写为 Go 应用程序构建 Docker 映像所需的指令。在文件中添加一行,告诉 Docker 我们应该为我们的应用程序使用哪个基础镜像。

来自 golang :1.16 -高山

这一行告诉我们的 Dockerfile 继承并使用该镜像作为我们自己的应用程序镜像的基础镜像。这个镜像是一个官方的 Go 镜像,已经托管和分发,并且包含运行 Go 应用程序所需的所有工具和包。这意味着我们不必重新发明轮子并从头开始创建新的基础镜像,而是根据我们自己的镜像需求扩展一个预先存在的标准镜像。golang:1.16-alpine

接下来,我们可以继续为 Dockerfile 包含下一行。在下一节中,我们将讨论每条线所代表的含义。

工作目录/应用程序
​
复制去。模组./
RUN go mod 下载
​
复制*。去。/
运行go 
build -o / go - docker - demo
​
曝光8080
​
CMD [ "/go-docker-demo" ]  

首先,该行在 Docker 映像中创建了一个新目录。我们的想法是使用这个目录来存放我们的 Docker 映像,并在该目录中运行其余的 Docker 命令,以便它可以作为我们在 Docker 容器中前进的源代码的新参考点。WORKDIR /app

接下来的两行,从 3-4 复制文件中的内容并将它们粘贴到 app 目录中,这是我们在 Docker 容器中的当前工作目录。正如我们所看到的,我们使用了该命令,它告诉 Docker 我们要复制的文件的位置以及我们打算将其复制到的目标。go.mod``COPY

接下来,我们要安装编译 Go 应用程序所需的模块。这一步是在我们将最后一步中的文件复制到项目文件夹之后进行的。该RUN命令执行 Go 模块并将其安装到映像内的目录中。

现在我们已经从 DockerHub 中提取了 Docker 镜像并在我们的和文件中安装了模块,下一步是将我们的源代码复制到镜像中。正如我们在第 7 行看到的,我们基本上使用通配符将所有以扩展名结尾的文件复制到当前路径或工作目录中。这与 Dockerfile 所在的目录相同,位于 Docker 映像内。go.modgo.sum.go

下一步是像在本地一样构建我们的应用程序。为此,我们RUN再次使用该命令。正如我们在第 9 行看到的,我们正在使用该go build命令来构建我们的 Go 应用程序。这将在 Docker 映像的根目录中创建一个具有相同名称的 Go 二进制文件,就像我们在本地机器上运行时一样go build。

最后,是时候运行我们的 Docker 镜像了。当镜像用于启动容器时,我们需要告诉 Docker 运行哪个命令。在上面的 Dockerfile 的第 13 行,我们可以CMD在同一路径中看到带有二进制文件名称的参数。这会在 Docker 容器中运行我们的代码。

现在我们已经完成了设置,让我们在下一步中继续在容器内构建 Docker 映像。

为我们的应用程序构建 Docker 镜像

Docker 映像包含 Docker 容器的配置,例如环境变量、要运行的默认命令和其他元数据。映像还应该包含运行应用程序所需的一切,包括代码或二进制文件、运行时、依赖项以及任何其他所需的文件系统对象。

要构建映像,我们使用docker build命令,该命令从Dockerfile. 继续到终端并在当前目录中运行命令:

docker build -t go - docker - demo 。

flag 是一个标签,可以帮助我们识别 Docker 镜像。请参阅下面此命令的输出。-t

正如我们在上面看到的,我们已经成功地在容器中构建了我们的 Docker 镜像。为了验证,我们可以通过运行以下命令查看容器内的图像:

泊坞窗图像 ls

输出如下所示。

悟饭游戏厅会员版,畅玩上万款各平台游戏资源,支持金手指功能!

在下一步中,我们将运行我们的 Docker 映像。

在容器内运行我们的 Docker 镜像

要在容器内运行我们的图像,我们可以使用docker run命令。它需要一个参数:图像名称。

让我们启动我们的镜像并确保它正常运行。在终端中运行以下命令。

docker run go - docker -演示    

要验证此命令的输出,并确保我们的代码在 Docker 容器内按预期运行,就像在本地一样:

我们可以运行docker ps命令来显示我们机器上运行的容器列表。

上图表明我们没有看到正在运行的图像——因为我们的应用程序不像一个持续运行的 Web 服务器。对于连续运行的应用程序,我们会看到一个容器镜像与所有其他细节一起连续运行。

另一种确认方法是访问 Docker 桌面。导航到下面的屏幕以查看日志。

如果我们单击 Docker 映像并检查日志,我们可以看到我们的映像已启动并正在运行。

最后,我们可以使用 Docker 桌面应用程序中的 dev environment 选项将容器作为完整的开发环境在本地运行(尽管它目前处于公开测试阶段,因此可能存在一些细微的错误)。要试用它,请导航到Docker 桌面上的Create a Dev Environment选项卡。

单击开始按钮,创建一个新的开发环境,然后选择本地目录单选按钮。最后,添加本地存储库的路径。

点击继续,等待开发环境搭建完成。

我们可以继续在我们的代码编辑器中打开 Docker 映像。目前,它与 VS Code 集成。

结论

在这篇文章中,我们学习了如何使用来自 DockerHub 的标准 Go 基础镜像来 Dockerize 一个 Go 应用程序。我们已经完成了从设置基本 Go 应用程序、设置 Dockerfile、了解 Dockerfile 中的步骤、构建 Docker 映像以及在 Docker 容器中运行我们的映像的所有步骤。

正如我们所看到的,由于其重要性,Docker 是一种与大多数代码基础设施设置相关的工具,其中一些我们在本文前面已概述。Docker 容器的另一个优点是它们使我们的应用程序更便携,因为我们可以更轻松地重用和分发它们。它们还使开发人员可以更好地控制资源,从而更好地利用计算资源。

LogRocket主动显示和诊断您的应用程序和网站中最重要的问题

成千上万的工程和产品团队使用LogRocket来减少了解技术和可用性问题的根本原因所需的时间。使用 LogRocket,您将减少与客户来回对话的时间,并消除无休止的故障排除过程。LogRocket 让您可以花更多时间构建新事物,而减少修复错误的时间。

相关文章:

  • 3.ROS2笔记-ROS2开发环境配置
  • 手写堆(Heap)
  • java-php-python-ssm白樵校园物品交易系统计算机毕业设计
  • C语言详解《位段+联合体+枚举》
  • 2.ROS2笔记-ROS2命令行操作
  • 【Proteus】:入门学习
  • SpringBoot启动流程简析
  • 如何在网站上安装 WordPress
  • java毕业设计社区健康管理系统源码+lw文档+mybatis+系统+mysql数据库+调试
  • 17、Java——汽车租赁系统
  • SpringSecurity系列 - 15 SpringSecurity 记住我 RememberMe
  • 2022出海东南亚:越南电商市场现状及网红营销特点
  • 测试用例设计专栏
  • Intel汇编-间接寻址
  • 测试工程师面试不会做的2门功课,你是不是也是呢?
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • [iOS]Core Data浅析一 -- 启用Core Data
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • 345-反转字符串中的元音字母
  • Angular Elements 及其运作原理
  • egg(89)--egg之redis的发布和订阅
  • GraphQL学习过程应该是这样的
  • Java 23种设计模式 之单例模式 7种实现方式
  • orm2 中文文档 3.1 模型属性
  • Redis学习笔记 - pipline(流水线、管道)
  • sublime配置文件
  • unity如何实现一个固定宽度的orthagraphic相机
  • webgl (原生)基础入门指南【一】
  • 跨域
  • 使用docker-compose进行多节点部署
  • 为什么要用IPython/Jupyter?
  • 一文看透浏览器架构
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (1)STL算法之遍历容器
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (九十四)函数和二维数组
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (三分钟)速览传统边缘检测算子
  • (一)认识微服务
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .NET CLR Hosting 简介
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .net framework4与其client profile版本的区别
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .net(C#)中String.Format如何使用
  • .net实现客户区延伸至至非客户区
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • @PreAuthorize注解
  • @Valid和@NotNull字段校验使用
  • [ 数据结构 - C++]红黑树RBTree