- Docker 教程
- Docker - 首页
- Docker - 概述
- Docker - 在 Linux 上安装
- Docker - 安装
- Docker - Hub
- Docker - 镜像
- Docker - 容器
- Docker - 镜像仓库
- Docker - Compose
- Docker - 操作容器
- Docker - 架构
- Docker - 层
- Docker - 容器与主机
- Docker - 配置
- Docker - 容器与 Shell
- Docker - Dockerfile
- Docker - 构建文件
- Docker - 公共仓库
- Docker - 管理端口
- Docker - Web 服务器
- Docker - 命令
- Docker - 容器链接
- Docker - 数据存储
- Docker - 卷
- Docker - 网络
- Docker - 安全
- Docker - 工具箱
- Docker - 云
- Docker - 构建云
- Docker - 日志
- Docker - 持续集成
- Docker - Kubernetes 架构
- Docker - Kubernetes 的工作原理
- Docker - 生成式 AI
- Docker - 托管
- Docker - 最佳实践
- Docker 设置服务
- Docker - 设置 Node.js
- Docker - 设置 MongoDB
- Docker - 设置 NGINX
- Docker - 设置 ASP.Net
- Docker - 设置 MySQL
- Docker - 设置 Go
- Docker - 设置 Rust
- Docker - 设置 Apache
- Docker - 设置 MariaDB
- Docker - 设置 Jupyter
- Docker - 设置 Portainer
- Docker - 设置 Rstudio
- Docker - 设置 Plex
- Docker 设置 - Flame
- Docker 设置 - PostgreSql
- Docker 设置 - Mosquitto
- Docker 设置 - Grafana
- Docker 设置 - Nextcloud
- Docker 设置 - Pawns
- Docker 设置 - Ubuntu
- Docker 设置 - RabbitMQ
- Docker - 设置 Python
- Docker - 设置 Java
- Docker - 设置 Redis
- Docker - 设置 Alpine
- Docker - 设置 BusyBox
- Docker 设置 - Traefik
- Docker 设置 - WordPress
- Docker 有用资源
- Docker - 快速指南
- Docker - 有用资源
- Docker - 讨论
Docker - 容器与主机
Docker 容器是轻量级、可移植、自包含的单元,包含软件及其运行所需的一切:代码、运行时库和设置。它们在不同的环境中始终如一地工作;因此,可以保证软件在非生产环境和生产环境中都能以相同的方式工作。
另一方面,Docker 主机是安装并运行 Docker Engine 的机器。这些可能是物理服务器、虚拟机,甚至基于云的实例。
在本章中,让我们详细了解 Docker 容器与 Docker 主机之间的区别。
什么是 Docker 容器?
Docker 容器是轻量级、可移植的软件打包单元,不仅包含应用程序代码,还包含运行时和库以及在任何地方运行和执行相同的其他设置。它们作为任何主机操作系统上的独立进程运行。每个容器都必须共享操作系统内核,但与其他容器具有不同的环境。
这允许有效地利用资源。由于这种隔离,不同版本的软件及其依赖项不会相互干扰;因此,容器非常适合开发、测试和部署。Docker 容器支持轻松集成和持续部署,这有助于快速可靠地交付应用程序。
什么是 Docker 主机?
Docker 主机是安装 Docker Engine 的物理机或虚拟机;它创建了一个运行 Docker 容器的环境。它提供对 CPU、内存、存储和网络的访问,容器利用这些资源并作为独立进程运行,以允许它们共享主机的相同操作系统内核。
它隔离容器并管理资源,从而有效且安全地支持多个容器的运行。Docker 主机帮助组织灵活且可控地在各种环境中管理、扩展和部署容器化应用程序。
Docker 容器和主机的区别
Docker 为在容器内开发、交付和运行应用程序提供了一个强大的平台。尽管 Docker 容器和 Docker 主机是生态系统中的两个重要元素,但它们的角色却大不相同。
下表重点介绍了 Docker 容器和 Docker 主机之间的主要区别:
特征 | Docker 容器 | Docker 主机 |
---|---|---|
用途 |
轻量级、可移植且自包含的对象;它们包含一个应用程序及其所有依赖项。 这意味着软件在不同的环境中始终如一地运行。 |
提供 Docker 容器基本环境的物理机或虚拟机,通过运行 Docker Engine,提供 CPU、RAM 和存储空间等基本资源。 |
操作 | 作为主机操作系统上的独立进程运行。它们都将在相同的内核上运行,但具有独立的环境。 | 运行多个容器,管理它们之间的资源分配和隔离。 |
资源管理 | 与主机共享底层操作系统内核并有效地使用其资源,而无需整个操作系统实例的所有开销。 | 在许多容器之间共享可用的系统资源并有效地平衡它们。 |
隔离 | 在应用程序级别提供隔离,确保不同的应用程序及其依赖项不会相互干扰。 | 提供一个安全的容器运行环境,使用主机操作系统来保持隔离和控制。 |
部署 | 由于其“轻量级”特性,它们可以轻松地重新定位到不同的 Docker 主机,因此可在各种环境(从开发到生产)中移植和扩展。 | 这是部署容器的基础层,它提供了容器操作和编排所需的必要基础设施。 |
Docker 容器和主机如何相互交互?
Docker 容器和主机之间的交互是一个多维活动,Docker Engine 通过它来协调创建、管理和运行容器化应用程序。现在,让我们深入了解此概念的细节。
镜像管理
拉取镜像 − 当用户请求从本地不可用的镜像运行容器时,Docker Engine 会与容器注册表(如 Docker Hub)通信以下载该镜像。镜像充当容器的蓝图。
镜像存储 − 然后在主机的文件系统上进行下载镜像的结构化存储,允许 Docker Engine 有效地获取和进一步利用它们。
构建镜像(可选) − 如果要创建自定义镜像,则需要编写一个 Dockerfile 来描述如何构建镜像。此文件将由 Docker Engine 处理,执行每个指令将逐层创建一个镜像。
容器隔离和创建
命名空间隔离 − Docker 引擎使用内核命名空间为每个容器提供隔离的操作系统视图。这意味着每个容器都有不同的进程 ID、网络接口、挂载点等;因此,一个容器不会干扰另一个容器或主机。
控制组 (cgroups) − cgroups 用于限制和管理容器可以使用多少资源,从而确保容器之间的资源公平性,并避免一个容器消耗所有资源的问题。
联合挂载文件系统 − Docker 本身使用联合挂载文件系统,从而提供了一种处理容器中层的有效解决方案。这允许多个容器共享公共镜像层,同时保持其可写层以实现数据持久性。
网络
桥接网络 − 默认情况下,Docker Engine 在主机上建立一个虚拟桥接网络 - 例如 docker0,并将容器添加到此桥接网络,以便它们相互通信并在外部通信。
端口映射 − 您还可以公开容器上的端口并将其映射到主机上的端口。这样,该容器内的服务就可以从主机的网络或互联网访问。
自定义网络 − Docker 支持桥接、覆盖网络和 macvlan 等网络驱动程序来创建具有特定隔离需求的自定义拓扑。
存储
卷 − 卷是独立于容器的持久性存储。它们允许在容器之间共享数据,并在容器停止或删除后仍然存在。
绑定挂载 − 这是一种可以在主机和容器之间共享文件和目录的方式。它提供了很高的存储灵活性,但会失去隔离性。
运行时管理
运行/停止容器 − Docker Engine 运行容器生命周期的所有各个阶段,例如启动、停止、重新启动和暂停,具体取决于需要。您可以监视容器的资源使用情况(例如 CPU 和内存),查看日志以进行调试,并以其他方式了解应用程序的行为。
安全 − Docker 引擎实施安全措施以隔离容器,从而限制它们对主机资源的访问。还有许多标志和选项可用于管理功能和容器的安全配置文件。
与 Docker 容器和主机交互的命令
在这里,我们将重点介绍一些可用于与 Docker 容器和主机交互的命令:
Docker Run
“docker run”命令从指定的镜像启动一个新容器。您可以使用多个选项自定义容器的行为:
- -d (分离) − 在后台运行容器。
- -p (发布) − 映射容器和主机之间的端口。
- -v (卷) − 挂载用于数据持久性的卷。
- --name − 为容器分配自定义名称。
示例
$ docker run -d -p 80:80 nginx
它启动一个分离的 Nginx Web 服务器容器,并公开端口 80。
docker ps
“docker ps”命令列出主机上所有正在运行的容器。您可以使用它来监视容器的状态并获取有价值的信息,例如它们的名称、ID 或公开的端口。
示例
$ docker ps -a
它列出所有容器(正在运行和已停止)。
docker exec
“docker exec”命令允许您在正在运行的容器内执行命令。这就像 SSH 到远程机器一样。
示例
$ docker exec -it my-container bash
它在名为“my-container”的容器内启动一个交互式 Bash shell。
如何从主机访问 Docker 容器内运行的服务?
公开 Docker 容器内服务的最常见方法是将容器的端口映射到主机端口。您可以在运行容器时使用 -p 或 --publish 选项。
例如,docker run -p 8080:80 my-web-server
会将容器内端口 80 上运行的 Web 服务器暴露到本地端口 8080 上。此外,当您的主机运行 Docker Desktop 时,您可以使用特定的 DNS 名称“host.docker.internal”从容器内部访问主机上的服务。
结论
在本章中,我们讨论了 Docker 容器和主机的来龙去脉。我们了解了它们的本质、它们之间如何交互、它们之间的根本区别,以及可用于与 Docker 容器和主机交互的各种命令。