1、docker是什么?
将环境和程序一起打包给到 服务器运行的工具软件。
2、基础镜像base image是什么?
操作系统:用户空间、内核空间
阉割操作系统,利用其的用户空间(因为应用程序运行在用户空间),文件系统,依赖库打包成一个类似“压缩包”的文件。这就是所谓的基础镜像base image。
3、dockerfile是什么?
有了base image还不够,我们还需安装一些依赖和创建一些文件夹,最后才是运行我们的目标应用程序。因此我们将所有的要做的事情以命令行的形式分行列举出来,类似于一份todo List。像这份列清楚了从操作系统到应用服务启动需要做哪些事情的清单文件就是所谓的dockerfile。
4、container image(容器镜像)是什么
dockerfile只是描述了做哪些事情,并没开始做,用命令docker build执行的时候,docker软件就按照dockerfile说明,一行行构建环境加应用程序,最终将这个环境和应用程序打包成一个类似“压缩包”的东西,我们把它称之为容器镜像。
只要将容器镜像传到任意一台服务器对该“压缩包”进行“解压缩”,就可以同时运行环境和程序。
5、registry是什么?
服务器那么多,挨个将容器镜像传到上去,压力给到发送方的网络带宽了。
因此弄一个镜像仓库,通过docker push到镜像仓库,有需要的服务器通过docker pull将镜像拉到机器上,这个负责管理镜像仓库推拉能力的服务叫做docker registry。
6、容器是什么?
通过指令docker pull在服务器上拿到容器镜像,通过docker run,将这个类似压缩包的容器镜像进行解压缩,获得一个独立的环境和应用程序,并运行起来,这样一个独立的环境和应用程序就是所谓的容器。我们可以在一个操作系统上同时跑多个容器,且这些容器互相独立和隔离。
7、容器和虚拟机的关系
区别:容器不带操作系统,虚拟机带有一个操作系统。容器只包含核心依赖库和配置文件等必要组件,它利用一个namespace的能力,让它看起来像一个独立的操作系统。再利用一个cgroup的能力限制它能使用的计算资源。因此容器是一个自带独立运行环境的特殊进程,底层用的是宿主机的操作系统内核。
8、docker 的架构原理
经典的client-server架构。client对应docker-cli,sever对应docker daemon。我们在命令行里敲docker命令,使用的就是docker-cli,docker-cli会解析我们输入的command命令,然后调用docker daemon守护进程提供的restful-api,守护进程收到命令后,会根据命令创建和管理各个容器。
docker daemon架构:
docker daemon分成docker server和engine两层。docker server是个http服务器,负责对外提供操作容器和镜像api。接口接收到api请求后,会分发任务给engine层,engine层负责创建job,由job实际执行各种工作。
不同的docker命令会执行不同类型的job任务。
(1)docker build命令执行过程。
job根据dockerfile指令,像包洋葱皮似的一层层构建容器镜像文件。
(2)docker pull/push命令执行过程。
镜像推拉操作,job会根据外部的docker registry交互将镜像上传/下载。
(3)docker run命令执行过程。
job基于镜像文件调用containerd组件,驱使runC组件创建和运行容器。
9、docker compose是什么?多个容器一整套的部署。
docker容器本身是一个特殊的进程,但我们想部署多个容器,且对这些容器的顺序有一定的要求。比如一个博客,先启动数据库,再启动身份验证服务,最后启动博客微服务。因此普通做法是依次启动服务,但有更优雅的启动方式,通过一个yaml文件,写清楚要部署的容器有哪些,以及部署顺序,以及容器占有的cpu和内存信息。只需要通过docker compose命令解析yaml文件,将容器们一键按照顺序部署,就完成一整套的部署。
10、docker swam
它解决的是一整套服务,在多台服务器上的集群部署问题。如在a服务器上坏了,可以部署到b服务器上。还能根据需要对应用做扩缩容。
11、docker和k8s的关系。
k8s它会在多台node的服务器上调度pod进行部署和扩缩容。每个pod含有多个container,每个container本质上是一个服务进程。
k8s和swam的功能很像。
docker部署的容器就是k8s调度的pod里的container,它们都叫容器。docker compose基于多个docker container创建一整套服务,其实就是k8s里的pod。而docker swarn做的事情和k8s一样,本质就是在调度pod。
k8s称之为容器编排引擎,将它理解为以api编程的方式管理安排各个容器的引擎。