Docker - 容器



Docker 容器是 Docker 镜像的运行时实例。可以通过实例化镜像来创建它们。Docker 容器正在彻底改变软件开发、部署和管理。从本质上讲,Docker 容器将应用程序及其所有依赖项捆绑到一个紧凑、轻量级的包中。它们可以通过在操作系统级别使用虚拟化,在各种计算环境中可靠地运行。

这种封装是通过使用**Docker 镜像**来实现的。镜像本质上是包含运行特定应用程序所需的所有文件、库和配置的蓝图。由于容器将应用程序及其依赖项与底层系统隔离开来,因此它们在各种环境中提供一致性和可预测性。

Docker 容器充当具有其自己的文件系统、网络接口和资源的独立进程,但它们轻量且高效,因为它们与主机操作系统共享相同的内核。它们依赖于 Docker 生态系统的重要组件才能工作,包括构建、启动和管理容器的 Docker Engine,以及充当 Docker 镜像存储库的 Docker Registry。

在本章中,让我们了解容器的工作原理以及您最常使用的重要的 Docker 容器命令。

Docker 容器的关键概念

以下是 Docker 容器背后的关键概念和原则。

容器化

从本质上讲,容器基于容器化的概念,即将应用程序及其所有依赖项打包到一个单一软件包中。此软件包称为容器镜像,其中包含运行应用程序所需的所有必要的运行时环境、库和其他组件。

隔离

Docker 容器使用操作系统级虚拟化来提供应用程序隔离。每个容器都作为独立的进程运行,具有自己的文件系统、网络接口和进程空间,独立于主机系统。

通过保持彼此独立,容器通过这种隔离避免相互干扰。

Docker Engine

Docker Engine 是 Docker 容器背后的核心;它构建、启动和维护它们。Docker Engine 由两个组成部分构成:在后台运行的 Docker 守护进程和允许用户通过命令与 Docker 守护进程通信的 Docker 客户端。

镜像和容器生命周期

Docker 容器生命周期的第一步是创建容器镜像。此镜像是使用 Dockerfile 构建的,Dockerfile 描述了应用程序的依赖项和配置。

创建镜像后,可以使用它来实例化容器,容器是正在运行的镜像实例。可以单独启动、停止、暂停和重新启动容器。

资源管理

Docker 容器由于其共享内核体系结构和轻量级设计,提供有效的资源管理。由于容器共享主机操作系统的操作系统内核,因此减少了开销并加快了启动时间。

Docker 还提供用于监控和控制资源使用的工具,以确保最佳性能和可扩展性。

可移植性

Docker 容器的主要优势之一是其可移植性。容器镜像是独立的单元,可以轻松地部署和分发到各种环境中,从生产到测试和开发。

这种可移植性简化了部署过程并降低了兼容性问题的可能性,实现了“一次构建,随处运行”。

Docker 容器生命周期

Docker 容器生命周期包含五个基本阶段:创建、启动、暂停、退出和死亡。生命周期由其阶段表示,从创建和执行到终止和可能的恢复。

了解这些阶段对于有效地管理 Docker 容器并在容器化环境中确保其正确运行至关重要。

Docker Containers 1

让我们探索 Docker 容器生命周期的各个阶段

创建状态

“创建”状态是第一个阶段。当使用 docker create 命令或类似的 API 调用创建容器时,它将进入此阶段。处于“创建”状态的容器尚未运行,但它确实作为一个静态实体存在,其所有配置设置都已定义。

此时,Docker 预留了容器所需的存储卷和网络接口,但容器内的进程尚未启动。

启动状态

“启动”或“运行”状态是生命周期的下一阶段。当使用 docker start 命令或等效的 API 调用启动容器时,它将进入此阶段。

当容器处于“启动”状态时,其进程将启动并开始运行其镜像中指定的应用程序或服务。在此状态下,容器积极地使用 CPU、内存和其他系统资源来执行其分配的任务。

暂停状态

在容器的生命周期中,容器也可能进入“暂停”状态。当使用 docker pause 命令暂停容器时,其进程将挂起,从而停止其执行。

暂停的容器保持其资源分配和配置设置,但处于非活动状态。此状态有助于通过暂时停止容器执行(而无需完全停止)来节省资源和进行调试。

退出状态

处于“退出”状态的容器已完成执行并退出其主进程。容器在完成其预期任务或遇到导致其终止的错误时可以进入此状态。

“退出”的容器保持停止状态,保留其资源和配置设置,但停止运行任何进程。在此状态下,容器可以使用 docker rm 命令完全删除或使用 docker start 命令重新启动。

死亡状态

处于“死亡”状态的容器已遇到不可恢复的错误或已意外终止。容器化应用程序中的严重错误、底层主机系统中的问题或手动干预都可能导致容器进入此状态。

当容器处于“死亡”状态时,它处于非活动状态,并且 Docker 守护进程通常会释放或回收其资源。需要使用**docker rm 命令**删除处于此状态的容器,因为它们无法重新启动,从而释放系统资源。

重要的 Docker 容器命令

既然您已经了解了 Docker 容器的基础知识及其工作原理,那么让我们借助示例了解最重要的 Docker 容器命令。

列出所有 Docker 容器

可以使用**docker ps 命令**列出 Docker 主机上的正在运行的容器。默认情况下,它仅显示正在运行的容器,您可以使用 -a 或 --all 标志显示所有容器,包括已停止的容器。

$ docker ps
Docker Containers 2

此命令显示所有当前正在运行的容器的 ID、名称、状态和其他相关详细信息。如果没有任何容器正在使用,则返回空列表。

运行 Docker 容器

启动和创建 Docker 容器的主要命令是“docker run”。当您运行此命令时,如果本地尚未提供镜像,Docker 会从注册表中拉取镜像。然后,它通过基于该镜像生成一个来启动一个新的容器实例。

通过此命令,您可以指定多个选项,包括卷挂载、环境变量、端口映射等,以根据您的需求自定义容器配置。

$ docker run -d -p 8080:80 nginx
Docker Containers 3

在这种情况下,docker run 的分离模式 (-d) 基于“nginx”镜像创建一个新容器并在后台运行它。此外,它将主机端口 8080 映射到容器端口 80 (-p 8080:80),从而允许访问容器中托管的 NGINX Web 服务器。

停止 Docker 容器

可以使用 docker stop 命令优雅地停止容器,该命令向容器的主进程发送 SIGTERM 信号。这使容器能够在关闭之前完成任何清理操作,例如保存状态或断开网络连接。

$ docker stop my_container
Docker Containers 4

此命令停止当前正在运行的“my_container”容器。Docker 会等待容器在可配置的持续时间内(默认情况下为 10 秒)优雅地结束其生命周期。如果它在此时间限制内未停止,Docker 将自动使用 SIGKILL 信号终止容器。

暂停正在运行的容器

可以使用 docker pause 命令暂时挂起正在运行的容器的进程或暂停其执行。这对于暂时释放系统资源、调试和解决问题可能很有用。

$ docker pause my_container
Docker Containers 5

此命令停止容器“my_container”的运行。当暂停时,容器不使用任何 CPU 或内存,因为其进程已冻结。但是,容器保留其资源分配和配置设置。

恢复 Docker 容器

当容器暂停时,可以使用 docker unpause 命令重新执行其进程。通过使用此命令,容器将返回到其初始状态并撤消 docker pause 命令的效果。

$ docker unpause my_container
Docker Containers 6

上述命令恢复暂停的容器“my_container”的执行,并允许其进程照常继续。

重启容器

一种快速停止和重启正在运行的容器的简单方法是使用 docker restart 命令。它常用于在容器遇到问题后强制其重新初始化,或将更改应用于正在运行的容器的配置。

$ docker restart my_container 
Docker Containers 7

此命令会暂停然后恢复名为“my_container”的容器的执行。容器内的进程会在重启时停止然后重新启动,使任何修改生效。

在正在运行的 Docker 容器中执行命令

要在已运行的容器内运行命令,请使用 docker exec 命令。它允许用户在容器的环境中运行任意命令,例如启动 shell 会话或执行特定程序。

$ docker exec -it my_container bash 
Docker Containers 8

此命令在交互式 shell 会话(bash)中打开当前正在运行的“my_container”容器。为了启用交互式输入/输出,-it 标记分配一个伪终端并保持 STDIN 打开,即使它未连接也是如此。

删除 Docker 容器

要删除一个或多个 Docker 容器,可以使用 docker rm 命令。可以指定要删除的容器的 ID 或名称。默认情况下,此命令仅删除已停止的容器;要强制删除正在运行的容器,可以使用 -f 或 --force 标记。

$ docker rm my_container 
Docker Containers 9

以上命令删除名为“my_container”的容器。除非使用 -f 标记强制删除,否则容器必须停止运行才能被删除。

要清理 Docker 主机上的磁盘空间,可以使用 docker container prune 命令删除所有已停止的容器。这是一种清理空闲容器并回收资源的实用方法。

$ docker container prune
Docker Containers 10

Docker 会在继续之前请求确认,但您可以通过使用 -f 或 –force 标记传递它来忽略此提示。

如果要一起删除所有 Docker 容器,可以使用两个命令的组合 - “docker ps -aq”,它用于获取所有容器 ID 的列表,并将其与“docker rm”命令结合使用以删除所有容器,包括正在运行的容器。

$ docker rm $(docker ps -aq) 
Docker Containers 11

以上命令删除 Docker 主机上的每个容器,无论它是否正在运行或已停止。

结论

总而言之,Docker 容器彻底改变了现代软件开发构建、部署和管理应用程序的方式。Docker 容器是轻量级且可移植的环境,提供了许多优势,例如一致性、可重复性、资源效率、可扩展性和可移植性,用于打包和运行应用程序。

开发人员可以使用各种 Docker 命令和工具轻松创建、部署和管理容器,从而促进更有效的开发工作流程并增强团队协作。随着容器化的普及,Docker 容器将继续成为软件开发生态系统的重要组成部分,帮助企业更快地创新并更有效地为客户提供价值。

常见问题

Q1. Docker 是容器还是虚拟机?

Docker 是一个容器化平台,这意味着它使用容器来运行和打包应用程序。与虚拟机 (VM) 虚拟化硬件不同,Docker 容器共享宿主机内核并虚拟化操作系统。

因此,由于它们不需要为每个应用程序提供单独的操作系统实例,因此 Docker 容器比虚拟机 (VM) 更轻量级且更高效。

Q2. Docker 和 Kubernetes 之间有什么区别?

虽然它们有不同的用途,但 Docker 和 Kubernetes 都是容器生态系统中广泛使用的工具。Docker 提供用于构建容器镜像和在本地或生产环境中运行容器的工具。它主要用于创建、管理和执行容器。

Kubernetes 是一个容器编排平台,可以自动化容器化应用程序的部署、扩展和管理。Docker 专注于容器化过程本身,而 Kubernetes 管理容器集群并确保它们具有弹性、可扩展性和可用性。

Q3. 如何运行 Docker 容器?

您可以使用“docker run <image>”命令启动 Docker 容器。您必须提及 Docker 镜像的 ID 或名称,该镜像可在本地或通过 Docker Hub 等注册表获取。然后,使用 docker run 命令后跟镜像的名称或 ID 来创建并从该镜像启动容器。为了进一步自定义容器的配置,您可以选择提供更多参数,例如端口映射、环境变量和卷挂载。

Q4. 什么是 Docker Daemon?

在主机系统上监控 Docker 容器的后台进程称为 Docker 守护进程或“dockerd”。除了执行容器生命周期任务(包括构建、启动、停止和删除容器)外,它还负责管理容器镜像、网络和卷。为了管理容器资源,Docker 守护进程与主机操作系统的内核交互,同时侦听来自 Docker 客户端的 Docker API 请求并在用户的代表下执行这些请求。

Q5. Docker 容器的生命周期是怎样的?

Docker 容器的生命周期可能因其配置、创建方式以及它是在附加模式还是分离模式下运行而异。Docker 容器通常会无限期运行,除非其主进程结束或用户手动停止或终止它。

当容器处于分离模式 (-d) 时,它们会在后台运行,直到使用 docker stop 命令显式停止它们,或直到 Docker 守护进程重新启动。重启策略是另一种设置容器的方式,以便在发生故障或停止时自行重启。

广告