Go 部落格
使用 Docker 部署 Go 伺服器
引言
本週,Docker 宣佈了官方的 Go 和其他主要語言的基礎映象,為程式設計師提供了一種可信賴且簡單的方式來構建 Go 程式容器。
在本文中,我們將介紹一個用於建立簡單 Go Web 應用程式的 Docker 容器並將其部署到 Google Compute Engine 的教程。如果您不熟悉 Docker,請在繼續閱讀之前閱讀理解 Docker。
演示應用程式
在我們的演示中,我們將使用Go 示例程式碼庫中的outyet程式,這是一個簡單的 Web 伺服器,用於報告 Go 的下一個版本是否已釋出(旨在為isgo1point4.outyet.org等網站提供支援)。它除了標準庫外沒有其他依賴項,並且在執行時不需要額外的資料檔案;對於 Web 伺服器來說,它已經非常簡單了。
使用“go get”在您的工作區中獲取並安裝 outyet
$ go get golang.org/x/example/outyet
編寫 Dockerfile
將 outyet
目錄中的名為 Dockerfile
的檔案替換為以下內容:
# Start from a Debian image with the latest version of Go installed
# and a workspace (GOPATH) configured at /go.
FROM golang
# Copy the local package files to the container's workspace.
ADD . /go/src/golang.org/x/example/outyet
# Build the outyet command inside the container.
# (You may fetch or manage dependencies here,
# either manually or with a tool like "godep".)
RUN go install golang.org/x/example/outyet
# Run the outyet command by default when the container starts.
ENTRYPOINT /go/bin/outyet
# Document that the service listens on port 8080.
EXPOSE 8080
此 Dockerfile
指定了如何構建執行 outyet
的容器,從基本依賴項(安裝了 Go 的 Debian 系統;官方 golang
docker 映象)開始,新增 outyet
軟體包源,構建它,最後執行它。
ADD
、RUN
和 ENTRYPOINT
步驟是任何 Go 專案的常見任務。為了簡化這一點,golang
映象有一個onbuild
變體,它可以自動複製軟體包源、獲取應用程式依賴項、構建程式並將其配置為啟動時執行。
使用 onbuild
變體,Dockerfile
會更簡單
FROM golang:onbuild
EXPOSE 8080
構建並執行映象
在 outyet
軟體包目錄中呼叫 Docker 來使用 Dockerfile
構建映象。
$ docker build -t outyet .
這將從 Docker Hub 獲取 golang
基礎映象,將軟體包源複製到其中,在其中構建軟體包,並將生成的映象標記為 outyet
。
要執行由此生成的映象的容器
$ docker run --publish 6060:8080 --name test --rm outyet
--publish
標誌告訴 docker 將容器的埠 8080
暴露到外部埠 6060
。
--name
標誌為我們的容器提供一個可預測的名稱,以便於操作。
--rm
標誌告訴 docker 在 outyet 伺服器退出時刪除容器映象。
在容器執行時,在 Web 瀏覽器中開啟 https://:6060/
,您應該會看到類似這樣的內容:

(如果您的 docker 守護程式執行在另一臺機器上(或虛擬機器中),您應該將 localhost
替換為該機器的地址。如果您在 OS X 或 Windows 上使用boot2docker,您可以使用 boot2docker ip
找到該地址。)
現在我們已經驗證了映象有效,請從另一個終端視窗關閉正在執行的容器。
$ docker stop test
在 Docker Hub 上建立倉庫
Docker Hub,我們之前從中拉取 golang
映象的容器登錄檔,提供了稱為自動化構建的功能,該功能可以從 GitHub 或 BitBucket 倉庫構建映象。
透過將Dockerfile提交到倉庫併為其建立一個自動化構建,任何安裝了 Docker 的人都可以使用單個命令下載並執行我們的映象。(我們將在下一節中看到這一點的重要性。)
要設定自動化構建,請將 Dockerfile 提交到您在 GitHub 或 BitBucket 上的倉庫,在 Docker Hub 上建立一個帳戶,並按照建立自動化構建的說明進行操作。
完成後,您可以使用自動化構建的名稱來執行您的容器。
$ docker run goexample/outyet
(將 goexample/outyet
替換為您建立的自動化構建的名稱。)
將容器部署到 Google Compute Engine
Google 提供了容器最佳化 Google Compute Engine 映象,可以輕鬆地啟動執行任意 Docker 容器的虛擬機器。啟動時,例項上執行的程式會讀取一個配置檔案,該檔案指定要執行的容器、獲取容器映象並執行它。
建立一個 containers.yaml 檔案,該檔案指定要執行的 Docker 映象和要公開的埠。
version: v1beta2
containers:
- name: outyet
image: goexample/outyet
ports:
- name: http
hostPort: 80
containerPort: 8080
(請注意,我們將容器的埠 8080
作為外部埠 80
公開,這是用於提供 HTTP 流量的預設埠。同樣,您應該將 goexample/outyet
替換為您自動化構建的名稱。)
使用gcloud 工具建立一個執行容器的 VM 例項。
$ gcloud compute instances create outyet \
--image container-vm-v20140925 \
--image-project google-containers \
--metadata-from-file google-container-manifest=containers.yaml \
--tags http-server \
--zone us-central1-a \
--machine-type f1-micro
第一個引數(outyet
)指定例項名稱,這是一個方便的管理標籤。
--image
和 --image-project
標誌指定要使用的特殊容器最佳化系統映象(請按原樣複製這些標誌)。
--metadata-from-file
標誌將您的 containers.yaml
檔案提供給 VM。
--tags
標誌將您的 VM 例項標記為 HTTP 伺服器,調整防火牆以在公共網路介面上公開埠 80。
--zone
和 --machine-type
標誌指定執行 VM 的區域和執行的機器型別。(要檢視機器型別和區域列表,請執行 gcloud compute machine-types list
。)
完成後,gcloud 命令應列印有關例項的一些資訊。在輸出中,找到 networkInterfaces
部分以查詢例項的外部 IP 地址。幾分鐘後,您應該能夠使用 Web 瀏覽器訪問該 IP 地址,並看到“Go 1.4 是否已釋出?”頁面。
(要檢視新 VM 例項上的情況,您可以使用 gcloud compute ssh outyet
SSH 進入它。從那裡,嘗試 sudo docker ps
檢視正在執行的 Docker 容器。)
瞭解更多
這只是冰山一角——您還可以用 Go、Docker 和 Google Compute Engine 做更多的事情。
要了解更多關於 Docker 的資訊,請參閱其詳盡文件。
要了解更多關於 Docker 和 Go 的資訊,請參閱官方 golang
Docker Hub 倉庫以及 Kelsey Hightower 的為靜態 Go 二進位制檔案最佳化 Docker 映象。
要了解更多關於 Docker 和Google Compute Engine的知識,請參閱容器最佳化 VM 頁面以及google/docker-registry Docker Hub 倉庫。
下一篇文章:Go at Google I/O and Gopher SummerFest
上一篇文章:Constants
部落格索引