集装箱之旅-第一部分


大约6个月前,我得到了一个处理容器的机会。从那以后,我查阅了许多关于集装箱、集装箱历史以及最终的码头工人和库本内特的文件。有许多社区工作正在进行,以促进集装箱生态系统。我还着迷地看到市场上出现了这么多新工具和对现有工具的增强,主要是从配置项/配置项、安全性、监控和协调的角度来支持容器生态系统。

我已经在DevOps领域工作了一段时间,使用了各种工具和技术,主要工作是使用各种工具、集成、自动化、定义流程、用户培训等来设计和建立CI/CD管道。

首先,为部署集装箱化应用程序建立管道是一个巨大的挑战。当我开始浏览各种文档以获得对容器的深入了解时,我被网上所有可用的信息淹没了。为了更好地把握这一新的冒险,我想做一个概念验证,通过配置项/光盘管道将一个应用程序部署到库本内斯,目标是了解开发人员/开发人员作为用户需要经历的工具和流程之间的复杂性、集成和切换。

当我继续在码头工人和库本内特斯工作的时候,我也决定把我学到的东西贡献给社区,因为这可以帮助像我这样的新手熟悉码头工人和库本内特斯,开始他们的旅程。

我计划将这些会议分成多个部分,重点是通过配置项/配置项管道部署应用程序、各种配置、关于安全和审计控制的一些要点,以及关于Docker/Kubernetes对象或体系结构组件的一些信息。

让我们从探索高层次的容器开始,然后我们将转向Docker和Kubernetes。

就虚拟机的类比而言,容器可以被视为虚拟机的一个非常轻量级的运行实例,不使用虚拟机管理程序。每个容器都是一个独立的单元,有自己的行为。为了加速虚拟机,您需要在用户界面中逐步提供说明,或者使用模板(图像)。同样,为了创建一个容器,需要一个图像。该映像包括设置指令,如要使用的操作系统、软件和配置,以及创建容器时要运行的命令。这也称为入口点。查看虚拟机和容器之间的区别here

容器不是新的;然而,在容器中打包应用程序并交付没有任何底层依赖的同一个容器是一件新鲜的事情,并且被广泛接受。这归功于像Docker这样将集装箱带入主流发展的技术。Docker提供了一种标准而简单的方法,用一个名为“Dockerfile”的文件来创建可移植的图像码头工人还提供了一个完整的生态系统,其中包括码头工人引擎,应用编程接口,命令行界面和可插拔的网络接口,存储,监测和日志记录。它实际上提供了一种在Linux和Windows环境下构建、测试、打包和部署软件的改进和简化的方法。

为了便于理解,我将使用Docker在文档中提供的简单应用程序here。对应用程序做了一些小的修改,以添加更多的配置。目标是使用这个简单的应用程序,并一直部署到Kubernetes,以维护管道工作流,并查看这个简单的应用程序将如何通过多个阶段和各种配置进行转换。

1.在本地创建一个应用程序并在浏览器中运行

我用的是Ubuntu操作系统,Docker版本18.03.1-ce。因此,下面提供的大多数指令都是在Ubuntu上执行的。其他Linux发行版的说明可能会有所不同。

完成第一节课的要求:

  • 任何Linux风格的操作系统(可以上网下载文件)
  • 码头工人主机(服务器和客户机)
  • 可视化代码编辑器(可选)或便于编辑的首选编辑器

为了在高层次上通过管道迁移任何应用程序,我们首先需要知道的是构建应用程序的所有要求,例如相关库、构建工具、配置以及任何其他强制性先决条件,例如操作系统的特定版本(尽管大多数应用程序都是平台无关的)。其次,我们看一下如何在安装后运行和测试应用程序。测试可能不是全面的测试。

对于当前应用程序,以下是详细信息:

  1. 这是一个用Python编写的网络应用程序
  2. 它需要Python 2.7或更高版本、一个Redis数据库和Flask框架
  3. 这个应用程序是独立于平台的,但是,我们将在Ubuntu中运行这个应用程序
  4. 需要pip (Python打包程序)来安装烧瓶和Redis包
  5. 就运行应用程序而言,默认情况下,它在端口8080上运行。但是,它可以配置为环境变量
  6. 默认情况下,Redis数据库本身在端口6379上运行
  7. 该网页可以在多台主机上运行,并连接到Redis数据库的单个数据库实例

这个应用程序提供了一个运行应用程序的主机名,并且还记录了一个网页在Redis数据库中被访问的次数

正如我们看到的,这个应用程序很简单,但是它提供了两层并与数据库通信。

让我们首先在本地启动应用程序(不使用Docker)。遵循以下步骤:

1.创建文件“app.py”并添加以下代码。添加注释是为了便于理解特定部分。

from flask import Flask
from redis import Redis, RedisError
import os
import socket

# Connect to Redis
redis=Redis(host="localhost", db=0, socket_connect_timeout=2, socket_timeout=2)

app = Flask(__name__)

@app.route("/")

def hello():
    try:
    # Increment counter on web page access / refresh
        visits = redis.incr("counter")
    except RedisError:
    # If redis database is not connected below message will appear on the web page    
        visits = "<i>Can not connect to Redis, counter disabled</i>"


    html = "<body bgcolor={bg_color}>" \
           "<h3> {name} ! </h3>" \
           "<b>Hostname:</b> {hostname}<br/>" \
           "<b>Visits:</b> {visits}" \
           "</body>"

    # Environment properties
    # bg_color -> Background color of webpage
    # name -> User defined text that will come on the web page

    # "hostname" extracted from system where application runs
    # "visits" keeps track of counter to display number of times page is accessed

return html.format(bg_color=os.getenv("BGCOLOR","Green"),name=os.getenv("NAME","Hello Docker world"), hostname=socket.gethostname(),visits=visits)

# "port" on which application can be accessed. Make sure on local machine this port 9000 is available
if __name__ == "__main__":
    app.run(host='0.0.0.0', port=9000)


2.创建“requirements.txt”并在下面添加应用所需的包:

Flask
Redis



3.使用pip安装烧瓶和Redis:

$sudo pip install --trusted-host pypi.python.org -r requirements.txt

注意-如果您没有安装pip,请按照说明操作here.

4.如果您尚未安装Redis数据库,请安装并配置它

对于Ubuntu,请遵循以下说明;详细说明如下here

$sudo apt update


$sudo apt install redis-server


$sudo nano /etc/redis/redis.conf # ( change “supervised no” to “supervised systemd” )


$sudo systemctl restart redis.service


5.运行应用程序

$python app.py

输出:

* Serving Flask app "app" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
  Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://0.0.0.0:9000/ (Press CTRL+C to quit)


如您所见,服务器开始监听端口9000的请求。

6.测试该应用程序是否按预期工作

您可以打开浏览器,并访问http://localhost:9000

您应该会看到一个带有绿色背景的页面,以及运行该应用程序的主机名和带有数字的访问计数器。


如果访问Redis时出现错误,您将收到一条访问计数器的消息

无法连接到Redis,计数器已禁用

在这种情况下,验证Redis服务器是否已启动,应用程序代码在“连接到Redis”部分中的主机是“本地主机”。

到目前为止,我们知道如何在本地运行应用程序以及所有的需求。这些知识现在将帮助我们整理这个应用程序。

在本文的第二部分,我们将把这个应用程序打包成一个Docker映像,并旋转一个容器来打开这个应用程序,展示Docker的强大功能。