Docker 是一个免费且开源的解决方案,用于在轻量级、操作系统级虚拟化中开发、部署和管理应用程序。在本指南中,我们将演示如何在一个 Docker 容器中创建一个 Python 应用程序。
前提条件
要执行本指南中演示的步骤,您将需要以下组件:
-
一个 Linux 系统。了解如何在 CloudSigma 上配置您自己的 Ubuntu VPS.
-
已安装并配置最新版本的 Docker。了解更多关于在 Ubuntu 上安装 Docker.
Docker 容器
在同一个环境中运行各种程序时,事情可能会(而且确实会)出错。添加的程序越多,系统就越不稳定。对于普通人来说,这可能没什么大不了的。然而,当涉及到关键任务应用程序时,可能会产生严重的后果。
系统中引入的应用程序越多,攻击面就越大。单个受损的应用程序很容易导致整个系统的崩溃。
为了解决这些问题,我们可以使用 Docker 容器进行软件级别的沙箱隔离:
-
容器内的应用程序对文件的访问权限将受到限制。
-
容器化的应用程序无法看到系统中运行的其他进程。
-
可以为容器分配特定数量的硬件资源。
-
容器的网络端口不会暴露到外部。
-
在本地/生产环境中对几乎所有内容进行一致的打包。
为了进行演示,我们将在 Docker 容器中构建一个简单的 Python 服务器,将该容器转换为镜像,并在一个虚拟的生产环境中部署该镜像。
步骤 1 – 文件系统配置
为了托管该项目,首先,我们将创建一个专用目录:
|
1 |
mkdir -pv python-server-container/ |
|
1 |
cd !$ |
在该目录下,创建一个子目录 src 来存储我们的代码:
|
1 |
mkdir -pv src/ |
步骤 2 – 构建 Python 服务器
在这一步中,我们将用 Python 创建一个简单的 HTTP 服务器。创建文件 server.py:
|
1 |
touch server.py |
在文本编辑器中打开它:
|
1 |
nano server.py |

输入以下 Python 代码:
|
1 2 3 4 5 6 7 8 9 10 11 |
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 上的任何传入连接。
现在,我们将验证服务器是否按预期工作。启动服务器:
|
1 |
python3 server.py |
![]()
在新的终端中,我们可以使用 curl 向服务器发送请求:
|
1 |
curl -iv localhost:8080 |

或者,您可以在 Web 浏览器中访问该链接:
|
1 |
http://localhost:8080 |
步骤 3 – 创建 Dockerfile
一个 Dockerfile 包含生成 Docker 镜像所需的指令。文件中的指令是按顺序执行的。 了解更多关于 Dockerfile.
为我们的项目创建一个新的 Dockerfile 用于我们的项目:
|
1 |
touch Dockerfile |
现在,我们将在其中引入必要的代码。在文本编辑器中打开它:
|
1 |
nano Dockerfile |
输入以下代码:
|
1 2 3 4 5 6 7 8 9 |
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 指令从 src 目录复制文件,该目录当前托管着 Python 服务器。
-
变量 PYTHONBUFFERED=1 指定 Python 将直接把输出打印并记录到 STDOUT。否则,日志将不会发送到任何缓冲区。
-
该 CMD 指令指定了执行容器时运行的默认命令。在这种情况下,我们使用该指令来启动我们的 Python 服务器。
步骤 4 – 生成 Docker 镜像
在 Dockerfile 准备就绪后,我们现在可以构建镜像了。运行以下 Docker 命令来启动该过程:
|
1 |
docker build . -t python_server |

这里,
-
该 -t 标志用于将我们的 Docker 镜像标记为 python_server.
-
Docker 将下载所有必要的组件并将其合并为一个镜像。
步骤 5 – 执行镜像
镜像已准备好进行部署。我们可以使用以下命令执行它:
|
1 |
docker run -p 8080:8080 python_server |

这里,我们使用 -p 标志将本地机器的 8080 端口转发到 Docker 镜像。
我们可以使用 轻松验证服务器是否已启动并运行curl:
|
1 |
curl -iv localhost:8080 |
步骤 6 – 终止服务器
在终端中,按 “Ctrl + C” 终止 Docker 进程:

步骤 7 – 导出和导入 Docker 镜像
我们现在拥有一个托管 Python 服务器的功能性 Docker 镜像。借助 Docker 的导出和导入功能,我们可以将其迁移到任何其他系统。
首先,检查当前系统中的 Docker 镜像列表:
|
1 |
docker images |

我们的目标是我们刚刚创建的 python_server Docker 镜像。以下命令将其导出为 TAR 归档文件:
|
1 |
docker save python_server:latest > python_server.tar |

将 python_server.tar 文件传输到目标机器后,使用以下命令导入 Docker 镜像:
|
1 |
docker load < python_server.tar |
结语
在本指南中,我们演示了如何从 Python 应用程序构建 Docker 镜像。我们创建了一个简单的 Python Web 服务器,并以此构建了一个 Docker 镜像。该 Docker 镜像现在可以部署在任何环境中,并期望获得一致的行为。
有兴趣了解更多关于 Docker 的信息吗?请查看以下指南:
祝您计算愉快!




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