網站首頁 編程語言 正文
前言
對于我這種小白來說,本地環境搭建常規的操作一向是直接去go官網下載go安裝包,本機進行安裝,然后配置相應的GOROOT和GOPATH,再將GOPROXY和GO111MODULE設置完成,本地跑一下go env,可以正常使用就OK了。
不過,自從學習了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來部署的辦法,那樣就方便多了一運行就可以了,到哪都能用。
總結
原文鏈接:https://blog.csdn.net/weixin_42687353/article/details/124656022
相關推薦
- 2023-12-25 前后端驗證碼分析(字母&計算)
- 2022-11-20 C#?崩潰異常中研究頁堆布局的詳細過程_C#教程
- 2022-09-23 C#實現目錄跳轉(TreeView和SplitContainer)的示例代碼_C#教程
- 2022-06-07 詳解ASP.NET?Core高性能服務器HTTP.SYS_實用技巧
- 2022-12-31 C++?Boost?Uuid超詳細講解_C 語言
- 2022-07-25 Python文件操作實戰案例之用戶登錄_python
- 2023-10-16 Nginx啟動,重啟以及基本命令
- 2022-12-29 Kotlin?協程思維模型的引入使用建立_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支