Go 部落格

使用 Docker 部署 Go 伺服器

Andrew Gerrand
2014 年 9 月 26 日

引言

本週,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 軟體包源,構建它,最後執行它。

ADDRUNENTRYPOINT 步驟是任何 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 提交到您在 GitHubBitBucket 上的倉庫,在 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
部落格索引