
图片由 Editor 使用 Midjourney 创建
当今的数字格局从未如此多样化。每个个人和公司都会选择自己偏好的工具和操作系统,从而形成一个多元化的技术系统。然而,这种多样性常常导致兼容性问题,使得确保应用程序在不同环境下的性能变得困难。
这就是 Docker 作为应用程序开发和部署的不可或缺的工具发挥关键作用的地方。Docker 使我们能够将任何应用程序打包到容器中,构建其所有依赖项,并将其与主机操作系统隔离。这种隔离正是它最出色的特性——它确保了应用程序在无论部署在何处都能一致地运行。
本文旨在成为 Docker 世界的入门指南。那么,让我们一起探索它吧。
为什么要使用 Docker?
Docker 在其在任何硬件上一致运行应用程序的能力方面表现出色。通过容器化您的应用程序,您创建了一个可移植且可复现的环境,可以部署在任何地方,从而消除了经典的“我的机器上可以运行”的问题。
要理解 Docker,有三个基本概念

作者提供图片
- Dockerfile:这是一个包含一系列关于如何构建镜像的指令的脚本。
- Docker 镜像:它是从 Dockerfile 创建的运行应用程序的模板。它用于启动容器。
- Docker 容器:Docker 镜像的运行实例。它是一个轻量级、独立且可执行的软件程序包,其中包含运行应用程序所需的一切。
简而言之,Dockerfile 定义了创建 Docker 镜像的步骤,该镜像充当启动称为容器的进程的模板。
简单吧?
现在让我们学习如何使用我们自己的应用程序来执行此过程。
安装 Docker
要开始使用 Docker,您需要在您的机器上安装它。Docker 为包括 Windows、macOS 和各种 Linux 发行版在内的不同操作系统提供了安装包。
您可以按照 Docker 网站上提供的安装指南 在您的系统上设置 Docker,安装起来相当容易。安装完成后,您的本地机器上就会有 Docker Hub。
Docker 基础知识
要 Docker 化一个应用程序,我们总是从环境中的 Dockerfile 开始。这个文件描述了您的应用程序运行的环境以及构建它的步骤。
让我们设想一下,我们有一个简单的应用程序,它首先要求用户输入一个数字,然后返回该数字的平方。我知道这个应用程序非常简单,但它非常适合理解 Docker 的工作原理。
1 2 3 4 5 6 7 8 |
import numpy as np def calculate_square_root(number): return np.sqrt(number) if __name__ == "__main__": number = float(input("Enter a number to calculate its square root: ")) print(f"The square root of {number} is {calculate_square_root(number)}") |
在设置此应用程序时,我们需要知道的第一件事是它在 Python 上运行。所以,无论我们将其部署在哪里,Python 都必须是我们的基础镜像。
此外,此应用程序还依赖于 NumPy。由于 NumPy 不是默认的 Python 库,我们需要确保它在应用程序运行时可用。总而言之,有两个主要依赖项:
- 基础镜像:Python
- 依赖项:NumPy
虽然不是必需的,但始终拥有一个 requirements.txt 文件并包含脚本所需的所有库是一个好习惯。在这种情况下,我们只会添加 numpy 库。
那么,现在让我们了解如何容器化这个脚本
步骤 1 - 定义 Dockerfile
要定义 Dockerfile,了解应用程序的结构很重要。通常,我将 Dockerfile 放置在与我的主脚本和 requirements.txt 文件相同的级别。但是,对于更复杂的应用程序,您可能需要将文件组织到不同的目录中。在这些情况下,在 Dockerfile 中指定文件位置时,考虑这些目录级别至关重要。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# 从 Docker Hub 使用官方 Python 镜像 FROM python:3.9-slim # 设置工作目录 WORKDIR /app # 将 requirements 和主脚本复制到容器中 COPY requirements.txt main.py ./ # 安装依赖项 RUN pip install --no-cache-dir -r requirements.txt # 设置入口点以运行 Python 脚本 ENTRYPOINT ["python", "main.py"] |
在这个 Dockerfile 中:
- “FROM python:3.9-slim”:此行指定基础镜像,在此情况下为 Python 3.9,Docker 从 Docker Hub 拉取。
- “ADD requirements.txt 和 main.py .” :此命令将 main.py 文件添加到容器中。
- “RUN pip install requests”:此命令在容器内安装 requests 库。
- “ENTRYPOINT [“python”, “./main.py”]”:此命令运行应用程序。
Dockerfile 中的每一行代表一个层,为了优化处理,Docker 会缓存未更改的层。这意味着为了利用此缓存机制,最好将不经常更改的层放在 Dockerfile 的开头。
这样,Docker 就可以重用这些缓存层,从而加快构建过程。
既然我们已经有了 Dockerfile,我们需要运行本地 Docker Hub 并进入第二步。
步骤 2 - 构建和运行 Docker 镜像
准备好 Dockerfile 后,您可以通过在终端上执行以下命令来构建和运行 Docker 镜像。
1 |
docker build -t app-name . |
在此命令中:
- “-t my-python-app”:将镜像标记为 my-python-app。
- “.”:将当前目录指定为构建上下文。
如果您查看 Docker Hub,将会在您在上一个命令中使用的名称下出现一个新镜像。在我的例子中,我称之为 sqrt-calculator。

Docker Desktop 界面截图
步骤 3 - 运行 Docker 容器
要运行您刚刚创建的 Docker 镜像,请在终端中使用以下命令:
1 |
docker run app-name |
此命令从 my-python-app 镜像启动一个容器并运行应用程序。尽管您的本地环境中没有安装必需的库,但您仍然可以在 Docker 容器内执行代码,因为它包含了应用程序运行所需的所有依赖项。
简而言之
- Docker 的作用和重要性:Docker 通过容器化应用程序并确保跨不同系统的性能一致性,解决了多元化技术环境中的兼容性问题。
- 核心组件:Dockerfile 包含构建 Docker 镜像的指令,该镜像充当运行容器的模板。容器是打包运行应用程序所需的一切的实例。
- 构建和运行容器:要使用 Docker,请创建一个定义应用程序环境和依赖项的 Dockerfile,使用 docker build -t app-name . 构建 Docker 镜像,并使用 docker run app-name 运行容器,从而使您的应用程序能够一致地运行,而无需考虑本地库的安装。
如果您想查看我的代码,您可以在 以下 GitHub 仓库 中找到它。
你好 Josep,
干得好。有一个错别字,“docker build -t app-name .” 应该是 “docker build -t my-python-app .”。
您是怎么知道要使用哪个基础镜像来运行 Python 的?
Lucian
你好 Josep,
您可能想以交互方式运行 docker:docker run -i app-name
希望这有帮助。
大卫