在这篇文章中,我们将学习如何 Dockerize 一个 Go 应用程序。具体来说,我们将学习如何通过一个名为 Dockerfile 的文件在 Docker 容器中安装 Go。不用担心——随着我们的继续,我们将了解更多关于 Dockerfiles 的信息。
如果您不熟悉,Go 是一种开源、静态类型、编译的编程语言,可让您构建简单、可靠和高效的软件。它用于构建 Web 应用程序、云原生应用程序、CLI 等等——甚至 Docker 也是用 Go 编写的!
我们将创建一个用于演示目的的最小 Go 项目,并展示如何在 Docker 容器内公开本地文件夹以便于开发。这样我们就不必在每次对 Go 应用程序进行更改时都重新构建 Docker 容器。
跳跃前进:
Docker 化您的应用程序的优势
先决条件
设置我们的开发环境
Dockerfiles 简介
为我们的应用程序构建 Docker 镜像
在容器内运行我们的 Docker 镜像
Docker 是一个开源项目,允许开发人员将其应用程序与所有必要的依赖项、配置、脚本等打包在该容器内,并将其部署为单个实体。这很容易在称为容器的环境中自动部署应用程序,并允许这些应用程序轻松地在任何主机操作系统上运行。
这种方法的优点是,不是将我们的应用程序部署在虚拟机中,这会带来一些与可用操作系统相关的瓶颈,而是部署在 Docker 容器中,因为它可以使用单个主机(在这种情况下) ,一个 Linux 操作系统及其所有底层资源)来服务我们的应用程序。使用这种方法,我们不必关心如何或在何处部署应用程序,因为我们不再需要考虑目标操作系统。
例如,虚拟机在客户操作系统中运行应用程序。另一方面,容器为我们提供了一种沙盒方式来打包我们的应用程序并将其从它实际运行的环境(即主机)中抽象出来。这使得使用 Docker 构建的应用程序可以轻松部署,而与目标操作系统无关。因此,开发人员可以更轻松地创建可以在任何地方运行的应用程序,并且可以确保它们正常运行,因为它们与其他主机操作系统进程隔离。
对于这篇文章,我们只需要熟悉命令行和文本编辑器的基本用法就可以了。使用 Go 开发 Web 应用程序的先前经验会有所帮助,但不是绝对必需的。要开始使用 Go,请查看文档中的此链接。
最后,请在 DockerHub 上创建一个帐户,并根据您选择的操作系统将其安装在您的开发机器上。
要继续,我们需要根据我们的操作系统安装以下内容。
超过 20 万开发人员使用 LogRocket 来创造更好的数字体验了解更多 →
Go 版本≥ 1.16。您可能需要先下载并安装 Go
Docker 在本地运行。按照说明下载并安装 Docker
用于编辑文件的 IDE 或文本编辑器。在这篇文章中,我们将使用Visual Studio Code,但任何其他现代代码编辑器也可以
在这篇文章中,我们将使用 macOS。下载Go后,点击.pkg文件,解压系统路径下的Go包,安装Go。安装 Go 后,我们可以通过在终端中运行以下命令来确认版本:
之后,继续在本地机器上下载并安装 Docker 桌面。安装后的 Docker 桌面图像如下所示。
此外,要确认我们的系统上安装了 Docker,我们可以运行以下命令:
码头工人--版本
接下来,让我们继续引导一个最小的 Go 应用程序,因为对于这篇文章,我们的重点不是学习 Go。首先,创建一个新文件夹并将其命名为go-demo本地计算机上的任何路径。
mkdir go-docker-demo
导航到目录。
cd go-docker-demo
运行以下命令来启动一个新的 Go 模块:
go mode init go-docker-demo
在代码编辑器中打开该文件夹。在我们的项目文件夹中,创建一个名为 的文件main.go,并将以下代码粘贴到文件中。保存文件并见下文。
不要错过来自 LogRocket 的精选时事通讯The Replay
使用 React 的 useEffect优化应用程序的性能
在多个 Node 版本之间切换
了解如何使用 AnimXYZ 为您的 React 应用程序制作动画
探索 Tauri,一个用于构建二进制文件的新框架
比较NestJS 与 Express.js
发现TypeScript 领域中使用的流行 ORM
包主 导入“fmt” 功能主要(){ fmt.Println("你好,世界!") }
要测试代码是否按预期运行,请从终端运行go run .or命令。go run main.go输出如下所示。
现在一切都按预期工作了,在下一节中,我们将继续学习如何创建 Dockerfile。让我们继续。
Dockerfile 通常包含为您的程序构建 Docker 映像的必要说明。使用docker buildCLI 上的命令,我们可以创建一个连续执行多个命令行指令的自动构建。
例如,我们可以-f在命令中使用标志docker build来指向系统路径中任何位置的 Dockerfile。此命令根据 Dockerfile 中的说明构建 Docker 映像。
docker build -f /path/to/docker/file
为了为我们的应用程序创建一个 Dockerfile,Dockerfile在我们项目的根目录中创建一个新的。
在 中Dockerfile,继续编写为 Go 应用程序构建 Docker 映像所需的指令。在文件中添加一行,告诉 Docker 我们应该为我们的应用程序使用哪个基础镜像。
FROM golang:1.16-alpine
这一行告诉我们的 Dockerfile 继承并使用该golang:1.16-alpine镜像作为我们自己的应用程序镜像的基础镜像。这个镜像是一个官方的 Go 镜像,已经托管和分发,并且包含运行 Go 应用程序所需的所有工具和包。这意味着我们不必重新发明轮子并从头开始创建一个新的基础镜像,而是根据我们自己的镜像需求扩展一个预先存在的标准镜像。
接下来,我们可以继续为 Dockerfile 包含下一行。在下一节中,我们将讨论每条线所代表的含义。
工作目录 /app 复制 go.mod ./ RUN go mod 下载 复制 *.go ./ 运行 go build -o /go-docker-demo 曝光 8080 CMD [ "/go-docker-demo" ]
首先,该WORKDIR /app行在 Docker 映像中创建了一个新目录。我们的想法是使用这个目录来存放我们的 Docker 映像并在该目录中运行我们的其余 Docker 命令,以便它可以作为我们在 Docker 容器中前进的源代码的新参考点。
接下来的两行,从 3-4 复制go.mod文件中的内容并将它们粘贴到 app 目录,这是我们在 Docker 容器中的当前工作目录。正如我们所看到的,我们使用了该COPY命令,它告诉 Docker 我们要复制的文件的位置以及我们打算将其复制到的目标。
接下来,我们要安装编译 Go 应用程序所需的模块。这一步是在我们将最后一步中的文件复制到项目文件夹之后进行的。该RUN命令执行 Go 模块并将其安装到映像内的目录中。
现在我们已经从 DockerHub 中提取了 Docker 镜像并在我们的go.mod和go.sum文件中安装了模块,下一步是将我们的源代码复制到镜像中。正如我们在第 7 行看到的,我们基本上使用通配符将所有以.go扩展名结尾的文件复制到当前路径或工作目录中。这与 Dockerfile 所在的目录相同,位于 Docker 映像内。
下一步是像在本地一样构建我们的应用程序。为此,我们RUN再次使用该命令。正如我们在第 9 行看到的,我们正在使用该go build命令来构建我们的 Go 应用程序。这将在 Docker 映像的根目录中创建一个具有相同名称的 Go 二进制文件,就像我们在本地机器上运行时一样go build。
最后,是时候运行我们的 Docker 镜像了。当镜像用于启动容器时,我们需要告诉 Docker 运行哪个命令。在上面的 Dockerfile 的第 13 行,我们可以CMD在同一路径中看到带有二进制文件名称的参数。这会在 Docker 容器中运行我们的代码。
现在我们已经完成了设置,让我们在下一步中继续在容器内构建 Docker 映像。
Docker 映像包含 Docker 容器的配置,例如环境变量、要运行的默认命令和其他元数据。映像还应该包含运行应用程序所需的一切,包括代码或二进制文件、运行时、依赖项以及任何其他所需的文件系统对象。
要构建映像,我们使用docker build命令,该命令从Dockerfile. 继续到终端并在当前目录中运行命令:
docker build -t go-docker-demo 。
flag 是一个标签,-t可以帮助我们识别 Docker 镜像。请参阅下面此命令的输出。
正如我们在上面看到的,我们已经成功地在容器中构建了我们的 Docker 镜像。为了验证,我们可以通过运行以下命令查看容器内的图像:
泊坞窗图像 ls
输出如下所示。
在下一步中,我们将运行我们的 Docker 映像。
要在容器内运行我们的图像,我们可以使用docker run命令。它需要一个参数:图像名称。
让我们启动我们的镜像并确保它正常运行。在终端中运行以下命令。
docker run go-docker-demo
要验证此命令的输出,并确保我们的代码在 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 让您可以花更多时间构建新事物,而减少修复错误的时间。