Skip to content

Files

Latest commit

781b2cb · Dec 27, 2021

History

History
566 lines (350 loc) · 27.4 KB

File metadata and controls

566 lines (350 loc) · 27.4 KB

五、Docker 用例

在本章中,我们将介绍以下食谱:

  • 用 Docker 测试
  • 与 Shippable 和 Heroku 一起执行 CI/CD
  • 使用轨迹执行配置项/光盘
  • 使用 OpenShift 原点设置 PaaS
  • 从源代码在 OpenShift 上构建和部署应用

介绍

现在我们知道如何处理容器和映像了。在上一章中,我们还看到了如何在主机和其他容器之间链接容器和共享数据。我们还看到了一台主机上的容器如何与其他主机上的容器进行通信。

现在,让我们看看 Docker 的不同用例。让我们在这里列出几个:

  • 想法的快速原型:这是我最喜欢的用例之一。一旦我们有了一个想法,用 Docker 做原型就非常容易了。我们所要做的就是设置容器来提供我们需要的所有后端服务,并将它们连接在一起。例如,要设置一个 LAMP 应用,获取 web 和 DB 服务器并链接它们,就像我们在上一章中看到的那样。
  • 协作和分发:Git 是协作和分发代码的最好例子之一。同样,Docker 提供了 Dockerfile、注册表和导入/导出等功能,以便与其他人共享和协作。我们在前面的章节中已经介绍了所有这些。
  • 持续整合 ( CI ):马丁·福勒网站(http://www . martinfowler . com/articles/continuousintegration . html上的以下定义涵盖了全部内容:

Continuous Integration is a software development practice where members of a team integrate their work frequently, usually each person integrates at least daily - leading to multiple integrations per day. Each integration is verified by an automated build (including test) to detect integration errors as quickly as possible. Many teams find that this approach leads to significantly reduced integration problems and allows a team to develop cohesive software more rapidly. Using recipes from other chapters, we can build an environment for CI using Docker. You can create your own CI environment or get services from companies such as Shippable and TravisCI. We'll see how Shippable and TravisCI can be used for CI work later in this chapter. I thought it would be helpful if I talk about both of them here:

  • 持续交付 ( 光盘):CI 之后的下一步是持续交付,通过持续交付,我们可以快速可靠地将我们的代码部署到客户、云和其他环境中,而无需任何手动工作。在本章中,我们将看到如何通过 Shippable CI 在 Heroku 上自动部署应用。
  • 平台即服务 ( PaaS ): Docker 可以用来构建自己的 PaaS。可以使用诸如 OpenShift、CoreOS、Atomic 等工具/平台进行部署。本章稍后,我们将看到如何使用 OpenShift Origin(https://www . okd . io)设置 PaaS。

用 Docker 测试

在进行开发或质量保证时,如果我们能够根据不同的环境检查我们的代码,这将是非常有用的。例如,我们可能需要在不同版本的 Python 之间,或者在不同的 Linux 发行版上,如 Fedora、Ubuntu、CentOS 等,检查我们的 Python 代码。对于这个食谱,我们将使用 Flask,这是 Python(https://www.palletsprojects.com/p/flask/)的微框架。我们将使用 Flask 的 GitHub 存储库中的示例代码。我选择这个是为了让事情变得简单,也更容易用于其他食谱。

对于这个食谱,我们将使用 Python 2.7 创建一个容器,使用 Python 3.7 创建另一个容器。然后,我们将使用示例 Python 测试代码来运行每个容器。

准备好

做好以下准备:

  • 由于我们将使用 Flask 的 GitHub 存储库中的示例代码,让我们克隆它:
 $ cd /tmp
 $ git clone https://github.com/pallets/flask
  • 创建一个Dockerfile_2.7文件,如下所示,然后从中构建一个映像:
 $ cat /tmp/Dockerfile_2.7
 FROM python:2.7
 RUN pip install flask pytest
 ADD flask/ /flask
 WORKDIR /flask/examples/tutorial
 RUN pip install -e .
 CMD ["/usr/local/bin/pytest"]
  • 要构建python2.7test映像,运行以下命令:
 $ docker image build -t python2.7test -f /tmp/Dockerfile_2.7 .
  • 同样,创建一个以python:3.7为基础映像的 Dockerfile,并构建python3.7test映像:
 $ cat /tmp/Dockerfile_3.7
 FROM python:3.7
 RUN pip install flask pytest
 ADD flask/ /flask
 WORKDIR /flask/examples/tutorial
 RUN pip install -e .
 CMD ["/usr/local/bin/pytest"]
  • 要构建python3.7test映像,运行以下命令:
 $ docker image build -t python3.7test -f /tmp/Dockerfile_3.7 .
  • 确保创建了两个映像:
 $ docker image ls

怎么做…

现在,使用我们创建的两个映像,让我们运行它们,以查看结果。

要使用 Python 2.7 进行测试,请运行以下命令:

$ docker container run python2.7test

同样,要使用 Python 3.7 进行测试,请运行以下命令:

$ docker container run python3.7test

它是如何工作的…

从这两个 Dockerfiles 中可以看到,在运行运行 pytest 二进制文件的 CMD 之前,我们将 Flask 源代码添加到映像中,将我们的工作目录更改为教程示例目录/flask/examples/tutorial,并安装应用。因此,一旦容器启动,它将在我们的测试中运行pytest二进制文件。

还有更多…

  • 在这个食谱中,我们已经看到了如何用不同版本的 Python 测试我们的代码。同样,您可以从 Fedora、CentOS 和 Ubuntu 中挑选不同的基础映像,并在不同的 Linux 发行版上进行测试。
  • 如果您在您的环境中使用 Jenkins,那么您可以使用它的 Docker 插件来动态地配置一个从属,运行一个构建,并在 Docker 主机上将其拆除。

More details about this can be found at https://plugins.jenkins.io/docker-plugin.

与 Shippable 和 Heroku 一起执行 CI/CD

在前面的配方中,我们看到了一个如何在本地开发和质量保证环境中使用 Docker 进行测试的例子。让我们看一个端到端的例子,看看 Docker 现在是如何在 CI/CD 环境中使用的。在本食谱中,我们将了解如何使用 shippeble(https://www.shippable.com)执行 CI/CD 并将其部署在 Heroku(https://www.heroku.com)上。

Shippable 是一个 SaaS 平台,允许您轻松地将持续集成/部署添加到 GitHub 和 Bitbucket (Git)存储库中,并且完全基于 Docker 构建。Shippable 使用构建从属(基于 Docker 的容器)来运行工作负载。Shippable 支持多种语言,如 Ruby、Python、Node.js、Java、Scala、PHP、Go 和 Clojure。默认的构建奴才是 Ubuntu 14.04 LTS 和 Ubuntu 16.04。他们还增加了使用 Docker Hub 的自定义映像作为奴才的支持。可交付配置项需要关于项目的信息和一个名为shippable.yml的 YAML 文件中的构建说明,您必须在源代码报告中提供该文件。yaml 文件包含以下说明:

  • language:这将显示编程语言
  • python:有了这个,你可以在一个构建指令中指定不同版本的语言来获得测试
  • build:这是构建管道
  • ci:这些是运行构建的说明
  • on_success:这些是构建成功后的指令,用于在 Heroku、Amazon Elastic Beanstalk、AWS OpsWorks、Google App Engine 等 PaaS 上执行部署

Heroku 是一个平台即服务 ( PaaS )使开发人员能够完全在云中运行和操作应用。

对于这个配方,我们将使用与上一个配方中相同的示例代码,首先在 Shippable 上测试它,然后在 Heroku 上部署它。

准备好

遵循以下先决条件:

  1. 在可发货(https://www.shippable.com)上创建账户。
  2. 将烧瓶实例从https://github.com/kencochrane/heroku-flask-example分叉,并克隆到您的本地机器上。
  3. 通过以下步骤在 Heroku 上为分叉的存储库创建一个应用:

在 Heroku 上创建一个帐户(https://signup.heroku.com),安装 Heroku 应用,然后登录:

 $ heroku login

将您的目录更改为从步骤 2 克隆分叉的位置,并在 Heroku 上创建一个应用:

 $ heroku create --ssh-git

将代码推送到 Heroku 来部署应用:

 $ git push heroku master

一分钟后,您的应用将被部署:

请确保您的应用至少有一台发电机,并在浏览器中打开该应用,以确保其正常工作:

 $ heroku ps:scale web=1
 $ heroku open

您的浏览器应该为您的应用打开并加载页面。如果结果有效,应该如下所示:

  1. 更新分叉中的shippable.yml文件,使用 Heroku 应用的 Git URL:
language: python
python:
 - 3.7
build:
 ci:
 - shippable_retry pip install -r requirements.txt
 # Create folders for test and code coverage
 - mkdir -p shippable/testresults
 - mkdir -p shippable/codecoverage
 # run tests
 - pytest
 on_success:
 # my heroku app git urls:
 # http url: https://git.heroku.com/blooming-mountain-58044.git
 # git url: git@heroku.com:blooming-mountain-58044.git
 # use git url not http.
 # change this value to the value of your app.
 - git push git@heroku.com:blooming-mountain-58044.git
  1. 提交对代码的更改,并将其推送到分叉的存储库中。

怎么做…

请执行以下步骤:

  1. 登录到可发货,并选择启用项目链接:

  1. 然后,在左边选择正确的订阅,它会在下面显示你的回复列表。选择 heroku-flask-示例报告:

  1. 单击“播放”按钮,选择要构建的分支。对于这个食谱,我选择了大师:

如果构建成功,您将看到成功图标。

下一次,如果您在存储库中进行提交,将会触发一个基于 Shippable 的构建,并测试代码。现在,要在 Heroku 上执行连续部署,让我们按照 Shippable 网站(http://docs.shippable.com/ci/deploy-to-heroku/)上提供的说明进行操作。Shippable 需要获得许可才能对我们的 Heroku 应用进行更改;我们通过将它的部署 SSH 密钥添加到我们的 Heroku 帐户来授予它权限。

  1. 通过单击小齿轮图标并选择设置,从可装运仪表板中获取部署密钥:

  1. 页面底部有一个部署密钥部分。复制密钥:

  1. 现在您有了密钥,转到 Heroku 中的帐户设置:

  1. 向下滚动,直到看到 SSH 密钥部分,然后点击添加按钮。

  1. 将弹出一个窗口,您可以在其中添加从可发货复制的 SSH 密钥。粘贴密钥,然后点击保存更改:

我们现在已经做到了,当构建成功时,Shippable 能够将更改推送到 Heroku。

它是如何工作的…

在每个构建指令中,Shippable 根据shippable.yml文件中指定的映像和语言类型创建一个新的容器,并运行构建来执行测试。Shippable 知道何时开始构建,因为当您向他们注册应用时,它会向 GitHub 存储库添加一个 webhook:

因此,每次向 GitHub 提交变更时,都会触发 Shippable 上的构建,构建成功后,会将其部署到 Heroku。

请参见

使用轨迹执行配置项/光盘

如 TravisCI 网站(https://travis-ci.org)所述,TravisCI 是一个托管的持续集成服务。它使您能够方便地设置项目,以便在对代码进行更改时自动构建、测试和部署它们。截至目前,它们支持 30 多种语言,如 C/C++、Dart、Go、Haskell、Groovy、Java、Node.js、PHP、Python、Ruby 和 Scala。使用 TravisCI,您可以在 Heroku、谷歌应用引擎、AWS 和 Azure 等平台上部署您的应用。

对于这个食谱,让我们使用与早期食谱中相同的例子。

准备好

遵循以下先决条件:

  1. 登录 TravisCI(https://travis-ci.org)。

  2. 单击您的个人资料并设置存储库。在我们的案例中,我们将从 GitHub 中选择与我们在之前的配方中使用的相同的存储库(https://github.com/kencochrane/heroku-flask-example):

  1. 我们现在需要向我们的 Git repo 添加一个.travis.yml文件,该文件包含构建代码时 TravisCI 需要的信息。创建一个包含以下内容的文件,提交并推送到 GitHub:
$ cat .travis.yml
language: python
python:
 - "3.6"
install:
 - pip install -r requirements.txt
script:
 - pytest

怎么做…

请遵循以下步骤:

  1. 通过单击更多选项触发手动构建,然后触发构建,如下图所示:

  1. 如果一切顺利,您应该能够看到构建的结果,包括日志:

它是如何工作的…

构建过程启动一个新的容器,克隆源代码存储库,并在测试容器内部运行我们在.travis.yml文件的脚本部分中指定的命令。

还有更多…

  • TravisCI 还在 GitHub 中增加了一个 webhook 因此,下次您在存储库中提交更改时,将会触发一个构建。
  • 正如我们在前面的食谱中看到的,TravisCI 还支持向不同云环境的连续部署。要进行设置,您需要向.travis.yml文件添加更多信息。有关更多详细信息,请查看部署文档(https://docs.travis-ci.com/user/deployment/)。

请参见

https://docs.travis-ci.com 的旅行文件。

使用 OpenShift 原点设置 PaaS

平台即服务 ( PaaS )是一种云服务,其中消费者控制应用(主要是 web)的软件部署和配置设置,提供商提供服务器、网络和其他服务来管理这些部署。提供商可以是外部(公共提供商)或内部(组织中的信息技术部门)。PaaS 提供商很多,比如亚马逊(https://aws.amazon.com)、Heroku(https://www.heroku.com)、OpenShift(https://www.openshift.com等等。在最近的过去,容器似乎已经成为应用部署的自然选择。

在本章的前面,我们研究了如何使用 Shippable 和 Heroku 构建 CI/CD 解决方案,其中我们使用 Heroku PaaS 部署了我们的应用。Heroku 是一个公共云服务,托管在亚马逊网络服务 ( AWS )上。OpenShift(https://github.com/openshift/origin)是一个 PaaS,它利用了 Docker 和 Kubernetes(https://Kubernetes . io等技术,提供了一个完整的生态系统来为您的云应用提供服务。正如我们在第 8 章 Docker 编排和托管平台中谈到的 Kubernetes,强烈建议您在继续阅读本食谱之前先阅读它。我将借用那一章中的一些概念。让我们看看下面的图表:

Kubernetes 为容器集群管理提供了调度 pods 和服务发现等功能,但它没有完整应用的概念,也没有从源代码构建和部署 Docker 映像。OpenShift 扩展了基本的 Kubernetes 模型,填补了这些空白。如果我们快进到第 8 章 Docker 编排和托管平台,对于 Kubernetes 部分,您会注意到要部署应用,我们需要定义 Pods、服务和复制控制器。OpenShift 试图抽象所有这些信息,让您定义一个配置文件来处理所有的内部连接。此外,OpenShift 还提供了其他功能,例如通过源代码推送实现的自动化部署、应用的集中管理、身份验证、团队和项目隔离以及资源跟踪和限制,所有这些都是企业部署所必需的。

在本食谱中,我们将在虚拟机上设置一体式 OpenShift Origin,并启动一个 pod。在下一个食谱中,我们将看到如何使用源到映像 ( S2I )构建功能通过源代码构建和部署应用。示例可在https://github . com/open shift/origin/tree/master/examples/sample-app中找到。

准备好

设置一个带有 CentOS 7.5 和至少 4 GB 内存的虚拟机,并在其中进行 SSH。

  1. 安装 Docker:
 $ curl https://get.docker.com | bash
  1. 将不安全注册表的条目添加到 Docker 守护程序配置文件中(/etc/docker/daemon.json):
    $ cat /etc/docker/daemon.json
    {
 "insecure-registries": [
 "172.30.0.0/16"
 ]
 }
  1. 启动 Docker:
 $ systemctl start docker
  1. 安装wget包:
 $ yum install -y wget
  1. 从 github(https://github.com/openshift/origin/releases)的发布页面下载最新的 OpenShift 二进制文件:
 $ cd /tmp
 $ wget https://github.com/openshift/origin/releases/download/v3.10.0/openshift-origin-client-tools-v3.10.0-dd10d17-linux-64bit.tar.gz
  1. 使用tar提取档案并将oc二进制文件移动到您路径中的目录(/usr/local/bin):
 $ tar -xvzf openshift-origin-client-tools-v3.10.0-dd10d17-linux-64bit.tar.gz
 $ cd openshift-origin-client-tools-v3.10.0-dd10d17-linux-64bit
 $ sudo cp oc /usr/local/bin
       $ cd ~ 

怎么做…

现在我们已经建立了一个运行 Docker 的虚拟机,并且安装了 OpenShift 二进制文件,我们可以使用oc二进制文件启动我们的集群。OpenShift 有一个可以登录的网络控制台,但是为了让它正常工作,OpenShift 将需要能够确定您的 IP 地址。如果您的虚拟机有多个,您可能需要明确告诉 OpenShift 在启动集群时使用哪个。在这里的例子中,我的公共 IP 地址是142.93.14.79;您的知识产权将有所不同:

$ oc cluster up --public-hostname=<your ip>

几分钟后,集群启动并运行,您将看到如下内容:

此时,我们有两个选择;我们可以通过 SSH shell 安装我们的应用,也可以使用 web 控制台。让我们先试试 web 控制台,确保它工作正常。在浏览器中打开 web 控制台 URL,并在启动集群时使用输出中显示的凭据登录。

You will probably get a warning from your browser that the SSL/TLS certificate doesn't match. That is fine, and expected; you can bypass this warning and continue.

现在您已经登录,让我们部署一个示例应用。点击目录中的红宝石图标:

这将打开一个向导,帮助我们将应用添加到集群中。单击下一步按钮:

单击“尝试样本存储库”链接,它将自动为我们填充表单;然后,单击创建按钮:

就这样,我们的 ruby-ex 应用被创建了。单击关闭按钮:

现在,您应该看到 web 控制台中列出的应用;一旦应用启动并运行,您将看到一个 URL,您可以在其中看到应用正在运行:

在浏览器中打开应用网址,您应该会看到如下内容:

现在我们已经启动并运行了示例 Ruby 应用,让我们删除它,并做同样的事情,但是使用 SSH 外壳。在应用下,您可以单击操作选项并选择删除。这将为我们删除应用:

回到 SSH 外壳,让我们创建一个新的应用,但这次使用的是oc二进制。对于本例,我们将使用 OpenShift 附带的其他内置示例之一。我们将使用django-psql-persistent示例,它有两个服务,一个 Django web 服务和一个 PostgreSQL 数据库服务:

$ oc new-app django-psql-persistent

几分钟后,您的应用被创建,您应该会看到如下内容:

当我们运行oc status命令时,我们可以看到我们项目的网址:

$ oc status

当我们在浏览器中打开该 URL 时,您可以看到应用已经启动并运行:

当您返回 web 控制台时,您可以看到刚刚部署的应用的详细信息:

如果我们想使用oc二进制删除应用,这是相当容易的。我们只需要使用delete命令:

$ oc delete dc/django/psql-persistent
$ oc delete dc/postgresql

它是如何工作的…

当 OpenShift 启动时,所有 Kubernetes 服务也会启动。然后,我们通过命令行界面连接到 OpenShift 主机,并请求它启动一个 pod。该请求随后被转发到 Kubernetes,后者启动 pod。OpenShift 充当您和 Kubernetes 之间的中间人。

还有更多…

  • 如果运行docker container ls命令,您将看到相应的容器正在运行
  • 如果要停止 OpenShift 集群,可以运行以下命令:
 $ oc cluster down

请参见

从源代码在 OpenShift 上构建和部署应用

OpenShift 提供了从源代码构建映像的构建过程。以下是构建映像时可以遵循的构建策略:

  • Docker 构建:在这种情况下,用户会向 Docker 提供上下文(Dockerfile 和支持文件),可以用来构建镜像。OpenShift 只是触发 docker build 命令来创建映像。
  • 源代码到映像(S2I)构建:这里,开发者定义了源代码库和构建器映像,构建器映像定义了用于创建应用的环境。然后,S2I 使用给定的源代码和构建器映像为应用创建一个新的映像。更多关于 S2I 的细节可以在https://github.com/openshift/source-to-image找到。
  • 定制构建:这类似于 Docker 构建策略,但是用户可能会定制将用于构建执行的构建器映像。

在这个食谱中,我们将看看 S2I 建造过程。我们将从 OpenShift Origin repo(https://github . com/open shift/Origin/tree/master/examples/sample-app中查看示例-app。相应的 S2I 构建文件位于https://github . com/open shift/origin/tree/master/examples-app/application-template-stibuild . JSON

在 BuildConfig 部分,我们可以看到源代码指向一个 GitHub repo(https://github.com/openshift/ruby-hello-world),而策略部分下的映像指向centos/ruby-22-centos7映像。因此,我们将使用centos/ruby-22-centos7映像,并使用来自 GitHub repo 的源构建一个新映像。在将构建推送到本地或第三方 Docker 注册表后,新映像取决于设置。BuildConfig 部分还定义了何时触发新构建的触发器,例如,当构建映像发生变化时。

在同一个 S2I 构建文件(application-template-stibuild.json)中,您会发现多个DeploymentConfig部分,每个窗格一个。DeploymentConfig部分包含诸如导出的端口、副本、pod 的环境变量等信息。简单来说,您可以将DeploymentConfig视为 Kubernetes 的扩展复制控制器。它还具有触发新部署的触发器。每次创建新部署时,DeploymentConfiglatestVersion字段都会递增。一个deploymentCause也被添加到DeploymentConfig中,描述导致最新部署的变化。

ImageStream 是一个相关映像的流。BuildConfigDeploymentConfig观察ImageStream寻找映像变化,并根据各自的触发做出相应的反应。

您将在 S2I 构建文件中找到的其他部分是 pods 服务(数据库和前端)、可通过其访问应用的前端服务的路由以及模板。模板描述了一组打算一起使用的资源,这些资源可以被定制和处理以产生配置。每个模板可以定义一个参数列表,这些参数可以被修改以供容器使用。

与 S2I 构建类似,在同一个示例应用示例文件夹中有 Docker 和自定义构建的示例。我假设你有早期的食谱,所以我们将从那里继续。

准备好

您应该已经使用 OpenShift Origin 配方完成了较早的设置 PaaS。

确保您的群集已启动并正在运行:

$ oc cluster status

将 OpenShift Git repo 克隆到/opt/openshift/origin目录中:

$ mkdir -p /opt/openshift
$ cd /opt/openshift
$ git clone https://github.com/openshift/origin.git
$ cd origin/examples/sample-app

您当前的工作目录应该是虚拟机内部的/opt/openshift/origin/examples/sample-app

怎么做…

使用oc命令提交申请模板进行处理:

$ oc new-app application-template-stibuild.json

监控构建并等待状态进入complete(这可能需要几分钟时间):

$ oc get builds

获取豆荚列表:

$ oc get pods

获取服务列表:

$ oc get services

它是如何工作的…

在 BuildConfig ( ruby-sample-build)部分,我们将我们的源代码指定为 ruby-hello-world Git repo ( git://github.com/openshift/ruby-hello-world.git)并将我们的映像指定为centos/ruby-22-centos7。因此,构建过程采用了该映像,在centos/ruby-22-centos7上构建我们的源代码后,使用 S2I 构建器创建了一个名为origin-ruby-sample的新映像。然后,新映像被推送到 OpenShift 内置的 Docker 注册表中。

使用 DeploymentConfig,前端和后端单元也被部署并链接到相应的服务。

还有更多…

请参见