跳至主要内容

将 Docker 映像作为容器运行:实用新手指南

本教程通过清晰示例、实用技巧与排障建议,教您如何使用 docker run 自信地运行 Docker 映像。
· 9分钟 阅读

使用 AI 探索

如果您在想如何运行 Docker 映像,您并不孤单。无论是刚从 Docker Hub 拉取了一个映像,还是自己构建的,运行它都是让应用真正“活起来”的关键一步。

本教程是面向初学者的 docker run 命令及其进阶用法指南。您将学习:

  • Docker 映像与容器到底是什么。
  • 如何用不同选项运行一个映像。
  • 以及如何像专业人士一样停止、删除和排障容器。

结束时,您将自信地启动自己的容器,并清楚了解幕后发生了什么。

理解 Docker 映像与容器

在进入命令示例之前,我们先用简单的语言理解一下 Docker 映像与容器。

如果您已经熟悉这些术语,欢迎直接跳到下一节!

什么是 Docker 映像?

Docker 映像是应用的不可变蓝图。它定义了容器所需的一切:代码、库、环境和配置。有了映像,您可以启动一个容器,也可以启动一百个,每次都保持一致。

那么映像从哪里来?通过 Dockerfile 构建。Dockerfile 中定义使用哪个基础映像、安装哪些依赖,以及应用如何运行。

准备好 Dockerfile 后,运行 docker build 命令。该命令按照文件中的步骤,将其转化为一个可复用的映像。

什么是 Docker 容器?

Docker 容器是 Docker 映像的活动实例。它让您的应用在独立隔离的环境中运行,确保无论宿主系统如何,行为都一致。

它遵循“构建一次,随处运行”的理念,因此您无需每次手动搭建环境。

映像 vs 容器

下表将映像与容器并排进行比较:

Image

Container 

An image is a standardized package that includes all the files, binaries, libraries, and configurations to run a container.

A runtime instance of an image.

An image is immutable. That means it cannot change until it is rebuilt.

The container is mutable. You can modify it while it’s running, install new packages, or change configuration files.

A Dockerfile (a set of instructions to build an image) creates an image.

An image creates a container.

Your computer stores image files.

A container runs in your memory.

如果您刚接触容器化,我们的Introduction to Docker 课程将通过动手示例带您掌握核心概念。

docker run 命令

当您执行 docker run 命令时,就是在告诉 Docker 基于某个映像启动一个新容器。

简单说,您是在隔离环境中启动一个程序。这个程序可以是一个简单的 Web 应用,也可以是包含多个进程的完整服务。

基本语法

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

  • [OPTIONS] - 额外标志,用于自定义容器的运行方式
  • IMAGE - Docker 映像名称
  • [COMMAND] -(可选)覆盖映像中的默认命令。
  • [ARG...]-(可选)参数。

常用标志与选项

  • -d:分离模式:在后台运行容器
  • -p:端口映射:要从浏览器访问服务(如 API 或 Web 应用),需要暴露端口。例如:-p 3000:3000 将您机器的 3000 端口映射到容器的 3000 端口。
  • --name:Docker 会给容器一个默认名称,您也可以用此标志自定义名称。
  • -v:用于将数据与容器本身分离存储,确保即使容器停止或删除,数据仍然存在。
  • --rm:当容器停止时自动删除它。
  • -e:用于传入数据库密码或 API 密钥,而无需将其硬编码在应用中。

交互式容器 vs 分离式容器

Docker 有两种运行方式:交互模式(-it)和分离模式(-d)。根据您的目标,每种模式都有适用场景。

  • -it:交互模式:如果您想通过终端直接在容器内工作,可以使用 -it 标志。它会让容器进入交互模式,您可以输入命令、查看输出并实时操作。
    • -i:保持标准输入打开,便于在容器内输入命令
    • -t:提供类似终端的界面
  • -d:分离模式:在后台运行容器,释放终端以执行其他任务。

随时掌握关键命令与最佳实践,请查看我们的Docker for Data Science 速查表。

拉取并运行 Docker 映像

现在您已经了解了 docker run 的语法,本节将演示如何创建自定义映像并运行它们。

使用 Docker Hub 上的映像

Docker Hub 就像容器映像的在线库。您可以获取预构建映像,也可以上传自己的映像与他人共享。它支持公共和私有仓库,既能公开与社区分享映像,也能为内部团队实施访问控制。

运行自定义映像

要运行 Docker 映像,您需要先用 Dockerfile 构建它。然后,您可以在本地运行,或推送到 Docker Hub 进行共享。

那么首先我们来创建一个 Dockerfile。示例如下:

# Use official Python base image
FROM python:3.11-slim
# Set working directory in the container
WORKDIR /app
# Copy requirements file and install dependencies
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Copy the rest of the app code
COPY . .
EXPOSE 5000
# Set default command
CMD ["python", "app.py"]

上面的 Dockerfile 表示什么?

  • FROM python:3.11-slim:基于 Python 3.11 的精简版基础映像
  • WORKDIR /app:将 /app 设为容器内工作目录。
  • COPY requirements.txt . :将本机的依赖清单移动到容器的应用目录。
  • RUN pip install --no-cache-dir -r requirements.txt:安装 requirements.txt 中的依赖。
  • COPY . . :将当前工作目录的代码(应用、配置文件等)复制到容器的应用目录。
  • CMD ["python", "app.py"]:从该映像启动容器时运行 app.py。

步骤 1. 构建 Dockerfile

来看下构建此 Dockerfile 时会发生什么。

  • 执行以下命令:
docker build -t my-python-app .

注意:要使该命令生效,您需要先在系统中完成 Docker 的安装与配置;本指南可帮助您完成。

显示在终端执行 docker build -t my-python-app 的结果的图像。

当您执行构建命令时,幕后会发生以下情况:

  1. Docker 读取 Dockerfile
  2. 从 Docker Hub 拉取 Python 基础映像
  3. 将工作目录设为 /app。
  4. 将 requirements.txt 复制到容器中。
  5. 使用 pip install 安装依赖。
  6. 将其余代码复制到 /app 中。
  7. 将最终映像打上 my-python-app 标签。

步骤 2:运行 Dockerfile

构建完成后,您可以用以下命令执行它:

docker run -p 5000:5000 my-python-app

运行后会发生什么:

  • 基于您的自定义映像 my-python-app 创建了一个新容器。
  • 将您机器的 5000 端口映射到容器中的 5000 端口(-p 5000:5000)。
  • 运行 CMD ["python", "app.py"] 并启动应用。
  • 由于 -d 选项(分离模式),容器会在后台运行。

此时,您可以在浏览器访问 http://localhost:5000,您会看到类似下面的页面,这意味着应用已在运行:

浏览器在 http://localhost:5000 显示“Hello from Docker!”消息的截图。

如果您从事机器学习工作,这份适用于 ML 与 AI 的优选 Docker 映像可以加速您的环境搭建。

使用带配置的映像运行

对于某些应用,您可能需要在特定配置下运行映像。以下是两个常见示例。

持久化数据

容器临时存储数据。一旦删除,数据就会丢失。卷(volume)是一种在容器外部存储数据的方式,因此即使容器被移除或重启,数据仍可保留。

要挂载一个卷,您需要运行类似如下的命令:

docker run -v my-volume:/app/data my-image

写入到 /app/data 的数据会保存在卷中,即使容器被移除也不会丢失。

传递环境变量

环境变量用于在运行时向 Docker 容器传递配置信息。这样无需修改 Docker 映像即可自定义容器行为。

有两种方式传递环境变量:

  1. 使用 -e 参数传递环境变量。示例命令如下:
docker run -e ENV=production -e DEBUG=False my-image
  1. 创建包含所有环境变量的 .env 文件,并在命令中传入。示例如下:
docker run --env-file .env my-image

示例 .env 文件:

ENV=staging
DEBUG=True
SECRET_KEY=mysecret

管理正在运行的容器

容器运行后,您可以查看、停止并访问它。下面看看如何操作。

查看活动容器

要列出系统上所有正在运行的 Docker 容器,执行 docker ps 或 docker container ls。该命令会显示容器 ID、映像、命令、端口、状态等信息。

docker ps
# or
docker container ls

若要包含所有容器——不仅是正在运行的,还包括已退出或已创建但未启动的,使用 -a 标志:

docker ps -a

仅查看最近创建的容器,请使用 -l(last)标志:

docker ps -l

如果您想查看按创建时间排序的所有容器,且最新的排在最前,运行:

docker ps -a --sort=created

停止并删除容器

要停止某个正在运行的容器,使用 docker stop,后接容器 ID 或名称:

docker stop <container_id_or_name>

要停止所有正在运行的容器,使用:

docker stop $(docker ps -q)
  • $(docker ps -q) 会返回所有正在运行容器的 ID 列表。

容器停止后,您可以用以下命令删除它:

docker rm <container_id_or_name>

要删除所有已停止的容器,运行:

docker container prune

若要更进一步并删除未使用的容器、卷、网络和映像,请查看Docker prune 指南。

访问容器日志与 Shell

  • docker logs - docker logs 命令批量获取执行时已有的日志。
  • docker exec - docker exec 允许您在已运行的容器内执行新命令,而无需停止或重启它。可以把它看作是在容器内打开了一个新的终端——方便您查看、运行脚本、检查日志或调试。
  • docker attach - docker attach 将您的终端直接连接到正在运行容器的主进程。这样您就能看到容器的实时输出(日志、提示等),如果进程接受输入,也可以与之交互。

常见问题排查

针对常见问题的简单解决方案。以下是运行 Docker 映像时的一些常见错误及处理思路。

错误 1:“Error response from daemon: pull access denied for alpine-python, repository does not exist or may require ‘docker login’: denied: requested access to the resource is denied.”

  • 含义:Docker 试图拉取一个映像(此处为 alpine-python)自 Docker Hub,但该映像不存在或为私有,且您未通过身份验证。
  • 解决方法:
    • 在 Docker Hub 上仔细检查映像名称与标签。
    • 如果是私有映像,运行 docker login 进行身份验证。
    • 如果从自定义注册表拉取,请确保映像确实存在。

错误 2:“No such image found: <image-name>:<tag>”

  • 含义: 您尝试在本地运行或标记一个映像,但该映像(或指定标签)在本机不可用。
  • 解决方法:
    • 使用 docker images 查看可用映像。
    • 显式拉取映像:
docker pull <image-name>:<tag>

错误 3:“manifest for <image>:<tag> not found: manifest unknown: The named manifest is not known to the registry.”

  • 含义: 通常在指定的映像或标签不存在时出现。
  • 可能的解决方案: 这些提示可解决大多数常见错误:
    • 核对映像与标签名称是否正确。
    • 参考 Docker Hub 或自定义注册表中的映像标签列表。
    • 使用 docker pull <image>:<tag> 拉取有效版本。
    • 如果在本地构建,请确保 Dockerfile 正确,并用以下命令构建映像:
docker build -t <image>:<tag> .

端口冲突与绑定失败

当多个容器,或容器与其他应用尝试使用同一端口时,就会发生端口冲突。

  • 解决方法:
    • 在运行容器时使用不同的宿主机端口:
docker run -p 8081:80 <image>
  • 停止当前占用端口的服务。
  • 用以下命令识别哪个进程在使用端口(如 8080):
lsof -i :8080

结语

运行 Docker 映像是使用容器最重要也最具赋能的一步,无论您是在启动一个简单的 Web 服务器,还是部署一个复杂的应用。借助 docker run、docker ps 和 docker stop 等少量命令,您已经能够自信地启动、管理并排查容器。

如果您准备更进一步,试着用 Dockerfile 构建自己的映像,探索更高级的 docker run 标志,或学习如何使用 Docker Compose 管理多个容器。

继续您的 Docker 学习之旅,推荐这些课程:

FAQs

我可以基于同一个 Docker 映像运行多个容器吗?

可以。您可以基于同一个映像运行多个容器。每个容器都是相互隔离的,并且可以有各自的设置、端口和环境变量。

如何将密钥或 API Key 安全地传入 Docker 容器?

使用 -e 标志设置环境变量,或使用 .env 文件并通过 --env-file 在运行时传入机密,而无需将其硬编码。

如何在后台运行 Docker 映像?

使用 -d 与 docker run 在分离模式下启动容器,这样终端仍可用于其他命令。

docker exec 和 docker attach 有何区别?

 docker exec 会在容器内开启一个新的 Shell 会话,而 docker attach 则连接到容器的主进程及其实时输出。

运行映像时为何会出现“pull access denied”?

通常意味着映像是私有的或拼写错误。请检查名称、标签,并确保您已使用 docker login 登录 Docker Hub。

容器停止后如何持久化数据?

使用 -v 标志挂载卷,将数据存储在容器外部,即使容器被删除数据也能保留。

用于开发的最佳容器运行方式是什么?

使用 -it 进入交互模式,并结合卷挂载与环境变量来模拟本地开发环境。

如何查出机器上哪些端口发生了冲突?

使用 lsof -i :<port> 确认哪个进程占用了特定端口,然后停止该进程或为容器选择其他宿主端口。

如何查看正在运行的 Docker 容器的日志?

使用 docker logs <container_id> 命令,从容器的标准输出和错误流中检索并查看日志。

Srujana Maddula

作者

Srujana Maddula

Srujana 是一名自由职业技术写作者,拥有计算机科学四年制学位。她擅长撰写各类主题的内容,包括数据科学、云计算、开发、编程、安全等众多领域。她热爱经典文学,也喜欢探索新的旅行目的地。

主题