Docker 是一种运行于Linux和Windows等系统上的软件,用于创建、管理和编排容器。
docker的运作流程可以理解成: 去仓库(码头)把镜像(集装箱) 拉到 本地,通过运行(容器) 命令 把 镜像运行起来。
三个核心组成
1.镜像 — 集装箱
Docker镜像 - images:
一系列的文件 (采用linux文件联合功能-不同文件夹下的文件归类到同一目录下可见)
Docker 通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外展示为统一的文件系统。
查看镜像分层可以通过 docker image inspect 命令:
在Docker 主机上运行 dcoker image ls 命令:
Docker主机上获得镜像的操作被称为拉取(pulling),下面是 拉取ubuntu:latest镜像的命令:
docker image pull ubuntu:latest
2.仓库 — 超级码头
仓库的作用:把自己的镜像传输到仓库 再从仓库拉到另一个地方 实现传输的过程
仓库地址:
官方: hub.docker.com
国内:c.163.com (网易蜂巢)
国内通过配置阿里云加速器来实现镜像加速:
cr.console.aliyun.com/cn-hangzhou…
3.容器 — 运行程序的地方
容器 Containers:
容器的本质就是一个进程 可以想象成一个虚拟机。
基于镜像运行起来的容器属于多级分层结构:
只有最上面那一层可以写,下面的分层只能读, 同一个镜像 可以生成多个容器 独立运行。
通过 docker container ls 命令查看全部处于运行状态的容器
通过 docker container run 命令运行容器
执行 docker container exec 命令,可以将Shell 连接到一个运行中的容器终端。
三个核心命令
build 构建: 构建镜像
ship 运输:运输镜像 从仓库或主机上运输
run 运行:运行的镜像就是一个容器
Docker 引擎
Docker 引擎 由如下主要的组件构成:Docker客户端( Docker Client) 、Docker守护进程(Docker daemon)、containerd 以及 runc。它们共同负责容器的创建和运行。
Docker daemon: 是单一的二进制文件,包含诸如Docker客户端、Docker API 、容器运行时、镜像构建时等。
daemon 的主要功能包含镜像管理、镜像构建、REST API、身份验证、安全、核心网路以及编排。
runc: runc实质上是一个轻量级、针对Libcontainer进行了包装的命令行交互工具。
runc生来只有一个作用——创建容器,这一点它非常拿手,速度很快!不过它是一个 CLI包装器,实质上就是一个独立运行的容器运行时工具。
containerd: 它的主要任务是容器生命周期管理——start | stop | pause | rm...
Docker引擎技术中,containerd 位于 daemon 和 runc 所在的OCI层之间。随着时间的推移,containerd由原来仅用于生命周期管理到现在 被赋予更多的功能,比如镜像管理等。
启动一个新的容器
常用的启动容器的方法就是使用Docker命令行工具。下面的docker container run 命令会基于alpine:latest镜像 启动一个新容器。
docker container run --name ctrl -it alpine:latest sh
当使用Docker命令行工具执行如上命令时,Docker客户端会将其转换为合适的API 格式,并发送到正确的API端点。
一旦 daemon接收到创建新容器的命令,它就会向containerd发出调用。daemon 已经不再包含任何创建容器的代码了。
daemon 使用一种CRUD风格的API,通过gRPC与container 进行通信。
虽然名叫containerd,但是它并不负责创建容器,而是指挥runc去做。containerd将Docker镜像转换为OCI bundle,并让runc基于此创建一个新的容器。
然后,runc 与操作系统内核接口进行通信,基于所有必要的工具(Namespace、CGroup等)来创建容器。容器进程作为runc的子进程启动,启动完毕后,runc将会退出。
shim: 是实现无daemon容器,用于将运行中的容器与daemon解耦,以便进行daemon升级等操作,是不可或缺的工具。