首頁 > 軟體

本地使用Docker搭建go開發環境的全過程

2022-07-20 14:02:51

前言

對於我這種小白來說,本地環境搭建常規的操作一向是直接去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來部署的辦法,那樣就方便多了一執行就可以了,到哪都能用。

總結

到此這篇關於本地使用Docker搭建go開發環境的文章就介紹到這了,更多相關Docker搭建go開發環境內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com