分享好友 最新动态首页 最新动态分类 切换频道
107. 如何使用Docker以及Docker Compose部署Go Web应用
2024-12-27 00:52

107. 如何使用Docker以及Docker Compose部署Go Web应用

本文将介绍如何使用以及部署我们的 程序。

使用的主要目标是容器化。也就是为你的应用程序提供一致的环境,而不依赖于它运行的主机。

想象一下你是否也会遇到下面这个场景,你在本地开发了你的应用程序,它很可能有很多的依赖环境或包,甚至对依赖的具体版本都有严格的要求,当开发过程完成后,你希望将应用程序部署到服务器。这个时候你必须确保所有依赖项都安装正确并且版本也完全相同,否则应用程序可能会崩溃并无法运行。如果你想在另一个服务器上也部署该应用程序,那么你必须从头开始重复这个过程。这种场景就是发挥作用的地方。

对于运行我们应用程序的主机,不管是笔记本电脑还是服务器,我们唯一需要做的就是运行一个容器平台。从这以后,你就不需要担心你使用的是还是其他。你只需定义一次应用,即可随时随地运行。

这里我先用一段使用库编写的简单代码为例讲解如何使用Docker进行部署,后面再讲解稍微复杂一点的项目部署案例。

 

上面的代码通过端口对外提供服务,返回一个字符串响应:。

镜像)包含运行应用程序所需的所有东西——代码或二进制文件、运行时、依赖项以及所需的任何其他文件系统对象。

要创建镜像)必须在配置文件中指定步骤。这个文件默认我们通常称之为。(虽然这个文件名可以随意命名它,但最好还是使用默认的。

现在我们开始编写,具体内容如下

注意:某些步骤不是唯一的,可以根据自己的需要修改诸如文件路径、最终可执行文件的名称等

 
 

From
我们正在使用基础镜像来创建我们的镜像。这和我们要创建的镜像一样,是一个我们能够访问的存储在仓库的基础镜像。这个镜像运行的是发行版,该发行版的大小很小并且内置了,非常适合我们的用例。有大量公开可用的镜像,请查看https://hub.docker.com/_/golang

Env
用来设置我们编译阶段需要用的环境变量。

WORKDIR,COPY,RUN
这几个命令做的事都写在注释里了,很好理解。

EXPORT,CMD
最后,我们声明服务端口,因为我们的应用程序监听的是这个端口并通过这个端口对外提供服务。并且我们还定义了在我们运行镜像的时候默认执行的命令。

在项目目录下,执行下面的命令创建镜像,并指定镜像名称为

 

等待构建过程结束,输出如下提示

 

现在我们已经准备好了镜像,但是目前它什么也没做。我们接下来要做的是运行我们的镜像,以便它能够处理我们的请求。运行中的镜像称为容器。

执行下面的命令来运行镜像

 

标志位用来定义端口绑定。由于容器中的应用程序在端口上运行,我们将其绑定到主机端口也是。如果要绑定到另一个端口,则可以使用。例如-p 。

现在就可以测试下我们的程序是否工作正常,打开浏览器输入就能看到我们事先定义的响应内容如下

 
 

我们的程序编译之后会得到一个可执行的二进制文件,其实在最终的镜像中是不需要编译器的,也就是说我们只需要一个运行最终二进制文件的容器即可。

的最佳实践之一是通过仅保留二进制文件来减小镜像大小,为此,我们将使用一种称为多阶段构建的技术,这意味着我们将通过多个步骤构建镜像。

 

使用这种技术,我们剥离了使用作为编译镜像来编译得到二进制可执行文件的过程,并基于生成一个简单的、非常小的新镜像。我们将二进制文件从命名为的第一个镜像中复制到新创建的镜像中。有关镜像的更多信息,请查看https://hub.docker.com/_/scratch

这里以一个小清单项目(名为)为例,项目的仓库地址为:https://github.com/Q1mi/bubble。

我们的项目用到了静态文件和配置文件,具体目录结构如下

 

我们需要将三个文件夹中的内容拷贝到最终的镜像文件中。更新后的如下

 

简单来说就是多了几步的步骤,大家看一下中的注释即可。

Tips: 这里把COPY静态文件的步骤放在上层,把COPY二进制可执行文件放在下层,争取多使用缓存。

又因为我们的项目中使用了,我们可以选择使用如下命令启动一个容器,它的别名为;用户的密码为;挂载容器中的到本地的目录;内部服务端口为,映射到外部的端口。

 

这里需要修改一下我们程序中配置的的地址为容器别名,使它们在内部通过别名(此处为)联通。

 

修改后记得重新构建镜像

 

我们这里运行容器的时候需要使用的方式与上面的容器关联起来,具体命令如下

 
 

除了像上面一样使用的方式来关联两个容器之外,我们还可以使用来定义和运行多个容器。

是用于定义和运行多容器 应用程序的工具。通过 ,你可以使用 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 文件配置中创建并启动所有服务。

使用基本上是一个三步过程

  • 使用定义你的应用环境以便可以在任何地方复制。
  • 定义组成应用程序的服务,以便它们可以在隔离的环境中一起运行。
  • 执行 命令来启动并运行整个应用程序。

我们的项目需要两个容器分别运行和,我们编写的文件内容如下

 

这个 文件定义了两个服务: 和 。其中

bubble_app
使用当前目录下的文件构建镜像,并通过指定依赖服务,声明服务端口并绑定对外端口。

mysql8019
服务使用的公共 镜像,内部端口,外部端口。

注意

这里有一个问题需要注意,我们的容器需要等待容器正常启动之后再尝试启动,因为我们的程序在启动的时候会初始化连接。这里共有两个地方要更改,第一个就是我们中要把最后一句注释掉

 

第二个地方是在下面添加如下命令,使用提前编写的脚本检测正常后再执行后续启动应用程序的命令

 

当然,因为我们现在要在镜像中执行命令,所以不能在使用镜像构建了,这里改为使用,同时还要安装脚本用到的,最后不要忘了把脚本文件到最终的镜像中,并赋予可执行权限哦。更新后的内容如下

 

所有的条件都准备就绪后,就可以执行下面的命令跑起来了

 

完整版代码示例,请查看仓库:https://github.com/Q1mi/deploy_bubble_using_docker。

使用容器能够极大简化我们在配置依赖环境方面的操作,但同时也对我们的技术储备提了更高的要求。对于不管你是熟悉抑或是不熟悉,技术发展的车轮都滚滚向前。

最新文章
龙BT最新技术革新及其影响力展望
摘要:最新的龙BT技术革新在科技领域引起了广泛关注。这一技术突破带来了更高效、更便捷的应用体验,推动了相关行业的快速发展。其影响不仅体现在提升了工作效率,更在相关领域内催生了新的商业模式和竞争格局。这项技术的革新对于推动社会
线上推广引流的方法_线上推广获客
∩^∩ ...小程序用户达160万人,2023年计划组织超40场线上线下营销推广活动相关营销能力也成为了拓展引流必不可少的手段。公司是否有相应的发展计划,来推动自身旅游业务发展?公司回答表示:公司积极拓宽线上营销后面会介绍。 住宿业平台
龙岩SEO网络营销,企业互联网腾飞的关键动力
龙岩SEO网络营销,作为企业互联网发展的新引擎,通过优化搜索引擎排名,提升企业品牌影响力,助力企业实现线上腾飞。随着互联网的飞速发展,网络营销已经成为企业提升品牌知名度、拓展市场份额的重要手段,龙岩作为福建省的一个地级市,拥
首次!文明大冶跻身百强榜!
喜荆楚网(湖北日报网)楚天舆情数据研究院制作的湖北区县微信排行榜2024年11月榜单出炉“文明大冶”微信公众号首次跻身全省TOP100榜排行榜规则说明1、聚集湖北省内主要党政机关政务微信公众号,根据WCI指数数据进行科学排行,主要从“整体
骗了人:深世智能APP是做任务刷单软件!被骗无法提现不了
深世智能APP是做任务刷单软件!被骗无法提现不了帮助出嘿葳《8224205》希望阅读此文的读者能够及时采取措施以减少损失;请及时与团队联系提供解决方案(文章下面图片有咨询方式)若想追回损失资产,务必仔细阅读以下内容。【GFRGRHFDHS】202
重磅揭秘“滴滴抢预约单神器软件”爆光开挂猫腻详情
滴滴抢预约单神器软件是一款可以让一直输的玩家,快速成为一个“必胜”的ai辅助神器,有需要的用户可以加我微下载使用。抢单可以一键让你轻松成为“必赢”。其操作方式十分简单,打开这个应用便可以自定义抢单系统规律,只需要输入自己想要
百度排名优化软件
百度排名优化软件:提升网站在百度搜索结果中的排名随着互联网的快速发展,越来越多的企业和个人都意识到了网络营销的重要性。而在网络营销中,百度排名优化软件成为了提高网站在百度搜索结果中排名的有效工具。本文将为您详细介绍百度排名
搜狗搜索手机旧版
搜狗搜索智能搜索结果为您展示最直观最易懂的搜索结果,全网热点深度解析,全民多话题讨论。感兴趣的小伙伴快来下载搜狗搜索手机旧版体验吧。通过微信登陆、身份标签、智能推荐和收藏分享;能让用户在海量微信公众号内容中迅速找到自己感兴
最新炒股技巧深度解析与应用策略指南
摘要:,,最新炒股技巧深度解析与应用策略,本文提供对股市的最新动态和趋势的深入理解。通过深度解析各种技术指标、市场趋势和交易策略,帮助投资者更好地把握市场机会,提高投资成功率。本文强调应用策略的重要性,提供实用的投资建议和
鲁大师AiNAS app功能特色:
鲁大师AiNAS app是鲁大师官方倾情推出的一款个人私有云服务器应用,软件拥有智能助理,文件套件,相册套件,电脑下载等等方便服务,觉得不错的朋友可以前来下载使用。鲁大师AiNAS能够将您的电脑变为一台个人服务器,让您可以通过本 APP 随
相关文章
推荐文章
发表评论
0评