内容


Docker 和 Kubernetes 入门

了解如何使用新一代 DevOps 的基石 - Docker 容器和 Kubernetes 集群

Comments

Docker 和 Kubernetes 是 IT 世界最热门的两种技术。本教程将教您快速掌握这两种技术,并在 IBM Cloud 中熟练运用。最重要的是,您可以使用 IBM Cloud Lite 免费帐户执行一切操作(参见侧边栏)。

本教程将展示如何:

  1. 获取样本代码,并安装所需工具
  2. 构建 Docker 镜像,并在本地机器上运行
  3. 在 IBM Cloud 中创建 Kubernetes 集群
  4. 在 IBM Cloud 中创建 Docker 镜像
  5. 将 Docker 镜像部署到 Kubernetes 集群

获取样本代码

首先,克隆包含样本代码的 Github 存储库。将要部署的应用不过是一个“Hello World”页面,外加一个用于将应用构建为 Docker 镜像的 Dockerfile。样本代码位于以下位置:github.com/IBM/dWTVSimpleContainerApp

dWTVSimpleContainerApp 存储库的主页

dWTVSimpleContainerApp 存储库的主页

在命令行中,输入 git clone https://github.com/IBM/dWTVSimpleContainerApp.git 以克隆该存储库,然后切换至克隆存储库的目录 (cd dWTVSimpleContainerApp):

克隆 Github 存储库

克隆 Github 存储库

现在,您已将样本代码安装在机器上,随着您接管容器和集群的世界,您已经准备好安装所需的工具。

在继续之前……

根据法律规定,任何探讨容器的文章都必须附上满载集装箱的集装箱船的图片,正如下图所示:

驶入大海中央的集装箱船正被巨型乌贼吞噬

驶入大海中央的集装箱船正被巨型乌贼吞噬

此处仅供娱乐,希望博得您的会心一笑。

安装所需工具

您需要先安装 IBM Cloud、Docker 和 Kubernetes 工具,然后才能通过 Docker 和 Kubernetes 运行 docker build,或者执行其他任何操作。

安装 IBM Cloud 工具

转至 console.bluemix.net/docs/cli/index.html#downloads,并单击 Download 链接,获取最新版本的 IBM Cloud 工具。下载适合您的平台的工具,运行安装程序。

IBM Cloud 工具下载页面

IBM Cloud 工具下载页面

备注:出于历史原因,用来处理 IBM Cloud 资源的命令是 bluemix。您可能会担心,每个命令都输入七个完整的字符非常累人。朋友,不要担心:我们已将此命令缩写为 bx。您会发现这种捷径每天会为您节省数小时的输入时间,让您有更多的时间陪伴家人和朋友,重拾长期以来无暇顾及的爱好,抑或是找份兼职来补贴家用。

不用谢。

安装 Docker

下一步就是安装 Docker 及其相关命令行工具。转至 docker.com,并单击 Get Docker 链接:

从 docker.com 下载 Docker 工具

从 docker.com 下载 Docker 工具

下载并安装 Docker Community Edition。根据您的平台,您可能会收到一条消息,表明需要重新引导系统才能继续。等到安装了 Kubernetes 工具之后再重新引导。

安装 Kubernetes 工具

尽管直到本文的稍后阶段才会使用 Kubernetes,但也可以现在就安装 kubectl 工具。转至 kubernetes.io/docs/tasks/tools/install-kubectl/,根据与您的平台相对应的说明来安装 kubectl

安装 kubectl

安装 kubectl

在 IBM Cloud 中创建集群时,您将会配置 kubectl 来处理集群,但首先需要完成几个步骤。现在,只需安装该命令。

登录到 IBM Cloud

此时,您应当已经安装了所有的 IBM Cloud、Docker 和 Kubernetes 工具,并且已根据需要重新引导了机器。下一步就是登录到您的 IBM Cloud 帐户。在命令行中,输入 bx login 以登录:

登录到 IBM Cloud

登录到 IBM Cloud

登录到 IBM Cloud 之后,您需要安装 IBM Container Service 和 IBM Container Registry 的插件。输入以下命令:

  • bx plugin install container-service -r Bluemix
  • bx plugin install container-registry -r Bluemix
  • bx cr login

前两个命令用于安装来自 Bluemix 存储库的容器服务和容器注册表插件。最后一个命令使您登录到容器注册表服务。这样您就可以访问 IBM Cloud 公共注册表中的 Docker 镜像。

在您的机器上使用 Docker 镜像和容器

视频:在您的机器上使用 Docker 镜像和容器
视频:在您的机器上使用 Docker 镜像和容器

启动 Docker

现在,即可开始构建工作。首先,您需要在机器上启动 Docker。当然,具体如何启动取决于您的平台。

Windows

双击桌面图标:

Windows 上的 Docker 桌面图标

Docker 启动并运行之后,您会在桌面右下角看到一条消息:

Windows 上的 Docker“启动并运行”消息

Windows 上的 Docker“启动并运行”消息

Mac

单击桌面图标:

Mac 上的 Docker 桌面图标

Mac 上的 Docker 桌面图标

Docker 启动并运行之后,单击菜单栏中的 Docker 图标,会显示这条令人欣慰的状态消息:

Mac 上的 Docker“启动并运行”状态

Mac 上的 Docker“启动并运行”状态

Linux

在 Linux 上启动 Docker 的方法因分发版而异,但是通常都会运行以下两条命令之一:

  • sudo systemctl start docker
  • sudo service docker start

如果在 Linux 上启动 Docker 时遇到问题,请参阅 Docker 文档了解更多信息。

构建 Docker 镜像

Docker 启动并运行之后,即可开始构建包含应用的镜像。之前克隆的存储库包含一个 Dockerfile,它会指示 Docker 如何构建镜像。此文件类似如下:

FROM ibmcom/ibmnode:latest

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY package.json /usr/src/app
RUN npm install

EXPOSE 6006

COPY ./usr/src/app

CMD ["node", "app.js"]

以下是对此文件中各种命令的简要说明:

  • 第 1 行:告诉 Docker 该镜像将基于最新的 IBM node.js 镜像。(您可以访问此镜像,因为您之前运行了 bx cr login 命令。)
  • 第 3 行和第 4 行:创建 /usr/src/app 目录,指示 Docker 将此目录用作为工作目录。
  • 第 6 行和第 7 行:package.json 文件复制到工作目录,并运行 npm install 命令来安装应用的所有依赖关系。
  • 第 9 行:指示 Docker 打开 6006 端口来接收入局流量。此应用会侦听这个端口上的连接。
  • 第 11 行:将当前目录中的所有文件复制到工作目录。
  • 第 13 行:指示 Docker 启动镜像时要运行的命令。第一个参数是命令,第二个是该命令的自变量列表。当这个镜像启动时,Docker 会运行 node app.js

转至命令行,运行 docker build -t basicapp:v1 . 命令。(句点是此命令的一部分;它指示 Docker 在当前目录中完成工作。)您将看到类似如下的消息:

docker build 命令的结果

docker build 命令的结果

您的结果可能会有所不同。在这个截屏中,系统上已经存在 node.js 镜像,所以有很多内容 Docker 都不必下载。在机器上初次运行 docker build 时,机器上完全不存在镜像所需的依赖关系,所以 Docker 必须进行下载。随后调用 docker build 时,运行速度可能会快得多。另请注意,npm install 命令在这个示例中并没有结束运行。

在机器上运行 Docker 镜像

您肯定已经对构建自己的首个 Docker 镜像以及所有的一切感到兴奋不已,不过我们还得继续,真正地运行这个镜像。在命令行中,输入 docker create basicapp:v1,从您的镜像创建一个容器:

从 Docker 镜像创建 Docker 容器

从 Docker 镜像创建 Docker 容器

并不是非常令人激动,对吗?您运行了一个命令,然后获得了很长的十六进制字符串,它可能具有某种含义,但并没有明确表示出来。幸好,Docker 社区有一些很棒的工具,非常便于使用 Docker 容器。如果您在 Windows 或 Mac 上运行,请使用 Kitematic 这个出色的工具。从 Windows 上的系统托盘或 Mac 上的菜单栏启动该工具:

在 Windows 或 Mac 上启动 Kitematic

在 Windows 或 Mac 上启动 Kitematic

备注:截至本文完稿时,Kitematic 还需要在 Windows 上单独安装。请查看 Docker 文档,了解相关说明。

Kitematic 启动时,您会看到类似如下的显示页面:

Kitematic  主屏幕

Kitematic 主屏幕

dockerhub 目录中包含各种 Docker 镜像的磁贴。如果您要设置 Jenkins、PostgreSQL、Minecraft 或其他软件,通过这些镜像就可以轻而易举地完成。值得注意的是,左上角有一个列表,其中列出了机器上运行的所有容器。每个容器都有一个随机分配的名称。在这个截屏中,该容器名为 unruffled_swirles - 显然比一分钟前在命令行中看到的一长串十六进制字符更容易让人记住。

此时,您在机器上运行了一个 Docker 容器。该容器中运行着基础的 Hello World 应用,但是如何才能访问这个应用?为此,您必须为此应用定义一个端口。Docker 会将针对您定义的端口号的传入请求映射到容器中的 6006 端口。(回想一下 Dockerfile 中的 EXPOSE 6006 命令。)单击右上方的 Settings 菜单,然后单击 Ports

Settings  菜单下的 Ports 菜单

Settings 菜单下的 Ports 菜单

所显示的页面会要求您将 Docker 容器中的 6006 端口映射到机器上的一个端口。以下是 32008 端口的使用方式:

将 Docker 端口映射到本机主机上的一个端口

将 Docker 端口映射到本机主机上的一个端口

单击 Save 保存映射,然后在浏览器中转至 http://localhost:32008。您将看到 Hello World 应用已启动并正常运行:

在 Docker  容器中运行的 Hello World 应用

在 Docker 容器中运行的 Hello World 应用

恭喜您!您已成功构建 Docker 镜像,将它部署到您的机器上,并配置了 Docker 运行时,这样您就可以从浏览器访问在 Docker 容器中运行的应用。

对于 Linux,截至本文完稿时,还没有出现 Kitematic for Linux。要获取类似功能,请尝试使用 Portainer:

Portainer 控制台

Portainer 控制台

Portainer 打包为 Docker 镜像,这样安装流程就只是要求 Docker 下载并运行这个镜像。请参阅 portainer.io,了解所有详细信息。

在 IBM Cloud 中创建 Kubernetes 集群

视频:在 IBM Cloud 中构建 Kubernetes 集群
视频:在 IBM Cloud 中构建 Kubernetes 集群

此处的最终目标是将在 Docker 容器中运行的应用部署到 Kubernetes 集群。启动并运行集群需要几分钟时间才能完成,所以现在继续创建集群。稍后,将会部署 Docker。在 IBM Cloud 控制台中,转至左上角的菜单并单击 Containers

Containers 菜单项

Containers 菜单项

接下来,单击位于页面中间的 Create cluster 按钮:

“Create cluster”按钮

“Create cluster”按钮

最后,为您的集群命名(在以下示例中,此集群名为“Mailbag”),并确保已选中 Lite plan(也称为免费计划),然后单击面板右侧的 Create Cluster 按钮:

集群创建面板

集群创建面板

配置和启动集群需要几分钟时间才能完成。在此期间,继续构建要部署到集群上的 Docker 镜像。

在 IBM Cloud 中创建 Docker 镜像

您已在本地机器上创建了 Docker 镜像,这非常好,但您需要让这个镜像进入到 IBM Cloud 中,然后才能将其部署到 Kubernetes 集群。(确保您已使用 bx cr login 命令登录到 IBM Cloud 镜像存储库,然后再继续。)首先,为镜像定义一个命名空间。比如,要创建 mailbag 命名空间,请输入以下命令:

bx cr namespace-add mailbag

命名空间可用于在 IBM Cloud 帐户中创建多组 Docker 镜像。直到有了命名空间,才能创建或上传 Docker 镜像。您的结果应类似如下:

为 Docker 镜像定义一个命名空间

为 Docker 镜像定义一个命名空间

现在,就需要让您的 Docker 镜像进入到 IBM Cloud 中的容器存储库中。可采用以下两种方法之一来完成该操作:直接在云中构建镜像,或者将现有镜像推送到云中。以下是每种方法的具体说明:

在 IBM Cloud 中构建 Docker 镜像

您可以使用 bluemix 命令在云中创建镜像。输入 bx cr build -t registry.ng.bluemix.net/mailbag/basicapp:v1 .(命令行末尾必须包含句点。)

用于在 IBM Cloud 中构建 Docker 镜像的命令

用于在 IBM Cloud 中构建 Docker 镜像的命令

此命令的输出类似于 docker build 命令:

Bluemix Docker build 命令的输出

Bluemix Docker build 命令的输出

bx cr build 命令会自动将新镜像推送到您的镜像存储库中。您可以输入 bx cr images,确保镜像已创建完成,并且位于 IBM Cloud 中:

Docker 镜像已构建,并且保存在 mailbag 命名空间下

Docker 镜像已构建,并且保存在 mailbag 命名空间下

将现有的 Docker 镜像推送至 IBM Cloud

如果您要使用已经构建的 Docker 镜像,并将其推送到云中,请使用以下两条 Docker 命令:

  1. docker tag basicapp:v1 registry.ng.bluemix.net/mailbag/basicapp:v2
  2. docker push registry.ng.bluemix.net/mailbag/basicapp:v2

您的结果应类似如下:

标记 Docker 镜像,并将其推送至 IBM Cloud

标记 Docker 镜像,并将其推送至 IBM Cloud

备注:假设您的存储库中已有了 v1 镜像,这是先前部分的命令所创建的,此示例因而使用 v2 标签。通过创建两个标签(v1v2),您可以具有同一镜像的两个版本。如前所述,输入 bx cr images,这样会列出您的存储库中的 Docker 镜像。

配置 kubectl 命令

通过结合使用 bxkubectl 命令,将镜像部署为在集群中运行的容器,并公开此容器。必须先配置 kubectl 命令来处理在 IBM Cloud 中运行的集群,然后才能运行这些命令。以下是要运行的命令以及每个命令的说明:

  1. bx cs cluster-config Mailbag
    此命令使用 Bluemix 容器服务插件来获取先前创建的 Mailbag 集群的配置详细信息。它会返回一条命令,您可复制并粘帖此命令来设置 KUBECONFIG 环境变量。
  2. [Set the KUBECONFIG variable]
    此命令位于先前命令的输出中。它在 Linux 和 Mac 上为 export 语句,在 Windows 命令行中为 set 命令;它可返回 Windows PowerShell 中的 $env:KUBECONFIG 定义所需的信息。

这两条命令在 Linux 或 Mac 上类似如下:

定义 KUBECONFIG 环境变量

定义 KUBECONFIG 环境变量

(请注意,export 命令只是 bx cs cluster-config 命令输出的剪切和粘帖而已。)

设置了 KUBECONFIG 之后,任何自动运行的 kubectl 命令都会影响在 IBM Cloud 中运行的集群。

将 Docker 镜像部署到 Kubernetes 集群

此时,您要部署的 Docker 镜像已在 IBM Cloud 中,Kubernetes 集群也已启动并运行,并且已配置了 kubectl 命令来处理集群。

展示成果的精彩时刻已经到来!

您离胜利只差四个命令。这四个命令就是:

  1. kubectl run apptest --image=registry.ng.bluemix.net/mailbag/basicapp:v1
    这个命令会在集群中启动来自 IBM Cloud 容器存储库的 Docker 镜像 basicapp:v1。它会创建名为 apptest 的 Kubernetes 部署。
  2. kubectl expose deployment/apptest --type=NodePort --name=apptest-service --port=6006
    这个冗长的命令会将 apptest 部署公开为一个 NodePort,命名为 apptest-service,在 6006 端口上运行。(我们改日再讨论 NodePort;可以这么说,它是您获得免费集群的唯一选择。)此时,已创建了部署并公开了服务:创建部署并公开服务
    创建部署并公开服务
  3. kubectl describe service apptest-service
    这会显示刚才所公开服务的各种有用信息。除了其他一些内容,它还会显示 Kubernetes 为此服务提供的随机分配的端口号: 为您的服务随机分配的端口号
    为您的服务随机分配的端口号
  4. bx cs workers Mailbag
    最后,您需要获取 Kubernetes 集群本身的 IP 地址。此命令将返回以下信息: Kubernetes 集群的 IP 地址
    Kubernetes 集群的 IP 地址

请来点鼓声:既然您已知道了集群的 IP 地址和服务的端口号,就可以在浏览器中结合使用这两者,见证 Hello World 荣耀登场:

Docker 容器中运行的 Hello World 应用,此容器在 Kubernetes 集群中运行

Docker 容器中运行的 Hello World 应用,此容器在 Kubernetes 集群中运行

您已将 Docker 镜像部署到 Web 上运行的 Kubernetes 集群。Hello World 应用在全球范围内提供,任何人在任何地方都可以访问。当您沉浸在此处取得的成就中时,请努力保持谦虚谨慎的态度。

小结

此时,您已完全准备好接管容器和集群环境。您知道了如何构建 Docker 镜像,如何将其推送到 IBM Cloud,以及如何将其部署到 Kubernetes 集群中。您的集群中 Docker 容器内运行的应用已通过网络上线,所以全世界的任何人都可以看到您的成果。虽然还有很多内容有待掌握(比如,处理集群内的凭证),但您已经有了一个良好的开端。


相关主题


评论

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

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Cloud computing, DevOps
ArticleID=1060466
ArticleTitle=Docker 和 Kubernetes 入门
publish-date=05042018