← Back to blog

使用 Docker 将 Python 应用容器化

Category
使用 Docker 将 Python 应用容器化

Docker 是一种免费的开源解决方案,用于在轻量级、操作系统级虚拟化环境中开发、部署和管理应用。在本指南中,我们将演示如何在 Docker 容器中创建一个 Python 应用。

先决条件

要执行本指南中演示的步骤,你需要以下组件:

Docker 容器

当在同一环境中运行各种程序时,问题可能会(并且确实会)发生。添加的程序越多,环境就越不稳定。对普通用户来说这可能不是什么大问题;但对于关键任务应用,后果可能非常严重。

系统中引入的应用越多,攻击面就越大。一个被攻破的应用很容易导致整个系统崩溃。

为了解决这些问题,我们可以使用 Docker 容器进行软件级沙箱隔离:

  • 容器内的应用对文件的访问会受到限制。

  • 容器化应用无法看到系统中运行的其他进程。

  • 可以为容器分配特定数量的硬件资源。

  • 容器的网络端口不会暴露到外部。

  • 几乎任何内容都能在本地/生产环境之间保持一致的打包方式。

为了演示,我们将构建一个位于 Docker 容器中的简单 Python 服务器,将该容器转换为镜像,并在一个模拟生产环境中部署该镜像。

步骤 1 – 文件系统配置

为了托管项目,首先创建一个专用目录:

mkdir -pv python-server-container/
cd !$

在该目录中创建一个子目录 src,用于存放代码:

mkdir -pv src/

步骤 2 – 构建 Python 服务器

在此步骤中,我们将用 Python 创建一个简单的 HTTP 服务器。创建文件 server.py

touch server.py

在文本编辑器中打开它:

nano server.py

输入以下 Python 代码:

from http.server import HTTPServer, SimpleHTTPRequestHandler

def run(server_class=HTTPServer, handler_class=SimpleHTTPRequestHandler):
    """server entrypoint"""
    server_address = ("0.0.0.0", 8080)
    httpd = server_class(server_address, handler_class)
    print("starting server...")
    httpd.serve_forever()

if __name__ == "__main__":
    run()

这里:

  • 我们使用 HTTPServer 类,并从 Python 标准库请求处理器,从而保持程序简单。

  • 函数 run 会初始化一个 HTTPserver 实例。

  • 正如 server_address 参数所示,服务器会在端口 8080 上监听任何传入连接。

现在,我们验证服务器是否按预期工作。启动服务器:

python3 server.py

在新的终端中,我们可以使用 curl 向服务器发送请求:

curl -iv localhost:8080

或者,你也可以在 Web 浏览器中访问该链接:

http://localhost:8080

步骤 3 – 创建 Dockerfile

Dockerfile 包含生成 Docker 镜像所需的指令。文件中的指令会按顺序执行。了解更多关于 Dockerfile 的信息。

为我们的项目创建一个新的 Dockerfile

touch Dockerfile

现在,将必要代码写入其中。在文本编辑器中打开它:

nano Dockerfile

输入以下代码:

FROM python:latest

ENV SRC_DIR /usr/bin/src/test_server/src
COPY src/* ${SRC_DIR}/
WORKDIR ${SRC_DIR}

ENV PYTHONUNBUFFERED=1

CMD ["python", "server.py"]

这里:

  • 任何 Dockerfile 都必须以 FROM 指令开头。在本例中,我们声明 Python 作为 Docker 镜像的基础。

  • ENV SRC_DIR 指令指定容器目录的位置。

  • COPY 指令会从当前托管 Python 服务器的 src 目录复制文件。

  • 变量 PYTHONBUFFERED=1 指定 Python 会将打印和日志输出直接发送到 STDOUT。否则,日志不会被发送到任何缓冲区。

  • CMD 指令指定执行容器时默认运行的命令。在本例中,我们使用该指令启动 Python 服务器。

步骤 4 – 生成 Docker 镜像

Dockerfile 准备就绪后,我们现在可以构建镜像。运行以下 Docker 命令启动该过程:

docker build . -t python_server

这里:

  • -t 标志用于将我们的 Docker 镜像标记为 python_server

  • Docker 会下载所有必要组件,并将它们组合成一个镜像。

步骤 5 – 执行镜像

镜像已准备好部署。我们可以使用以下命令执行它:

docker run -p 8080:8080 python_server

这里,我们使用 -p 标志将本地机器的 8080 端口转发到 Docker 镜像。

我们可以使用 curl 轻松验证服务器是否已启动并运行:

curl -iv localhost:8080

步骤 6 – 终止服务器

在终端中按下 “Ctrl + C” 终止 Docker 进程:

步骤 7 – 导出和导入 Docker 镜像

现在,我们已经拥有一个托管 Python 服务器的可用 Docker 镜像。借助 Docker 的导出和导入功能,我们可以将其迁移到任何其他系统。

首先,查看当前系统中的 Docker 镜像列表:

docker images

我们的目标是刚刚创建的 python_server Docker 镜像。以下命令会将其导出为 TAR 归档:

docker save python_server:latest > python_server.tar

python_server.tar 文件传输到目标机器后,使用以下命令导入 Docker 镜像:

docker load < python_server.tar

总结

在本指南中,我们演示了如何基于 Python 应用构建 Docker 镜像。我们创建了一个简单的 Python Web 服务器,并从中构建了 Docker 镜像。该 Docker 镜像现在可以部署到任何环境中,并获得一致的行为表现。

想了解更多关于 Docker 的内容?请查看以下指南:

祝你计算愉快!

Preslav Dobrev

作者 · CloudSigma

评论

暂无评论。发表第一条评论吧。