让我们深入了解一下Docker的构造以及构成它的基础要素。
我假设你已经对Docker有了一定的基础认知。如果你是新手,可以先参考我之前发布的文章。
相信您已经认识到Docker在DevOps领域的重要性。如今,这款强大的工具背后,必然存在一个精心设计、考虑周全的架构,不是吗?
但在我深入探讨之前,先让我们简单回顾一下传统的虚拟化系统和当下的虚拟化系统。
传统虚拟化与新一代虚拟化
在早期,我们通常会创建虚拟机,每个虚拟机都需要运行一个完整的操作系统,这会占用大量的存储空间,并且导致系统变得笨重。
而现在,在Docker容器的情况下,我们只需要一个单一的操作系统,资源可以在不同的容器之间共享。因此,它更加轻便,并且可以在几秒钟内快速启动。
Docker架构
下面是一个简化的Docker架构示意图。
现在,让我来详细解释一下Docker架构的各个组成部分。
Docker引擎
它是整个Docker系统的核心所在。Docker引擎是一个遵循客户端-服务器架构的应用程序,它被安装在宿主机上。Docker引擎由以下三个关键组件构成:
- 服务器:也称为Docker守护进程,名为
dockerd
。它负责创建和管理Docker镜像、容器、网络等。 - REST API:用于接收指令,并告知Docker守护进程应该执行哪些操作。
- 命令行界面(CLI):一个客户端工具,用于输入Docker命令。
Docker客户端
Docker用户可以通过客户端与Docker进行交互。当执行任何Docker命令时,客户端会将这些命令发送给dockerd
守护进程,然后由守护进程执行。Docker命令会调用Docker API。Docker客户端可以与多个守护进程通信。
Docker注册表
它是用于存储Docker镜像的位置。它可以是公共的Docker注册表,也可以是私有的Docker注册表。Docker Hub是默认的Docker镜像存储位置,是一个公共注册表。你也可以创建和运行自己的私有注册表。
当你执行docker pull
或docker run
命令时,所需Docker镜像会从配置的注册表中被拉取下来。当你执行docker push
命令时,Docker镜像会被存储到配置的注册表中。
Docker对象
在使用Docker时,你会接触到镜像、容器、卷、网络等;这些都被称为Docker对象。
镜像
Docker镜像是一种只读模板,其中包含了创建Docker容器的说明。Docker镜像可以从Docker Hub中直接获取并使用,或者你可以基于基础镜像添加额外的指令,创建新的、经过修改的Docker镜像。你也可以使用Dockerfile来创建自己的Docker镜像。Dockerfile包含所有创建和运行容器的指令,它会生成你的自定义Docker镜像。
Docker镜像包含一个只读的基础层,在其之上可以有一个可写的顶层。当你编辑Dockerfile并重新构建镜像时,只有被修改的部分会在顶层被重新构建。
容器
当运行Docker镜像时,会创建一个Docker容器。所有的应用程序及其运行环境都在这个容器内部运行。你可以使用Docker API或CLI来启动、停止或删除Docker容器。
以下是运行Ubuntu Docker容器的示例命令:
docker run -i -t ubuntu /bin/bash
卷
Docker生成并被Docker容器使用的持久数据存储在卷中。它们完全由Docker通过Docker CLI或Docker API进行管理。卷适用于Windows和Linux容器。相对于将数据持久化到容器的可写层,使用卷始终是一个更优的选择。卷的内容独立于容器的生命周期而存在,因此使用卷不会增加容器的大小。
你可以使用-v
或--mount
标志来启动带有卷的容器。在以下示例命令中,geekvolume
卷将与techblik.com
容器一起使用。
docker run -d --name techblik.com -v geekvolume:/app nginx:latest
网络
Docker网络是所有隔离容器进行通信的渠道。Docker中主要有五种网络驱动:
- Bridge:这是容器的默认网络驱动。当你的应用程序在独立的容器上运行时,你可以使用这个网络,即多个容器与同一个Docker主机通信。
- Host:这个驱动程序消除了Docker容器和Docker主机之间的网络隔离。当你不需要主机和容器之间的任何网络隔离时使用它。
- Overlay:这个网络使群服务能够相互通信。当容器在不同的Docker主机上运行,或者由多个应用程序形成群服务时使用它。
- None:这个驱动程序禁用了所有网络。
- macvlan:这个驱动程序为容器分配MAC地址,使其看起来像物理设备。流量通过容器的MAC地址在容器之间路由。当你希望容器看起来像物理设备时使用此网络,例如,在迁移虚拟机设置时。
结论
我希望这篇文章能够帮助你对Docker的架构及其基本组件有所了解。要学习更多内容,请进一步探索Docker。如果你有兴趣参加实践培训,可以查看这个Docker精通课程。
你喜欢这篇文章吗?请与世界分享你的想法!