Docker 用了那么久 了,还不知道它是如何工作的呢?

云计算 云原生
虽然 Kubernetes 宣布不再直接支持 Docker 了,但是实际上支持Containerd 就是支持 Docker了,所以默认 K8s 就是Docker 的编排工具。

Docker 构成三大件

Docker的架构主要由三个核心组件构成,这是 Docker 三大件。

图片图片

Docker Client

这是开发者与Docker交互的部分。无论你是直接使用 Docker 命令行,还是用 Docker desktop、OrbStack这些 GUI 工具,实际上都是在使用Docker客户端。包括使用 Dockerfile 实际上也是对 Client 命令的包装。

它负责将你输入的指令传递给Docker守护进程(Docker daemon),并显示出执行结果。

Docker Host

这是Docker运行的核心环境。在Docker主机上,最关键的部分就是Docker守护进程(Docker daemon)。它负责处理 Docker API 的请求,管理各种Docker对象,包括下面这几个:

• 镜像(Images):容器的只读模板,包含了运行应用所需的所有依赖和配置。 • 容器(Containers):镜像的运行实例,可以被启动、停止、删除等。 • 网络(Networks):容器间通信的桥梁。 • 数据卷(Volumes):用于数据持久化的机制。

Docker Registry

这是存储Docker镜像的地方。Docker Hub是默认的公共镜像仓库,国内也有不少的镜像站,虽然现在很多不能用了,包括各个云平台一般也有自己的镜像仓库,很多公司也会搭建公司内部的镜像仓库。

我记得15年我做 devops 的时候,公司就搭了镜像仓库,因为当时公司用的那些镜像都是高度定制化的,而且配置略复杂,搭建镜像仓库就很合适。

Docker 如何工作的

好了,了解了 Docker 核心组件后,我们再来看看Docker是如何工作的吧。

使用者启动一个容器一定是从一个镜像创建出来的,那就从镜像的构建、镜像上传、镜像拉取直到容器运行这几个阶段来看一下 Docker 的工作过程。

构建阶段

镜像的发布者可以通过 docker save 命令将自己的容器打包成一个镜像,但是更好的方式是直接编写Dockerfile,定义好各种依赖和参数。

最后使用docker build命令构建镜像,Docker客户端将指令发送给Docker守护进程。守护进程解析Dockerfile文件,根据其指定的参数和配置,创建一个符合要求的镜像。

分发阶段

使用docker push命令,将构建好的镜像上传到Docker仓库,不管是公共仓库还是内部仓库。

之后其他人就可以通过docker pull命令从仓库中获取这个镜像。到这一步大部分人应该都很熟悉了,镜像可能没打包过,但是用镜像启动容器应该是轻车熟路的。

运行阶段

使用docker run命令,Docker守护进程会基于指定的镜像创建并启动一个新的容器,如果之前没有用 docker pull命令拉取过,那会自动拉取。

容器在一个隔离的环境中运行,拥有自己的文件系统、网络和进程空间。

Docker的工作原理保证了所有使用这个镜像的环境都是一致的,这样就不会出现开发说:“在我的机器上是没问题的呀?在测试环境是可以的呀?”这样的问题了。

通过将应用及其依赖打包到一个标准化的单元(容器)中,Docker确保了应用可以在任何支持Docker的环境中一致地运行。

此外,Docker的轻量级特性使得它可以在同一台主机上同时运行多个容器,每个容器都是相互隔离的。这种隔离性和可移植性使得Docker在微服务架构、持续集成/持续部署(CI/CD)流程中发挥着重要作用。

Docker 、Dockerfile、Docker Swarm、K8S 之间的关系

Docker 和 Dockerfile

Dockerfile是一个文本文件,包含了一系列指令和参数。它用于定义如何构建Docker镜像。

当执行docker build命令时,Docker会读取Dockerfile中的指令,并据此创建一个Docker镜像。

可以将Dockerfile理解为镜像的"配方",而Docker则是"厨师",按照这个配方烹饪出最终的"菜肴"(镜像)。

Dockerfile是输入,Docker镜像是输出,而Docker平台则是将输入转化为输出的工具。

Docker 和 Docker Swarm

Docker Swarm是Docker原生的集群管理和编排工具。

当需要的容器变多了,并且经常有需要扩展容器的需求时,就需要编排工具了。

Docker Swarm则用于管理多个Docker主机组成的集群。可以将多个运行Docker的机器组合成一个虚拟的Docker主机,让运维人员轻松地在多台机器上部署和扩展Docker容器。

它提供了一些基本的编排功能,如服务发现、负载均衡、滚动更新等。

可以将Docker Swarm视为Docker的扩展,它使得Docker能够在集群环境中更好地工作。

Docker 和 K8s

Kubernetes,通常简称为K8s,是一个更加强大和复杂的容器编排平台。

Kubernetes最初是为Docker容器设计的,但它现在支持多种容器运行时,包括Docker和Containerd。

虽然 Kubernetes 宣布不再直接支持 Docker 了,但是实际上支持Containerd 就是支持 Docker了,所以默认 K8s 就是Docker 的编排工具。

Kubernetes提供了比Docker Swarm更丰富的功能,包括自动扩缩容、自我修复、批处理、水平扩展等。

责任编辑:武晓燕 来源: 古时的风筝
相关推荐

2019-12-24 09:49:02

微软英语浏览器

2022-08-11 17:14:37

Java

2022-12-09 09:46:55

插件Lombok

2016-07-22 17:55:07

云计算

2023-01-02 10:08:42

StampedLocAQS框架

2023-03-03 07:40:52

MySQLSQL命令

2022-07-17 06:53:24

微服务架构

2022-09-19 18:32:22

函数编程语言

2018-05-20 11:01:47

Siri语音助手手机

2010-03-12 09:15:28

Firefox新功能

2022-06-27 07:32:00

JavaArrayList语法糖

2018-09-02 15:43:56

Python代码编程语言

2020-12-14 07:51:16

JS 技巧虚值

2022-05-05 12:02:45

SCSS函数开发

2021-04-15 12:30:18

ServletSpringMVC 版本

2014-12-01 09:41:25

2021-03-18 14:02:56

iOS苹果细节

2021-10-22 09:41:26

桥接模式设计

2022-04-15 07:51:12

off-heap堆外内存JVM

2022-05-20 08:02:07

Mono-repoGit策略
点赞
收藏

51CTO技术栈公众号