五分鍾用Docker快速搭建Go開發環境


挺早以前在我寫過一篇用 Docker搭建LNMP開發環境的文章:用Docker搭建Laravel開發環境,里面詳細介紹了將 nginxmysqlphp三個容器用 docker-compose編排成 LNMP開發環境的步驟,今天來說說怎么用 Docker快速搭建 Go語言項目的開發環境。

因為靠Go本身自帶的標准庫就能實現高性能的 HTTP服務器,不熟悉的同學買它,呃說錯了,看它:深入學習用Go編寫HTTP服務器。所以用 Docker 構建 Go的開發環境比構建 LNMP 開發環境要簡單很多,如果沒有太多定制化要求甚至都不用寫 Dockerfile自己構建鏡像,直接使用官方的 golang鏡像即可。

獲取Docker鏡像

我們使用官方最新穩定版的鏡像 golang:latest, 獲取鏡像前先得確保你電腦上運行了 Docker 客戶端,沒有的去官網下載一下吧這里就不多說了。

下載dockerHub上的鏡像直接使用命令:

docker pull golang
復制代碼

下載完鏡像后用鏡像運行一個容器:

docker run --rm -it --name go-http-demo golang bash

上面這個命令用鏡像 golang創建了一個名為 go-http-demo的容器,在容器中創建了一個 Bash會話。--rm選項指定容器退出后自動移除容器。

運行完上面的命令后我們就進入了運行的容器中,運行 go version 查看以下 go的版本:

root@965425c5bdcf:/go# go version go version go1.13.6 linux/amd64 root@965425c5bdcf:/go# 

你可以根據自己的需要在https://hub.docker.com/_/golang 中查找自己需要的版本的 golang鏡像運行容器。

在容器中運行Go項目

我們使用《深入學習用Go編寫HTTP服務器》中最后寫的支持優雅關停服務的 HTTPServer的源碼,將它放到 Docker容器里伺服宿主機的請求。HTTP Server的源碼如下,想探究代碼具體怎么實現的看鏈接里的文章就好了。

package main import ( "context" "fmt" "log" "net/http" "os" "os/signal" "syscall" ) func main() { mux := http.NewServeMux() mux.Handle("/", &helloHandler{}) server := &http.Server{ Addr: ":8080", Handler: mux, } // 創建系統信號接收器 done := make(chan os.Signal) signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) go func() { <-done if err := server.Shutdown(context.Background()); err != nil { log.Fatal("Shutdown server:", err) } }() log.Println("Starting HTTP server...") err := server.ListenAndServe() if err != nil { if err == http.ErrServerClosed { log.Print("Server closed under request") } else { log.Fatal("Server closed unexpected") } } } type helloHandler struct{} func (*helloHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello World") }

把源碼放在本地電腦的 /Code/go/src/example.com/http-demo/main.go中,文件目錄你們做的時候根據自己的情況寫路徑。

接下來就要把這個代碼放到容器里去運行了,切到代碼目錄里執行如下命令:

docker run --rm -it --name go-http-demo \
  -v $PWD:/go/src/example.com/go-http-demo \ -p 8000:8080 golang

-v選項允許我們掛載多個本地目錄或者數據卷到容器中,更改會在容器內外相互同步,上面的命令將 /Code/go/src/example.com/go-http-demo/掛載到了容器的 /go/src/example.com/go-http-demo

-p指定主機和容器的端口映射,因為代碼里 HTTP服務是監聽 8080端口的,所以我們將主機的 8000端口和容器的 8080端口做了映射。

執行完上面的命令,我們切換到到容器里的 Bash會話,切到代碼目錄運行 go run main.go后,在自己的電腦上打開瀏覽器訪問 http:localhost:8080看到下圖中的頁面就證明服務器在容器里已經正常運行起來了。

 

 

用 docker-compose 管理容器

通過上面的內容我們已經用 Docker構建好了一個 Go的開發環境,不過每次打那堆命令,還要進容器執行 go命令啟動程序太費事了,我們用 docker-compose把上面那些流程自動化一下。

在項目代碼根目錄創建docker-compose.yml

version: '3' services: app: image: golang:latest working_dir: /go/src/example.com/http_demo volumes: - /$GOPATH/src/example.com/http_demo:/go/src/example.com/http_demo - /$GOPATH/src:/go/src ports: - "8000:8080" environment: WORKING_DIR: /go/src/example.com/http_demo command: go run /go/src/example.com/http_demo/main.go

如果你們項目里不允許就找個目錄放這個文件,我自己就是單獨有個目錄里面放了好幾個項目的 Docker配置文件,有 PHP項目的也有 Go項目的。

上面的編排文件里只定義了一個叫 app的服務,其他的也很容易理解我就不說了,唯一要注意的一點就是如果 yml文件在項目外 volumes里的配置就換成絕對路徑不要用 $PWD

接下來啟動 docker-compose:

docker-compose up -d

如果啟動不成功先不要在 daemon模式下運行把 -d去掉,就能看到具體什么錯誤,等調試正常了再后台啟動。

代碼有修改后,需要重新編譯項目,針對我們的容器執行下面的命令即可

docker-compose restart

想要進入運行的容器中執行操作使用命令:

docker exec -it <container name> bash

給我們創建的 app發送 go test命令讓它在容器內執行:

docker-compose exec app go test

最近想嘗試把老項目換成用 go mod管理,項目還是在用 go1.12所以我就先用 Docker搭環境,容器隔離的環境怎么瞎折騰也沒事。今天做的這個開發環境還是很簡單的,沒有用 Dockerfile自己創建鏡像, docker-compose配置文件里的設置也很簡單,后面用着不順手有更新了我再推送。下面的兩篇老文章對 Docker鏡像和 docker-compose講的都比較深入,例子也多,感興趣的可以看看。

教你如何做出想要的PHPDocker鏡像

用Docker搭建Laravel開發環境

關注公眾號回復 go-docker 可以獲取安裝指南,實踐時遇到問題也歡迎私信勾搭。


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM