如何将一个Python应用程序容器化

157 阅读6分钟

如何将一个Python应用程序容器化

Docker是目前最流行的容器化技术之一。它允许你将一个应用程序和它的所有依赖关系打包成一个单一的、紧凑的、隔离的容器。这个过程被称为容器化。

为什么容器化应用程序很重要

一个外部库版本的微小差异就可以改变你的应用程序的功能,从而导致其行为的不同。因此,容器化的应用程序允许它以相同的方式执行,无论它被部署在哪个工作空间或计算机上。

Docker的魅力在于,如果你将你的应用程序容器化,并将镜像传输到你同事的电脑上,你可以确保该应用程序在两个设备上都有相同的性能。这是因为容器中包含了应用程序的所有依赖关系。

镜像和容器

Docker文件,是只读的模板,用来创建容器。因此,图像和容器是密不可分的,两者都是运行Docker软件平台所必需的。

目标

在这篇文章中,你将学习如何使用Flask和Docker Compose构建一个简单的Python应用程序。Docker Compose有助于管理容器和其他相关服务。

前提条件

  • 对Python和Flask的基本了解。
  • 对命令行的基本了解。
  • 一个代码编辑器(IDE),如VS Code或Pycharm。

通过以下链接安装Docker和Docker Compose。

第1步 - 应用程序结构

我们的应用程序最后看起来会是这样的。

    |---- docker-compose.yml
    |---- app
           |---- app.py
    |---- requirements.txt

使用我们的命令行,我们将为我们的应用程序建立一个新的文件夹,名为docker

进入你的命令提示符,输入下面的行。

你可以使用你的IDE中的集成命令行。

mkdir docker && cd docker

接下来,我们将在上面创建的docker 目录中创建我们的Docker Compose 文件。

touch docker-compose.yml

我们项目的结构现在应该是这样的。

docker
 |---- docker-compose.yml

在我们进一步讨论之前,让我们开发我们的Flask 应用程序。

第2步 - 建立我们的Flask应用程序

Flask是一个轻量级的Python框架,用于构建Web应用程序。在本教程中,我们将创建一个Flask网络应用,在浏览器上显示 "Flask Dockerized "信息。

创建一个名为flask 的新文件夹,并运行下面的命令来打开它。

cd flask

flask 目录内,创建一个新的文件夹,并将其称为app 。在app 目录内,创建一个app.py 文件。我们将在这个文件中为我们的Flask应用程序编写代码。

下面是我们简单的Flask应用程序的代码。

app.py

from flask import Flask # importing the flask class
app = Flask(__name__) # creating an instance of the Flask class
 
@app.route('/') # The primary url for our application
def hello_world(): # This method returns 'Flask Dockerized', which is displayed in our browser.
    return 'Flask Dockerized'
 
if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0') # This statement starts the server on your local machine.

第3步 - 勾勒关键需求

在这一步,我们需要创建一个requirements.txt 文件。它包含了运行我们的应用程序所需的依赖性或包。

为了创建这个文件,我们将使用下面的命令。

pip freeze > requirements.txt

当你打开requirements.txt 文件时,你应该看到以下几行。

  click==8.0.1
  colorama==0.4.4
  Flask==2.0.1
  itsdangerous==2.0.1
  Jinja2==3.0.1
  MarkupSafe==2.0.1
  Werkzeug==2.0.1

第4步 - 创建一个Dockerfile

Dockerfile是用来为我们的应用程序创建一个镜像。这个镜像将在任何安装了Docker 的主机或环境中运行。因此,我们的网络应用可以使用一个镜像在任何地方部署。

请注意,每个镜像都会生成一个Dockerfile。在本教程中,我们将只为我们的Flask应用程序构建一个镜像。

touch Dockerfile

我们需要在生成的Dockerfile中包含以下说明和参数。

Dockerfile

FROM python:3.8
 
WORKDIR /app
COPY . /app
 
RUN pip install -r requirements.txt
 
ENTRYPOINT ["python"]
CMD ["app.py"]

上面的Dockerfile ,包含了组装我们的镜像所需的命令。

让我们对我们的Dockerfile 中的内容做一个概述。

  • FROM python:3.8 - 一个Dockerfile必须以一个 指令开始,其参数是另一个镜像。 指令拉出了python:3.8镜像。FROM FROM

  • WORKDIR /app - 它类似于 。它将我们的工作目录设置为 。这将是我们容器的根目录。它运行Docker文件中紧随其后的任何指令,如 , , , , 或 。cd command /app COPY RUN ADD CMD ENTRYPOINT

  • COPY . /app - 该命令将文件从本地系统复制到Docker镜像上。在我们的例子中,它将把文件从当前文件夹(用 表示)复制到 目录中。. /app

  • RUN pip install -r requirements.txt - 该命令会安装我们的 文件中定义的所有依赖或包。requirements.txt

  • ENTRYPOINT ["python"] - 当镜像作为一个容器运行时,该命令被执行。

  • CMD ["app.py"] - 这条命令指定了容器初始化时要执行的程序或文件。

  • ENTRYPOINT 与CMD指令类似,它允许你定义容器启动后将运行的应用程序。无论你在 ,在我们的例子中是 ,都将被附加到 指令中,也就是 。CMD app.py ENTRYPOINT python

这里是容器启动时执行的指令。

docker run python app.py

最后一步是构建我们的docker-compose.yml 文件。

第5步 - Docker Compose

Docker Compose是一种用于开发和运行多容器Docker应用程序的强大技术。你可以用Docker Compose配置你的应用程序的服务,使用YAML 文件。

Docker Compose是设置运行多个服务的复杂应用程序的最佳方式。我们只需要创建一个docker-compose.yaml 文件并指定所需的服务。

然后我们可以运行Docker Compose命令,使用下面的代码构建应用程序栈。

docker compose up

打开我们创建的docker-compose.yml 文件,然后添加以下服务。

docker-compose.yml

version: "3.7"
 
services:
  helloworld:
    build:
      context: ./
    ports:
      - 5000:5000  
      

让我们迅速对上述命令有一个概述。

  • 每个docker-compose.yml 文件必须以你打算使用的version 开始,除非使用version 1 。版本必须在文件的顶部指定,在这种情况下,version: "3.7" 。我们还需要在services section 中概述应用程序的服务,如上所示。

  • build: ./ 选项指定了包含Docker文件的目录的位置。在我们的例子中,该文件在根文件夹中。

  • ports 选项使我们能够通过定义的端口(5000:5000)在浏览器上访问我们的应用程序。

第5步 - 构建和测试

在包含docker-compose.yml的同一文件夹中运行以下命令。

docker-compose up

上述命令显示每个容器的输出。

这也可以用下面的命令来实现。

docker-compose up --build

使用上述命令时不需要指定文件名。Docker Compose应该检查当前工作文件夹内是否有docker-compose.yml文件。

你可以导航到http://localhost:5000/ ,访问你的Flask网络应用。

在你的浏览器中应该会显示一个Flask Dockerized

在Windows上,使用Ctrl + c 来停止Docker服务。

第6步 - Docker Compose命令

你可以通过执行下面的命令来查看所有Docker Compose命令和参数。

docker-compose

要列出任何正在运行的镜像,使用docker-compose images 命令。

docker-compose ps 命令将列出任何正在运行的容器。我们可以使用 停止所有服务。docker-compose stop

如果你对应用程序做了任何改动,你需要使用docker-compose up --build 命令重建镜像。

总结

本指南介绍了如何构建一个简单的Flask应用程序,并使用Dockerfile和Docker Compose将其容器化。

现在你可以利用这些知识来构建和容器化更强大的应用程序。