1. 程式人生 > >基於gin的golang web開發:docker

基於gin的golang web開發:docker

Golang天生適合執行在```docker```容器中,這得益於:```Golang```的靜態編譯,當在編譯的時候關閉```cgo```的時候,可以完全不依賴系統環境。 ### 一些基礎 測試容器時我們經常需要進入容器檢視執行情況,以下命令啟動一個centos容器並進入bash互動環境。 ``` docker run -it --rm centos bash ``` **-it** 組合引數-i: 以互動模式執行容器,-t: 為容器重新分配一個偽輸入終端。 **--rm** 在容器退出時就能夠自動清理容器。 alpine映象中沒有bash,啟動容器並進入終端的命令為 ```golang docker run -it --rm alpine sh ``` 啟動一個golang編譯環境並進入bash ``` docker run -it -p 8081:8081 -v ./project:/app --env --env GO111MODULE=on --env GOPROXY=https://goproxy.cn,direct --rm --privileged golang:1.15 bash ``` **-v ./project:/app** 繫結本機專案的路徑對映到容器中/app **--env** 設定環境變數,由於我們網路環境的問題直接使用golang容器會很慢所以設定了GOPROXY=https://goproxy.cn,direct。 **--privileged** 容器內的root擁有真正的root許可權,否則容器內root只是外部的一個普通使用者。 **-p 8081:8001** 將本機的8081埠對映到容器的8001埠 ### docker打包專案 為了方便演示docker,我們準備一個簡單Gin專案。要注意```r.Run```不能繫結127.0.0.1。 ```golang func main() { r := gin.Default() r.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong", }) }) r.Run("0.0.0.0:9999") } ``` 啟動golang容器,在容器中嘗試編譯並執行程式。 ``` docker run -it -p 9999:9999 -v ./project:/app --env --env GO111MODULE=on --env GOPROXY=https://goproxy.cn,direct --rm --privileged golang:1.15 bash ``` Alpine和其他通用Linux發行版對於Golang編譯出來的可執行檔案要求有所不同,Alpine要求可執行檔案必須是靜態連結的可執行檔案。所以在編譯Golang時需要新增 -tags netgo ,來生成靜態連結的可執行檔案。 ```bash go build -tags netgo -o app . ``` 把編譯出來的二進位制檔案和所有依賴項拷貝到釋出目錄 ``` mkdir publish && cp app publish && \ cp -r docs publish ``` golang映象的1.15版本有839M,再加上下載依賴編譯專案等各種檔案的話最終映象可能會超過1G,大部分檔案是在執行時不需要的。我們編寫Dockerfile的時候可以把編譯和執行兩個階段分開。編譯時使用golang映象,執行時使用alpine映象。alpine映象初始大小隻有5M左右,非常適合作為基礎映象。最終Dockerfile如下 ``` FROM golang:1.15 as builder ENV GO111MODULE=on \ GOPROXY=https://goproxy.cn,direct WORKDIR /app COPY . . RUN GOOS=linux GOARCH=amd64 go build -tags netgo -o app . RUN mkdir publish && cp app publish && \ cp -r docs publish FROM alpine WORKDIR /app COPY --from=builder /app/publish . ENV GIN_MODE=release \ PORT=8081 EXPOSE 8081 ENTRYPOINT ["./app"] ``` 構建docker映象,大功告成。 ``` docker build -t test:0.1 . ``` 文章出處:[基於gin的golang web開發:docker][source] [source]: https://www.huaface.com/arti