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

程序员鱼皮

共 3091字,需浏览 7分钟

 ·

2024-08-06 13:15

在我的电脑上,Docker 服务一直都是自动启动的,除非电脑真的卡的不行了,我才会把Docker 服务停掉,节省点儿资源。

相信很多朋友也经常用 Docker,那你了解过 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更丰富的功能,包括自动扩缩容、自我修复、批处理、水平扩展等。

本文作者是朋友风筝哥,也是一位经验丰富的程序员和文章质量很高的博主,推荐给大家:


👇🏻 点击下方阅读原文,获取鱼皮往期编程干货。

往期推荐

鱼皮原创实战项目,保姆级教程!

每天那么多工作,我为什么能做到 "不忘事" ?

我用这个工具,一分钟搞定了简历!

25 届秋招交流群,限时开放

我用这个程序员面试刷题工具,吊打了面试官!

鱼皮的保姆级写简历指南,免费领

我开源了一套 RPC 框架,学爆它!

浏览 360
1点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
1点赞
评论
收藏
分享

手机扫一扫分享

分享
举报