内容


使用 Docker 和 Bluemix 容器化 golang 应用程序

创建和部署一个受 Swift Object Storage 支持的容器化的 golang 相册 Web 应用程序

Comments

Docker 不仅适用于 DevOps。缜密地使用个人监护的 Docker 容器,可以使通晓多种语言的现代开发人员的工作变得轻松有趣。我的配套教程 “Docker:带给现代开发人员的福利” 展示了 Docker 如何帮助您在几秒内完成在 Node.js、Java EE、Python 和 NoSQL 应用程序开发之间的切换,完全不需要让您宝贵的开发工作站变得一团糟。Docker 为您提供了超高的敏捷性,消除了单调的任务,改进了您的每日开发工作流中的生产力。

本教程通过向组合中添加一个使用 Go 编程语言 (golang) 编写的高性能、编译为二进制的 Web 应用程序 — 一个相册— 为您带来进一步的福利。您将在几秒内获得一个正常运行的 golang 开发和测试环境,而无需将 golang 安装在您的工作站上。而且您将会看到如何使用官方的 golang Docker 容器来管理 golang 应用程序依赖项和编译 golang 应用程序。

此外,golang 基于 web 的相册应用程序兼容 OpenStack Swift Object Storage。只需几秒钟,您就可以在系统上运行一个 OpenStack Swift 实现来测试这个相册应用程序 —而不需要通常与 OpenStack 设置关联的几小时容易出错的下载和配置。

最后但同样重要的是,您将通过 IBM Containers for Bluemix 将完成的 Docker 化 golang 相册应用程序部署到 IBM Bluemix™,并将它与 Bluemix Object Storage 服务的一个实例连接。

借助 IBM Containers for Bluemix,您的容器化应用程序可以破纪录的效率从开发过渡到测试,再过渡到扩展的基于云的生产部署。

需要的准备工作

如果还没有 Bluemix 帐户,则注册一个。此外,在开始学习本教程之前,您需要满足以下前提条件。

软件

背景读物

运行应用程序获取代码

单击运行应用程序按钮试用已完成的应用程序,它在 IBM Containers for Bluemix 上针对 Object Storage 服务所管理的存储而运行。在这个版本中,禁用了照片上传,以限制归档的大小。您自己的部署将没有此限制。

第 1 步. 下载需要的 Docker 映像

运行以下命令来将本教程中使用的 Docker 映像下载到您的本地 PC 上:

docker pull golang:1.4

docker pull morrisjobke/docker-swift-onlyone

docker pull pallet/swiftclient

docker pull busybox

第 2 步. 克隆 golang 照片归档的代码存储库

将项目源代码克隆到您的本地 PC:

git clone https://github.com/sing-li/dockergophoto.git

在浏览代码时,请注意它依赖于另外 3 个 GitHub 存储库:

第 3 步. 添加 gophoto 应用程序的依赖项

golang 编译为二进制代码。但在成功编译之前,必须解决所有依赖项:

  1. 使用官方 golang Docker 容器将 gophoto 的依赖项下载到 gopath 子目录(将以下每条命令键入为一行):

    docker run --rm --net="host" -v "$PWD":/usr/src/myapp -v "$PWD/gopath":/go -w /usr/src/myapp golang:1.4 go get github.com/codegangsta/martini

    docker run --rm --net="host" -v "$PWD":/usr/src/myapp -v "$PWD/gopath":/go -w /usr/src/myapp golang:1.4 go get github.com/codegangsta/martini-contrib/render

    docker run --rm --net="host" -v "$PWD":/usr/src/myapp -v "$PWD/gopath":/go -w /usr/src/myapp golang:1.4 go get github.com/ncw/swift

    请注意,gopath 子目录在容器内映射为 /go。在运行时,该容器有一个指向 /go 的 GOPATH 环境变量。

  2. 运行 ls -R gopath。该命令输出可确认所有依赖项都已下载到 gopath 子目录下:

    gopath:
    pkg src

    gopath/pkg:
    linux_amd64

    gopath/pkg/linux_amd64:
    github.com

    ...

第 4 步. 编译代码

可以注意到依赖项已就位,将应用程序编译为二进制代码(将该命令键入为一行):

docker run --rm --net="host" -v "$PWD":/usr/src/myapp -v "$PWD/gopath":/go -w /usr/src/myapp golang:1.4 go build gophoto.go

这会生成 gophoto 可执行程序,您将会测试它。但在测试它之前,必须有一个 OpenStack Swift Object Storage 服务。

第 5 步. 在本地运行 OpenStack Swift Object Storage 服务来执行测试

使用来自 Docker Hubdocker-swift-onlyone 映像来快速启动一个 OpenStack Swift Object Storage 服务用于测试:

docker run -d -v $PWD/data:/srv --name SWIFT_DATA busybox

docker run -d -p 12345:8080 --volumes-from SWIFT_DATA -t morrisjobke/docker-swift-onlyone

您现在可以在 localhost:12345 上访问 Object Storage 服务。

第 6 步. 创建一个 Object Storage 容器来保存照片

gophoto 应用程序需要一个名为 myphotos 的 Object Storage 容器(不要与 Docker 容器混淆)来存储相册的所有照片。使用 swiftclient Docker 映像创建这个 Object Storage 容器(将该命令键入为一行):

docker run -it --rm --net="host" pallet/swiftclient swift -A http://127.0.0.1:12345/auth/v1.0 -U test:tester -K testing post myphotos

第 7 步. 在本地测试 gophoto 应用程序

您现在拥有:

  • 在当前目录中包含从 gophoto.go 编译得到的 gophoto golang 程序二进制文件
  • 一个在 http://127.0.0.1:12345/ 上运行的 OpenStack Swift Object Storage 服务
  • 一个名为 myphotos 的 OpenStack Swift Object Storage 容器

有了这些资源,您就可以在本地测试该应用程序了:

  1. 运行 ./gophoto 来启动 gophoto 应用程序。如果所有部分都按预期运行,您可以看到一条包含用于访问归档文件的凭据的控制台日志,以及表明应用程序现在正在端口 3000 上监听的状态消息: 该屏幕截图显示应用程序正在端口 3000 上监听
    该屏幕截图显示应用程序正在端口 3000 上监听
  2. 启动一个浏览器并访问 http://localhost:3000/。可以看到相册应用程序正在运行(相册中还没有照片): 该屏幕截图显示相册应用程序正在运行
    该屏幕截图显示相册应用程序正在运行
  3. 单击左上角的按钮,上传一些照片(在源代码的 photos 目录中找到一些例子)并翻阅存储的照片: 该屏幕截图显示了存储的照片
    该屏幕截图显示了存储的照片

在应用程序开发期间,您可以通过重新编译(参阅 第 4 步)并针对 swift-only-one 服务实例运行该应用程序,快速修改代码并测试它。

您现在已在本地测试了 gophoto 应用程序。您差不多已准备好使用 IBM Containers for Bluemix 将它部署到 Bluemix。

第 8 步. 在本地构建一个容器化的应用程序映像

目前为止,您使用的是经过专业监护的 Docker 映像,但还未创建自己的映像。现在您需要构建一个简单的映像,以通过 IBM Containers for Bluemix 将 gophoto 应用程序部署为容器化的应用程序。

  1. 终止任何仍在您的 PC 上运行的容器,比如 docker-swift-onlyone。以超级用户身份删除 docker-swift-onlyone 容器的数据目录。
  2. 登录到 Bluemix:

    cf login

  3. 登录到容器扩展(这样才能访问私有容器存储库):

    cf ic login

  4. 检查源代码中的 Dockerfile,可以注意到它将:
    • 将准备运行的 gophoto 二进制代码从主机系统复制到映像中的 /goapp 目录
    • 将 public 目录复制到映像中
    • 将 tmpl 目录复制到映像中
    • 在容器启动时以可执行程序形式运行 /goapp/gophoto
  5. 从源代码的根目录运行此命令来构建 Dockerfile:

    docker build -t mygophoto:v1 .

    该命令在您的本地存储库中创建 Docker 映像。

  6. 要确认该映像现在已在您本地系统上,可运行:

    docker images

第 9 步. 在本地测试映像

部署的容器化的 gophoto 应用程序需要对 Bluemix Object Storage 服务的一个实例运行。在这一步中,您在 Bluemix 上创建一个实例,远程使用它来测试在您本地 PC 上运行的容器。稍后您会将同一个实例用于生产部署,所有资源都在 Bluemix 上运行。

  1. 创建 Object Storage 服务:

    cf create-service "Object-Storage" Free photoservice

    您可选择自己的服务名称来代替 photoservice
  2. 确认该服务已创建:

    cf services

    您创建的服务应在列表中。
  3. 登录到 Bluemix 仪表板。在左侧窗格上的服务列表中找到并选择您的新服务。
  4. 单击服务的左侧窗格中的 Manage,然后单击右侧的 Add a container 链接。将 Object Storage 容器命名为 myphotos。您将把照片上传到这个 Object Storage 容器。
  5. 单击服务的左侧窗格中的 Service Credentials,然后单击右侧的 Add Credentials 按钮。
  6. 添加一个凭据,将它命名为您想要的任何名称。复制并保存 credentials JSON 对象。
  7. 您需要设置的 V2CREDS 环境变量是您刚保存的 credentials JSON 对象的子集。使用这个命令测试该映像(键入为一行,将 auth_urldomainuseridpassword 设置为您保存的值 auth_urldomainNameuserNamepassword,而不是这里显示为斜体的值:

    docker run -p 3000:3000 --name testonly --env "V2CREDS={\"CloudIntegration\":{\"auth_url\":\"https://identity.open.softlayer.com\",\"domain\":\"7adaef92- aeffeed\",\"credentials\":{\"userid\":\"user_b0e399c05baa037c48ce321d95b769\",\"password\":\"nopassis232m\"}}}" mygophoto:v1

    此命令启动容器化的 gophoto 应用程序,它以您的 PC 作为主机,针对您之前创建的 Bluemix 上的远程 Object Storage 服务而运行。
  8. 尝试在浏览器中访问 http://localhost:3000/ 来访问正在运行的容器。
  9. 将一些照片上传到源代码的 photos 目录中。

第 10 步. 将经过测试的映像推送到您的私有 Bluemix 映像存储库

您的容器化的应用程序映像现在已测试。现在您将准备将该映像用于您的私有 Bluemix 容器存储库。(如果不知道您的应用程序的命名空间,可通过 cf ic namespace get 获取它。)

  1. 使用私有存储库的名称来标记该映像:

    docker tag mygophoto:v1 registry.ng.bluemix.net/您的命名空间/gophoto

  2. 将添加了标记的映像推送到您的私有 Bluemix 存储库:

    docker push registry.ng.bluemix.net/您的命名空间/gophoto

  3. 列出您的私有 Bluemix 存储库中的映像:

    cf ic images

    现在您可以在映像列表中看到推送的 gophoto 映像:

    $ cf ic images
    REPOSITORY                                        TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
    registry.ng.bluemix.net/singli/gophoto            latest              852a060ac7de        53 seconds ago      0 B
    registry.ng.bluemix.net/ibm-mobilefirst-starter   latest              5996bb6e51a1        13 days ago         770.4 MB
    registry.ng.bluemix.net/ibm-node-strong-pm        latest              ef21e9d1656c        3 weeks ago         528.7 MB
    registry.ng.bluemix.net/ibmliberty                latest              2209a9732f35        3 weeks ago         492.8 MB
    registry.ng.bluemix.net/ibmnode                   latest              8f962f6afc9a        3 weeks ago         429 MB

第 11 步. 创建一个可扩展的容器组并映射一条可通过互联网访问的路线

当公开 IBM Containers for Bluemix 容器供互联网公开访问时,您有两个选择:

  • 将一个固定 IP 地址与一个 IBM Containers for Bluemix 实例绑定。
  • 将一条路线映射到一个可扩展的容器组;该路线是 mybluemix.net 的一个子域,比如就像常规 Cloud Foundry Bluemix 应用程序一样。

您将采用第二种方法,创建一个可扩展的容器组:

  1. 创建一个名为 mygophoto 的可扩展容器组(将该命令键入为一行),设置 V2CREDS 来反映您自己的 Object Storage 服务凭据(已在 第 9 步 中详细给出):

    cf ic group create --max 1 -p 3000 -m 256 --name mygophoto --env "V2CREDS={\"CloudIntegration\":{\"auth_url\":\"https://identity.open.softlayer.com\",\"domain\":\"7adaef92-aeffeed\",\"credentials\":{\"userid\":\"user_b0e399c05baa037c48ce321d95b769\",\"password\":\"nopassis232m\"}}}" your name space/gophoto

    可扩展容器组创建成功的消息表明创建了容器的一个实例:

    该屏幕截图显示了成功创建可扩展容器组的消息
    该屏幕截图显示了成功创建可扩展容器组的消息
  2. 确认可扩展的容器组现在正在运行:

    cf ic group list

    可以看到可扩展的容器组的 CREAT_COMPLETE 状态: 该屏幕截图显示了可扩展容器组的状态
    该屏幕截图显示了可扩展容器组的状态
  3. 将一条路线映射到正在运行的可扩展容器组,让它可通过公共互联网访问:

    cf ic route map -n 您的路线名称 -d mybluemix.net mygophoto

    您必须为该路线选择一个唯一的名称。

第 12 步.试用您部署到 Bluemix 的容器化的 gophoto 应用程序

在浏览器中访问 http://您的路线名称.mybluemix.net/ 来打开该应用程序:

该屏幕截图显示了浏览器应用程序
该屏幕截图显示了浏览器应用程序

您现在可从任何连接互联网的设备访问您的相册,并将照片上传到您的 gophoto 归档中。

结束语

通过聪明地使用 Docker 容器技术,开发人员的敏捷性和生产力可提高一个数量级。需要花数小时(或者甚至数天)反复试验的复杂的工具和环境安装和配置现在只需几秒即可完成。安装和配置专家的才智和知识已封装在容器化的应用程序映像中。Docker 是用于 DevOps 和容器化应用程序的暂存/生产部署的绝佳技术。借助 IBM Containers for Bluemix,您的容器化应用程序可以破纪录的效率进一步扩展 — 从开发到测试,再到扩展的基于云的生产部署。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Web development, Cloud computing
ArticleID=1026057
ArticleTitle=使用 Docker 和 Bluemix 容器化 golang 应用程序
publish-date=01252016