部署GO应用程序时,我们通常使用Docker Mirror进行部署。那么如何构建GO应用程序的GO Cocer镜子?在镜像施工过程中是否有最佳实践?
这是本文想解释的内容。总的来说,本文将包括诸如Dockerfile编译,镜像构造,多阶段构造,交叉汇编以及使用Makefile来简化构建过程之类的知识点。
为了解释整个镜像构建过程,让我们从简单的GO休息应用开始。
该应用程序主要具有以下功能:
应用程序源代码地址位于https://github.com/nodejh/docker-wo-server-您可以直接下载和使用,或者按照以下步骤从头开始编写代码。
安装依赖项模块:
创建一个新的目录,然后初始化GO模块:
安装回声模块:
接下来,创建一个文件并实现一个简单的GO服务:
接下来,您可能需要执行您以确保源代码中的模块是一致的:
让我们启动我们的GO应用程序并确保其正常运行。输入项目目录并通过命令执行源代码:
让我们在应用程序上执行一个简单的测试,打开一个新终端,使用curl命令或在浏览器中打开它进行测试。例如:
您可以看到正常的回报,如开头所述。
确定服务器正在运行并可以访问后,我们可以继续为应用程序构建Docker镜像。
Dockerfile是Docker Mirror的描述文件,即文本文件。当我们执行镜像映像时,Docker在Dockerfile中读取指令以创建Docker Mirrors。
让我们看一下创建Dockerfile的详细过程。
在项目root目录中创建一个名为Dockerfile的文件,然后在编辑器中将其打开。
添加到Dockerfile的第一行是解析器指令。这是一个选项,指示解析DockerFile时语法使用什么语法。解析器指令必须是dockerfile的第一行,然后再使用任何其他评论,空间或说明,请始终指向最新的指向版本语法的版本。
接下来,将另一行添加到Dockerfile,并告诉Docker我们使用的基本镜子:
在这里,我们将Golang官方镜像中的版本用作基本镜像。Alpine是专门为容器设计的小型Linux发行版。使用基本镜子的优点是GO操作环境和工具是在基本镜子中内置的,因此我们不必自己安装。
为了更好地管理镜子中的应用程序,让我们在镜像中创建一个工作目录,然后将源代码或编译产品存储在此目录中:
接下来,我们需要在镜像中编译GO应用程序,以确保编译和最终操作环境一致。
通常,我们汇编的GO应用程序的第一步是安装依赖项,因此我们必须首先将其复制并复制到镜子中:
该命令可以将文件复制到镜像。这里的相应目录是上一个命令指定的目录。
然后使用命令在镜像中执行安装依赖项,这与我们在该计算机中的直接操作的角色完全相同。不同之处在于,这次将安装在图像中:
目前,我们已经基于GO 1.16的基于镜像的图像并安装了GO应用程序所需的依赖项。下一步是将源代码复制到镜像:
复制命令使用该文件复制当前目录(即Dockerfile所在的目录)。
接下来,我们可以编译GO应用程序,并且仍然使用熟悉的命令:
该命令的结果是生产一个二进制文件,并存储在镜像的系统根目录中。当然,您还可以将二进制文件放在任何其他位置。根目录在这里没有特殊的意义,但其路径却是简短且可读性的,这更方便使用。
现在,其余的是告诉Docker当我们使用此镜像启动容器时,要执行什么命令。目前,您可以使用CMD命令:
编写Dockerfile后,您可以使用该命令来构建镜像图像。
让我们输入Dockerfile所在的目录以构建镜子,并定义一个名称和标签,该名称和标签可方便地通过可选镜子读取和识别。格式是默认情况下的标签:
施工完成后,您可以通过(或缩写)查看镜像列表:
我们还可以通过命令为图像设置一个新标签,例如:
目前,您可以看到Docker-Go-Server-Ping图像的两个标签:
我们还可以通过(缩写)删除图像:
此时,检查镜像列表。该版本的图像已被删除,只剩下版本:
现在,本文主要是GOOKE的Docker Mirror,本文简要说明了如何使用Dockertest来测试GO应用程序。
Dockertest可以启动GO应用程序镜像并在Docker容器中执行测试用例。
相关的测试用例可以参考main_test.go。
在main_test.go中,我们使用镜像图像运行GO应用程序:
因此,在执行之前,您需要构建一面镜子:
也许您已经注意到Docker-Go-Server-Ping图像的大小为407MB,有点大,并且有一套完整的GO工具,GO应用程序依赖性依赖性,但实际上,我们没有当我们在运行时申请时需要这些文件。只需编译二进制文件即可减少镜像的音量吗?
为了减少镜像量,我们可以在多个阶段进行构建。17.05版本后,Docker添加了多个施工功能的阶段。在多个阶段中的构造实际上允许从指令中的多个dockerfile中出现多个。舞台结构,我们首先使用一镜(或更多)镜子来构建一些中间产品,然后将中间产品放入另一个最新和较小的镜子中。
我们首先创建一个命名的多阶段Dockerfile,并且文件名没有特殊含义,只是为了区分先前的Dockerfile。以下是完整的Dockerfile:
在中国两次使用来自指示的指示,与两个施工阶段相对应。从第一阶段内置的说明仍将其用作基本镜子并命名。Docker开始从新的基本镜子开始构造。Scratch Mirror是Docker项目的最小图像。构造的第二阶段是将上一阶段的二进制文件复制到新镜子。
在GO应用程序中,它在多个阶段非常普遍,可以减少镜子的数量并节省大量存储空间。
需要按顺序吸引说明,此处用于交叉汇编。
交叉汇编是指在一个平台上生成另一个平台的可执行程序。
其他编程语言中的交叉汇编可能使用第三方工具,但GO已在交叉汇编工具中构建。使用非常方便。通常,CGO_ENABLED,GOOS和GORARARCH具有足够的环境变量。
CGO_ENABLED的默认值是默认打开CGO,并允许GO代码中的C代码。
因此,在编译时,我们需要将CGO_ENABLED设置为0。
Goos和GooarchGoos是目标平台的操作系统,例如Linux和Windows。请注意,MacOS的值是Darwin。默认值是当前的操作系统。
胶囊是目标平台的CPU架构,例如AMD64,ARM,386等。默认值是当前平台的CPU架构。
GO支持的所有操作系统和CPU架构都可以查看syslist.go。
我们可以使用命令来获取当前鹅和胶囊的值。例如,我当前的操作系统是macOS:
因此,在本文的多阶段构造中,构造命令是:
由于我们现在有两个Dockerfiles,因此我们必须告诉Docker我们要使用新的Dockerfile来构建。
施工完成后,您会发现Docker-Go-Server-Ping:多阶段仅小于8MB,比Docker-Go-go-Server-Ping小数十倍:最新:最新。
现在我们有了一个GO应用程序镜像,然后我们可以运行GO Mirror,看看该应用程序是否正常运行。
要在Docker容器中运行镜像,我们可以使用该命令。参数是镜像名称:
您可以看到GO应用程序已成功启动。
让我们打开一个新的终端,并通过卷发向GO服务器启动请求:
在前面的步骤中,我们使用了很多命令,并且非常麻烦。目前,我们可以用来简化施工过程。
Make是一种自动化构造工具,它将基于当前目录下的名为MakeFile(或Makefile)的文件执行相应的施工任务。
因此,让我们首先创建一个makefile文件,内容如下:
接下来,您可以通过命令测试或构造。
例如:
当然,您还可以在makefile中定义其他命令。
在本文中,我们首先开发了一个简单的GO REST服务应用程序,然后详细解释了如何为应用程序构建Docker镜子。要构建镜像,您需要编写Dockerfile,但是基本的Dockerfile太大了,所以我们已经学会了如何通过多个阶段构建减少的镜像量。由于操作系统和施工机和部署服务器的CPU架构之间的差异,构建多个阶段时,它还学会了如何构建可以直接构建二进制文件在其他平台上通过交叉汇编使用。在本文中,由于整个施工过程涉及许多命令,因此真正的GO项目可能更复杂,因此可以学习如何通过Makefile简化施工过程。
最后,感谢您的阅读。我希望本文的内容能使您获得收益。