使用 Docker 来部署 Go 程序

未匹配的标注

本文为官方 Go Blog 的中文翻译,详见 翻译说明

Andrew Gerrand
2014 年 9 月 26 日

介绍

本周 Docker 宣布用于 Go 和其他主要语言的官方基础映像, 使程序员值得信赖一种简单的方法来为其 Go 程序构建容器.

在本文中, 我们将逐步介绍为简单的 Go Web 应用程序创建 Docker 容器并将该容器部署到 Google Compute Engine 的方法. 如果您不熟悉 Docker, 请在继续阅读之前阅读 了解 Docker.

演示应用

在我们的演示中, 我们将使用 Go 示例存储库 中的 outyet 程序, 这是一个简单的网络服务器, 可以报告 Go 的下一版本是否已发布 (设计用于 isgo1point4.outyet.org 之类的网站). 它没有标准库之外的依赖项, 并且在运行时不需要其他数据文件. 作为 Web 服务器, 它非常简单.

使用 "go get" 可在 工作区 中获取并安装成品:

$ go get github.com/golang/example/outyet

编写 Dockerfile

用以下内容替换 outyet 目录中名为 Dockerfile 的文件:

# 从安装最新版本 Go 的 Debian 映像开始
# 并在 /go 中配置工作区(GOPATH).
FROM golang

# 将本地包文件复制到容器的工作区.
ADD . /go/src/github.com/golang/example/outyet

# 在容器内构建 outyet 命令.
# (您可以在此处获取或管理依赖项,
# 手动或使用 "godep" 之类的工具.
RUN go install github.com/golang/example/outyet

# 容器启动时, 默认运行 outyet 命令.
ENTRYPOINT /go/bin/outyet

# 该服务在监听 8080 端口.
EXPOSE 8080

这个 Dockerfile 指定了从基本依赖项 (安装了 Go 的 Debian 系统; 官方 golang docker 镜像) 开始构建一个运行 outtet 的容器的方法. 添加 outyet 程序包源, 进行构建, 然后最终运行它.

ADD, RUNENTRYPOINT 步骤是任何 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在外部端口6060上发布容器的端口8080

--name 标志为我们的容器提供了可预测的名称,使其更易于使用。

 --rm 标志告诉docker在outyet服务器退出时删除容器映像。

在容器运行的情况下,在Web浏览器中打开http://localhost:6060/,您应该会看到类似以下内容:

(如果您的Docker守护程序正在另一台机器(或虚拟机)上运行,则应使用该机器的地址替换localhost。如果使用的是[boot2docker](http:/// boot2docker。 io /)在OS X或Windows上,您可以使用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,并看到"Has Go 1.4 been released yet?"页。

(要查看新VM实例上发生了什么,您可以使用gcloudcompute ssh outyet ssh到其中。从那里,尝试sudo docker ps来查看哪些docker容器在运行。

了解更多

这只是冰山一角,而Go,Docker和Google Compute Engine可以做的还很多。

要了解有关Docker的更多信息,请参阅其扩展文档

要了解有关Docker和Go的更多信息,请参阅官方golang Docker Hub存储库和Kelsey Hightower的优化静态Docker映像转到二进制文件

要了解有关Docker和Google Compute Engine的更多信息,请参阅容器优化的虚拟机页面google/docker-registry Docker Hub存储库

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/go-blog/docker/...

译文地址:https://learnku.com/docs/go-blog/docker/...

上一篇 下一篇
Summer
贡献者:3
讨论数量: 0
发起讨论 只看当前版本


暂无话题~