閱讀530 返回首頁    go 阿裏雲 go 技術社區[雲棲]


如何在 Docker 中設置 Go 並部署應用

嗨,在本教程中,我們將學習如何使用 docker 部署 golang web 應用程序。 你可能已經知道,由於 golang 的高性能和可靠性,docker 是完全是用 golang 寫的。在我們詳細介紹之前,請確保你已經安裝了 docker 以及 golang 並對它們有基本了解。

關於 docker

Docker 是一個開源程序,它可以將應用及其完整的依賴包捆綁到一起,並打包為容器,與宿主機共享相同的 Linux 內核。另一方麵,像 VMware 這樣的基於 hypervisor 的虛擬化操作係統容器提供了高級別的隔離和安全性,這是由於客戶機和主機之間的通信是通過 hypervisor 來實現的,它們不共享內核空間。但是硬件仿真也導致了性能的開銷,所以容器虛擬化誕生了,以提供一個輕量級的虛擬環境,它將一組進程和資源與主機以及其它容器分組及隔離,因此,容器內部的進程無法看到容器外部的進程或資源。

用 Go 語言創建一個 “Hello World” web 應用

首先我們為 Go 應用創建一個目錄,它會在瀏覽器中顯示 “Hello World”。創建一個 web-app 目錄並使它成為當前目錄。進入 web-app 應用目錄並編輯一個名為 main.go 的文件。


  1. root@demohost:~# mkdir web-app
  2. root@demohost:~# cd web-app/
  3. root@demohost:~/web-app# vim.tiny main.go
  4. package main
  5. import (
  6. "fmt"
  7. "net/http"
  8. )
  9. func handler(w http.ResponseWriter, r *http.Request) {
  10. fmt.Fprintf(w, "Hello %s", r.URL.Path[1:])
  11. }
  12. func main() {
  13. http.HandleFunc("/World", handler)
  14. http.ListenAndServe(":8080", nil)
  15. }

使用下麵的命令運行上麵的 “Hello World” Go 程序。在瀏覽器中輸入https://127.0.0.1:8080/World 測試,你會在瀏覽器中看到 “Hello World”。


  1. root@demohost:~/web-app# PORT=8080 go run main.go

下一步是將上麵的應用在 docker 中容器化。因此我們會創建一個 dockerfile 文件,它會告訴 docker 如何容器化我們的 web 應用。


  1. root@demohost:~/web-app# vim.tiny Dockerfile
  2. # 得到最新的 golang docker 鏡像
  3. FROM golang:latest
  4. # 在容器內部創建一個目錄來存儲我們的 web 應用,接著使它成為工作目錄。
  5. RUN mkdir -p /go/src/web-app
  6. WORKDIR /go/src/web-app
  7. # 複製 web-app 目錄到容器中
  8. COPY . /go/src/web-app
  9. # 下載並安裝第三方依賴到容器中
  10. RUN go-wrapper download
  11. RUN go-wrapper install
  12. # 設置 PORT 環境變量
  13. ENV PORT 8080
  14. # 給主機暴露 8080 端口,這樣外部網絡可以訪問你的應用
  15. EXPOSE 8080
  16. # 告訴 Docker 啟動容器運行的命令
  17. CMD ["go-wrapper", "run"]

構建/運行容器

使用下麵的命令構建你的 Go web-app,你會在成功構建後獲得確認。


  1. root@demohost:~/web-app# docker build --rm -t web-app .
  2. Sending build context to Docker daemon 3.584 kB
  3. Step 1 : FROM golang:latest
  4. latest: Pulling from library/golang
  5. 386a066cd84a: Already exists
  6. 75ea84187083: Pull complete
  7. 88b459c9f665: Pull complete
  8. a31e17eb9485: Pull complete
  9. 1b272d7ab8a4: Pull complete
  10. eca636a985c1: Pull complete
  11. 08158782d330: Pull complete
  12. Digest: sha256:02718aef869a8b00d4a36883c82782b47fc01e774d0ac1afd434934d8ccfee8c
  13. Status: Downloaded newer image for golang:latest
  14. ---> 9752d71739d2
  15. Step 2 : RUN mkdir -p /go/src/web-app
  16. ---> Running in 9aef92fff9e8
  17. ---> 49936ff4f50c
  18. Removing intermediate container 9aef92fff9e8
  19. Step 3 : WORKDIR /go/src/web-app
  20. ---> Running in 58440a93534c
  21. ---> 0703574296dd
  22. Removing intermediate container 58440a93534c
  23. Step 4 : COPY . /go/src/web-app
  24. ---> 82be55bc8e9f
  25. Removing intermediate container cae309ac7757
  26. Step 5 : RUN go-wrapper download
  27. ---> Running in 6168e4e96ab1
  28. + exec go get -v -d
  29. ---> 59664b190fee
  30. Removing intermediate container 6168e4e96ab1
  31. Step 6 : RUN go-wrapper install
  32. ---> Running in e56f093b6f03
  33. + exec go install -v
  34. web-app
  35. ---> 584cd410fdcd
  36. Removing intermediate container e56f093b6f03
  37. Step 7 : ENV PORT 8080
  38. ---> Running in 298e2a415819
  39. ---> c87fd2b43977
  40. Removing intermediate container 298e2a415819
  41. Step 8 : EXPOSE 8080
  42. ---> Running in 4f639a3790a7
  43. ---> 291167229d6f
  44. Removing intermediate container 4f639a3790a7
  45. Step 9 : CMD go-wrapper run
  46. ---> Running in 6cb6bc28e406
  47. ---> b32ca91bdfe0
  48. Removing intermediate container 6cb6bc28e406
  49. Successfully built b32ca91bdfe0

現在可以運行我們的 web-app 了,可以執行下麵的命令。


  1. root@demohost:~/web-app# docker run -p 8080:8080 --name="test" -d web-app
  2. 7644606b9af28a3ef1befd926f216f3058f500ffad44522c1d4756c576cfa85b

進入 https://localhost:8080/World 瀏覽你的 web 應用。你已經成功容器化了一個可重複的/確定性的 Go web 應用。使用下麵的命令來啟動、停止並檢查容器的狀態。


  1. ### 列出所有容器
  2. root@demohost:~/ docker ps -a
  3. ### 使用 id 啟動容器
  4. root@demohost:~/ docker start CONTAINER_ID_OF_WEB_APP
  5. ### 使用 id 停止容器
  6. root@demohost:~/ docker stop CONTAINER_ID_OF_WEB_APP

重新構建鏡像

假設你正在開發 web 應用程序並在更改代碼。現在要在更新代碼後查看結果,你需要重新生成 docker 鏡像、停止舊鏡像並運行新鏡像,並且每次更改代碼時都要這樣做。為了使這個過程自動化,我們將使用 docker 卷在主機和容器之間共享一個目錄。這意味著你不必為在容器內進行更改而重新構建鏡像。容器如何檢測你是否對 web 程序的源碼進行了更改?答案是有一個名為 “Gin” 的好工具https://github.com/codegangsta/gin,它能檢測是否對源碼進行了任何更改,然後重建鏡像/二進製文件並在容器內運行更新過代碼的進程。

要使這個過程自動化,我們將編輯 Dockerfile 並安裝 Gin 將其作為入口命令來執行。我們將開放 3030端口(Gin 代理),而不是 8080。 Gin 代理將轉發流量到 web 程序的 8080 端口。


  1. root@demohost:~/web-app# vim.tiny Dockerfile
  2. # 得到最新的 golang docker 鏡像
  3. FROM golang:latest
  4. # 在容器內部創建一個目錄來存儲我們的 web 應用,接著使它稱為工作目錄。
  5. RUN mkdir -p /go/src/web-app
  6. WORKDIR /go/src/web-app
  7. # 複製 web 程序到容器中
  8. COPY . /go/src/web-app
  9. # 下載並安裝第三方依賴到容器中
  10. RUN go get github.com/codegangsta/gin
  11. RUN go-wrapper download
  12. RUN go-wrapper install
  13. # 設置 PORT 環境變量
  14. ENV PORT 8080
  15. # 給主機暴露 8080 端口,這樣外部網絡可以訪問你的應用
  16. EXPOSE 3030
  17. # 啟動容器時運行 Gin
  18. CMD gin run
  19. # 告訴 Docker 啟動容器運行的命令
  20. CMD ["go-wrapper", "run"]

現在構建鏡像並啟動容器:


  1. root@demohost:~/web-app# docker build --rm -t web-app .

我們會在當前 web 程序的根目錄下運行 docker,並通過暴露的 3030 端口鏈接 CWD (當前工作目錄)到容器中的應用目錄下。


  1. root@demohost:~/web-app# docker run -p 3030:3030 -v `pwd`:/go/src/web-app --name="test" -d web-app

打開 https://localhost:3030/World, 你就能看到你的 web 程序了。現在如果你改變了任何代碼,會在瀏覽器刷新後反映在你的瀏覽器中。

總結

就是這樣,我們的 Go web 應用已經運行在 Ubuntu 16.04 Docker 容器中運行了!你可以通過使用 Go 框架來快速開發 API、網絡應用和後端服務,從而擴展當前的網絡應用。

原文發布時間為:2017-01-12

本文來自雲棲社區合作夥伴“Linux中國”

最後更新:2017-05-31 10:31:59

  上一篇:go  Ansible 起步指南
  下一篇:go  5 個找出“二進製命令”描述和係統中位置的方法