本地使用Docker搭建go开发环境的全过程
来源:脚本之家
时间:2022-12-26 18:58:01 380浏览 收藏
本篇文章向大家介绍《本地使用Docker搭建go开发环境的全过程》,主要包括开发环境、dockergo,具有一定的参考价值,需要的朋友可以参考一下。
不过,自从学习了docker之后,被深深的套路了。
说一下用docker部署本地环境的好处:
- 可以保持系统软件环境的纯净。这一点对于喜欢折腾各种工具软件,然后把系统依赖环境搞的一团糟的我来说,特别受用。
- 开发环境和当前使用系统不再强依赖。这也是我喜欢的,这样我不需要担心本地系统的各种配置文件配置,以及多个环境之间以为系统差异导致的依赖包不同造成问题,比如本地跑代码正常,线上跑不通等。
- 开发软件的管理方式更加统一。各种编程语言都有各自的安装流程和步骤,各种应用服务的安装和配置方式也各不相同。通过 Docker,不论是 MySQL,还是 Redis,我都只需要拉镜像,映射端口,然后启动容器就可以正常使用了。
所以对于go而言,我也更希望能跑在docker容器上。
那么接下来就开始吧!
安装
1.docker安装
我使用的是macOS Big Sur,在docker官网上下载对应的dmg包,也有docker desktop
下载地址推荐(下载速度快):http://get.daocloud.io/
接下来等待安装,安装的步骤就不赘述了,比较简单
完成后,打开终端,输入,docker ,出现相关命令信息,表示安装成功!
2.go安装
docker完成之后,可以到docker hub(https://hub.docker.com/)上找go的镜像
我使用目前go的新版go 1.18.1,找的镜像是 golang:1.18.1-buster,拉取:
docker pull golang:1.18.1-buster
经过等待之后,完成下载
docker images
命令可以查看本地所有的镜像,可以看到golang的镜像已经在了,接下来就可以操作了
运行这个镜像:
docker run -d --privileged=true golang
出现类似于”24bbe436b43ea9dd1da0e…“一串,说明启动成功
进入容器:
docker exec -it 24bbe436
注意:这里的容器ID是我的,你可以用容器名字或者容器ID进入
3.配置
进入容器后,接下来就是设置go的env环境变量,首先用:
go env
既是为了验证go是否可以正常运行,也是为了查看下当前go的环境变量的情况
一般初始化下,go需要自定义设置的就三个GOPATH、GOPROXY和GO111MODULE
- GOPATH:go工作目录,也是以后代码存放的地方
- GOPROXY:go包下载代理地址,为了下载包快速所改
- GO111MODULE:允许go mod 包管理工具的使用
三行代码解决!!
go env -w GO111MODULE=on #开启go mod go env -w GOPROXY="https://goproxy.cn" go env -w GOPATH="/go" #如果本身就是,那就不需要再改了,可以省略
查看下,再次 go env,是否已修改为设置的这样
自此,所有设置都完成,为了以后不重复进行设置,我们保存容器生成我们自己部署好的go环境镜像:
docker commit 24bbe43 golang-local
我将此容器重新打包为一个新的镜像,命名为golang-local,以后只要开启这个镜像,我就可以跑go代码了,当然,也可以将它传到远程hub库,用于整个项目组的基本环境搭建使用,以后协同开发的镜像都是统一的,生产也可以使用。
远程库建议使用阿里云的,具体的可以自行百度,这里就不展开了
好了,现在 docker images就可以查看到我打包的新的golang镜像,这也为后续与本机代码的使用奠定基础,接下来就是最关键的一步了。
4.运行
以上所有的步骤都是在docker里完成的,那么我们的本机与docker之间还存在着隔阂,本机放置的代码依然无法使用go环境,因为本机没有安装go,这个时候就需要用到docker经典的东东——挂载容器卷,将本地的目录与docker的容器关联起来,达到本地修改容器内的文件也可以同步修改,开始!!
先关闭之前的golang容器,docker stop 24bbe43
,因为我们不需要用到它了!
然后开启我们新镜像
docker run -itd -p 8080:8080 -v /Users/jay/go/project:/go --name golang-1.18.1 golang-local
解释下关键的命令参数:
- -p:端口映射,将docker的端口映射到本机端口,我们用8080
- -v:挂载容器卷,冒号前面是本机的地址,后面是容器内存放地址,这里需要看你本地想放哪里,任意位置都可以,前提是需要写绝对路径,注意啊,我加粗字体了。
- –name:容器别名,我主要是为以后多版本处理的话,可以看到当前容器的go版本,所以这么写,这个可以省略
好了,这样就开启了,至于说为什么是用8080,这个不需要固定,可以任意改你想要的端口号,也有个前提,与本地应用软件的使用端口不要冲突!!!
我用8080是因为我的goweb服务框架gin的默认端口就是8080,方便使用
接下来就是用gin来验证环境好不好用了
5.完成
在我的工作目录/Users/jay/go/project下,
建一个项目,就叫gin-demo吧,
然后进入gin-demo,创建一个main.go文件,
写上:
package main import ( "fmt" ) func main() { fmt.Println("Hello, Go.") }
回到容器里查看下,对应的/go目录下是不是也存在相同的文件了,做个验证
然后开始,在容器里操作,
进入到gin-demo目录下,
先验证下go代码能不能跑起来
go run main.go
出现Hello,Go. 说明正常可以跑代码了,到此处,go环境算是搭建完了。
因为我需要用的是gin框架,所以接下的事情就是gin框架的使用
go mod init
创建go.mod文件,
然后将main.go的内容改为以下:
package main import "github.com/gin-gonic/gin" func main() { r := gin.Default() r.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong", }) }) r.Run() }
最后一步,go run main.go
跑起来!!
接下来就是见证奇迹的时刻
打开浏览器,输入localhost:8080,回车!
浏览器上显示 pong,成功!
PS:go的代码运行还是需要在容器里操作,如果不想来回进出容器折腾,可以用go的一个fresh包,自动捕获代码变动重新打包运行,本地就可以快乐的写代码了,这个插件百度查下就行,这里分享一下包地址,就不细说了,我个人习惯自己去重启,比较不容易出错
go热重启go get github.com/pilu/fresh
运行 fresh 命令 ,fresh 将会自动运行项目的 main.go
到这里就结束了,个人觉得还是稍有不便,以后再整理出一份用dockerfile来部署的办法,那样就方便多了一运行就可以了,到哪都能用。
总结
以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。
-
335 收藏
-
178 收藏
-
295 收藏
-
306 收藏
-
291 收藏
-
165 收藏
-
473 收藏
-
377 收藏
-
384 收藏
-
246 收藏
-
110 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 507次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习
-
- 如意的蜗牛
- 这篇文章太及时了,太详细了,写的不错,mark,关注大佬了!希望大佬能多写Golang相关的文章。
- 2023-02-13 22:37:01
-
- 含蓄的花卷
- 赞 👍👍,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢老哥分享技术文章!
- 2023-02-07 21:48:05
-
- 动听的发夹
- 这篇文章内容真是及时雨啊,太全面了,很有用,码起来,关注up主了!希望up主能多写Golang相关的文章。
- 2023-01-20 12:55:17
-
- 曾经的百褶裙
- 这篇技术文章真是及时雨啊,师傅加油!
- 2023-01-11 23:56:42
-
- 粗犷的金针菇
- 很详细,码起来,感谢作者大大的这篇文章,我会继续支持!
- 2022-12-28 14:38:09
-
- 成就的书包
- 真优秀,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢楼主分享文章!
- 2022-12-26 19:05:06