什么是Docker
Docker是一个用于开发,交付和运行应用程序的开放平台。可以创建轻量级的、可移植的、自给自足的容器,用于快速开发,交付和运行应用程序。其隔离和安全性使你可以在给定主机上同时运行多个容器。Docker容器是轻量级的,因为它们不需要虚拟机管理程序的额外负载,而是直接在主机的内核中运行。这意味着与使用虚拟机相比,可以在给定的硬件组合上运行更多的容器。你甚至可以在实际上是虚拟机的主机中运行Docker容器!
如果有点懵,推荐看这个:
https://juejin.im/post/5b260ec26fb9a00e8e4b031a
Docker能做什么(优势)
Docker | Build, Ship, and Run Any App, Anywhere
快速,一致地交付应用程序
Docker提供除内核外完整的运行环境,可保证开发,测试,生产环境的一致性,避免程序因不同环境而产生的各种bug。
Docker非常适合持续集成和持续交付(CI / CD)工作流程。
快速部署,扩展和迁移
Docker容器具有高度可移植性。Docker容器可以各种环境中运行,如云主机,物理机,虚拟机。
在同一硬件上运行更多工作负载
Docker轻巧快速,由于其共享内核的特性,启动快速占用内存小。Docker非常适合于高密度环境以及中小型部署,支持用更少的资源做更多的事情。
Docker和其他虚拟化技术区别
目前主流的虚拟化技术有KVM XEN ESXI(VMware) Hyper-V(Microsoft) , docker。按虚拟化类型可分为主机级虚拟化和容器级虚拟化:
主机级虚拟化:独立OS
type-I: 完全虚拟化,在硬件上运行hypervisor,所有guest os都装在这个hypervisor之上,不需要在宿主机上安装操作系统。
如:kvm、xen、vmare ESX/ESXI
type-II: 半虚拟化,在硬件上先运行Host OS,在此OS基础上运行hypervisor,所有guest os都装在这个hypervisor之上。
如: VMware Workstation、VirtualBox
主机级虚拟化有非常高的隔离能力,该级别的虚拟机有独立的操作系统,即独立的用户空间和内核空间,因此用户必须花费大量的时间来安装与设置虚拟机操作系统,接着才能开始安装开发或测试所需的应用。
该级别虚拟机更擅长于彻底隔离整个运行环境,如阿里云通过KVM隔离不同用户主机。如果仅用来隔离区分不同应用,就过于重量级了。
容器级虚拟化:共享宿主机的OS
相对于传统的虚拟化,容器级虚拟化不再为每一个虚拟机创建单独的内核,而是通过共享宿主机的操作系统内核,通过namespace进行隔离,通过cgroups进行资源控制,以此来进行虚拟化。该功能使得每一个容器都有单独的一组namespace(pid、net、ipc、mnt,uts和user),每一个容器都具备完整的运行环境,如特定的CPU、memory、可分配的cpu时间,IO时间,受限的内存大小(包括内存和SWAP),并提供容器对底层设备的访问。Docker通常用于隔离不同的应用,例如前后端分离的应用,api以及微服务。
支撑容器最主要的两个技术
namespacs简单介绍
Namespaces是linux内核的功能,该功能对全局系统资源的一种封装隔离,使得处于不同namespaces的进程拥有独立的全局系统资源,改变一个namespaces中的系统资源只会影响当前namespaces里的进程,对其他namespaces中的进程没有影响。从内核2.6开始,Linux支持六种不同类型的名称空间:
namespaces:
Mount namespaces:隔离了一组进程看到的文件系统挂接点集;
UTS namespaces:隔离由uname()系统调用返回的两个系统标识符-节点名和域名;
docker官网描述的是隔离内核和版本标识符(UTS:Unix Timesharing System),区别暂不清楚。
IPC namespaces :隔离某些进程间通信(IPC)资源;
PID namespaces:隔离进程ID号空间进程隔离;
Network namespaces:隔离网络相关的系统资源(网络设备,IP地址,IP路由表,/ proc / net目录,端口号);
User namespaces:隔离用户和组ID号空间(docker暂不支持该namespaces)。
从内核4.6开始,加入了cgroup namespace,docker中没用到,不做介绍。
cgroups 简单介绍
CGroups 是 Control Groups 的缩写,是 Linux 内核的功能,提供的一种可以限制、记录、隔离进程组 (process groups) 所使用的物理资源 (如 cpu memory i/o 等等) 的机制。
CGroups 典型子系统:
cpu 子系统,可以限制进程的 cpu 使用率。
cpuacct 子系统,可以统计 cgroups 中的进程的 cpu 使用报告。
cpuset 子系统,可以为 cgroups 中的进程分配单独的 cpu 节点或者内存节点。
memory 子系统,可以限制进程的 memory 使用量。
blkio 子系统,可以限制进程的块设备 io。
devices 子系统,可以控制进程能够访问某些设备。
net_cls 子系统,可以标记 cgroups 中进程的网络数据包,然后可以使用 tc 模块(traffic control)对数据包进行控制。
freezer 子系统,可以挂起或者恢复 cgroups 中的进程。
ns 子系统,可以使不同 cgroups 下面的进程使用不同的 namespace。
Docker架构
Docker使用C/S架构,后端是一个松耦合架构,各模块各司其职互相配合,支撑Docker的运行。Docker Daemon是Docker的守护进程,也就是Server端,负责构建,运行和分发容器等核心工作。用户可通过 Client与Daemon进行通信,通信方式可以是通过REST API或UNIX socket访问,因此Server端可以部署在远程,也可以部署在本地。
大致请求过程就是:
- Docker 客户端向 docker daemon 发送请求;
- Docker daemon 从 Docker Hub 上拉取镜像;
- Docker daemon 使用镜像运行了一个容器并产生了输出;
- Docker daemon 把输出的内容发送给了 docker 客户端。
Docker Daemon作为Docker的守护进程,在接收到Client发送的请求时,是如何具体工作的呢?
https://www.infoq.cn/article/docker-source-code-analysis-part1
Docker三大概念–镜像,容器和仓库
镜像(image)
Docker镜像是一个特殊的根文件系统,提供容器运行时所需的程序、库、资源、配置等文件,另外还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。
因为镜像包含操作系统完整的 root 文件系统,其体积往往是庞大的,因此在 Docker 设计时,就充分利用联合文件系统(UnionFS) 的技术,将其设计为分层存储的架构。
镜像构建时,会一层层构建,前一层是后一层的基础。镜像本身是只读的(read-only),每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。
镜像本身是只读的(read-only),在构建完成之后,便不可以再被修改。而上面我们所说的添加一层新的镜像,这中间实际是通过创建一个临时的容器,在容器上增加或删除文件,从而形成新的镜像,因为容器是可以动态改变的。
这种分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。
docker支持的文件系统:OverlayFS, AUFS, Btrfs, VFS, ZFS 和 Device Mapper,docker1.18默认使用的文件系统是overlayfs,存储驱动是overlay2 。
容器(container)
容器是通过镜像创建的,因此每个容器都有自己的根文件系统。
每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,即容器存储层,拥有读写权限。容器在删除时,容器存储层也会被删除,因此不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
仓库(Repository)
仓库(Repository)是集中存放镜像文件的场所。
常用仓库地址
- docker官方仓库
- 腾讯云(需登录): ccs.tencentyun.com/[namespace]/[registryname]
- 阿里云(需登录): registry.[region].aliyuncs.com/[namespace]/[registryname]
镜像加速地址
- https://registry.docker-cn.com
- https://dockerhub.azk8s.cn
- 阿里云镜像加速,需登录获取:[系统分配前缀].mirror.aliyuncs.com
-
daocloud镜像加速器
自建仓库 - docker官方有提供registry镜像,创建容器后可直接作为私有仓库使用;
- 搭建harbor
扩展
- 官网文档
- Docker 项目(github)
- namespaces详细介绍
- cgroups 详细介绍
- docker cgroups使用(官方github)
- 使用overlayfs文件系统(官网文档)
- docker命令介绍(官网文档)