一、什么是 Docker
Docker 最初是 dotCloud 公司创始人在法国期间发起的一个公司内部项目,它是基于dotCloud 公司多年云服务技术的一次革新,并于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 GitHub 上进行维护。
在 2013 年底,dotCloud 公司决定改名为 Docker。Docker 最初是在 Ubuntu 12.04 上开 发实现的;Red Hat 则从 RHEL 6.5 开始对 Docker 进行支持。
Docker 使用 Google 公司推出的 Go 语言进行开发实现,基于操作系统内核中的 Cgroup (资源控制)、Namespace(资源隔离)与 OverlayFS(数据存储)等技术,实现基于操作 系统层面的(应用)虚拟化技术。
Docker 运行层次图解:
前提条件: 操作系统需要支持运行 Docker
每个操作系统中运行一个 Docker 进程
二、Docker 发行版
Docker 从 1.13.x 版本开始,版本分为企业版 EE 和社区版 CE,版本号也改为按照时间线来发布,比如 17.03 就是 2017 年 3 月,有点类似于 ubuntu 的版本发布方式。 Docker EE(企业版),Docker CE(社区版),在 CentOS 系统中可以使用 docker version 查看版本信息
[root@master ~]# docker version Client: Docker Engine - Community Version: API version: Go version: Git commit: Built: OS/Arch: Experimental: 19.03.5 1.40 go1.12.12 633a0ea Wed Nov 13 07:25:41 2019 linux/amd64 false
三、Docker 基本实现原理
1、操作系统的 NameSpace 隔离系统资源技术,通过隔离网络、PID 进程、系统信号量、文件系统挂载、主机名与域名, 来实现在同一宿主机系统中,运行不同的容器,而每个容器之间相互隔离,运行互不干扰。
2、使用系统的 Cgroups 系统资源配额功能, 限制资源包括: CPU、Memory、Blkio(块设备)、Network。
3、 通过 OverlayFS 数据存储技术, 实现容器镜像的物理存储与新建容器存储。
四、讲解容器基本实现原理
1、Linux NameSpace
当一台物理主机(宿主机)运行容器的时候, 为了避免容器所需系统资源之间相互干扰与。所以 Docker 利用操作系统的隔离技术-NameSpace, 来实现在同一个操作系统中,不同容器之间的资源独立运行。
Linux Namespace 是 Linux 系统提供的一种资源隔离机制,可实现系统资源隔离的列
表如下:
UTS - 用于隔离 HostName 和 DomianName
IPC - 用于隔离进程间通信
PID - 用于隔离进程 ID
Network - 用于隔离网络
User - 用于隔离用户和用户组 UID/GID
2、查看系统资源隔离
1.查看进程
[root@master jdk]# ps aux | grep ssh root 727 0.0 0.1 112796 4296 ? Ss 01:24 2.查看 NS [root@master-1 prometheus]# ll /proc/727 /ns/ total 0lrwxrwxrwx. 1 root root 0 8月 23 06:49 ipc -> ipc:[4026531839]
lrwxrwxrwx. 1 root root 0 8月 23 06:49 mnt -> mnt:[4026531840]
lrwxrwxrwx. 1 root root 0 8月 23 06:49 net -> net:[4026531956]
lrwxrwxrwx. 1 root root 0 8月 23 06:49 pid -> pid:[4026531836]
lrwxrwxrwx. 1 root root 0 8月 23 06:49 user -> user:[4026531837]
lrwxrwxrwx. 1 root root 0 8月 23 06:49 uts -> uts:[4026531838]
3、Cgroups (资源控制)
在操作系统解决了资源相互隔离的问题以后,还需要解决资源限制的问题,也就是避免在同一个操作系统中,防止有些资源消耗较大的容器,将整个物理机器(宿主机)的
硬件资源(CPU, Memory) 占满。
在 Linux 系统中能够控制的资源列表如下:
Memory - 内存限制
hugetlb - huge pages 使用量
cpu - CPU 使用率
cpuacct - CPU 使用率
cpuset
- 绑定 cgroups 到指定 CPUs 和 NUMA 节点 - block 设备的 IO 速度
innodb_lock_wait_timeout
- 限制子树 cgroups 总进程数
net_cls
- 网络接口设置优先级
devices
- mknode 访问设备权限
perf_event
- 性能监控
pids - 限制子树 cgroups 总进程数
查看系统实现的限制资源
[root@master nginx]# cat /proc/cgroups
#subsys_name hierarchy num_cgroups enabled
cpuset 8 3 1
cpu 3 61 1
cpuacct 3 61 1
memory 2 61 1
devices 4 61 1
freezer 9 3 1
net_cls 6 3 1
blkio 10 61 1
perf_event 5 3 1
hugetlb 7 3 1
pids 11 61 1
net_prio 6 3
4、OverlayFS
OverlayFS 是一种堆叠文件系统,它依赖并建立在其它的文件系统之上(例如 ext4fs 和 xfs 等),并不直接参与磁盘空间结构的划分,仅仅将原来系统文件中的文件或者目录进行"合并一 起", 最后向用户展示"合并"的文件是在同一级的目录, 这就是联合挂载技术, 相对于 AUFS (<1.12 早期使用的存储技术), OverlayFS 速度更快,实现更简单。
Linux 内核为 Docker 提供的 OverlayFS 驱动有两种:Overlay 和 Overlay2。而 Overlay2 是 相对于 Overlay 的一种改进,在 Inode 利用率方面比 Overlay 更有效。但是 Overlay 有环境需 求:Docker 版本 17.06.02+,宿主机文件系统需要是 EXT4 或 XFS 格式。
1、OverlayFS 实现方式
OverlayFS 通过三个目录:lower 目录、upper 目录、以及 work 目录实现,其中 lower 目录 可以是多个, upper 目录为可以进行读写操作的目录, work 目录为工作基础目录,挂载后内容 会被清空,且在使用过程中其内容用户不可见,最后联合挂载完成给用户呈现的统一视图称为 merged 目录。
2、Overlay2 命令行挂载操作
1.创建文件 [root@master ~]# mkdir /lower{1..3} [root@master ~]# mkdir /upper /work /merged 2.挂载文件系统 [root@master ~]# mount -t overlay overlay -o lowerdir=/lower1:/lower2:/lower3,upperdir=/upper,workdir=/work /merged
[root@master ~]# mount | grep merged
overlay on /merged type overlay (rw,relatime,seclabel,lowerdir=/lower1:/lower2:/lower3,upperdir=/upper,workdir=/work)
4.在/upper 目录中写入文件,在 merged 中可以显示
[root@master ~]# touch /upper/upper.txt
[root@master ~]# ll /merged/
total 0
-rw-r--r--. 1 root root 0 8月 23 07:19 upper.txt
5. 在 merged 中写入文件, 实际存储到了/uppper
[root@master ~]# touch /merged/d.txt[root@master ~]# ll /upper/
总用量 0
-rw-r--r--. 1 root root 0 8月 23 07:22 d.txt
-rw-r--r--. 1 root root 0 8月 23 07:19 upper.txt
注:如果没有 upperdir, merged 是只读的
[root@master ~]# umount /merged
[root@master ~]# mount -t overlay overlay -o lowerdir=/lower1:/lower2 /merged
[root@master ~]# touch /merged/c.txt
touch: 无法创建"/merged/c.txt": 只读文件系统
5、NameSpace、Cgroup 与 OverlayFS 关系
为了防止某个正在运行的容器大量占用宿主机的系统资源(CPU、Memory、Network), 那么将由操作系统的 Cgroups 功能进行资源限制(防止独占)。
容器运行的基础是需要镜像,并且新容器的运行也是需要存储支持的。在 Docker 中使用 OverlayFS 解决这一问题。
关系列表图:
五、Docker 优势与局限性
优势
1、Docker 让软件开发者与维护人员可以非常方便的启动应用程序以及将程序的依赖, 包到一个容器中,然后启动 Docker 应用到支持 Docker 的系统平台中,就可以实现应用 虚拟化。
2、Docker 镜像中包含了应用运行环境和配置文件,所以 Docker 可以简化部署多种应
用的工作。比如说 Web 应用、后台应用(Java/C++)、数据库应用、Hadoop 集群、消
息队列等等都可以打包成一个个独立的 Docker 应用镜像来部署。
3)提升宿主机(物理服务器/云虚拟机), 系统资源的利用率。
局限性
1、基本的 Docker 网络管理模式比较简单,主要是基于系统使用 Namespace 隔离。
2、与其他系统的网络连通性,使用自定义的地址网段,需要借助其他插件实现与其他网
段的互通, 提高了网络的整体复杂度。
3、容器中应用程序日志不方便查看与收集。
4、容器中无法运行 Windows
六、容器与虚拟机的区别
下图比较 Docker 和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用宿主机的操作系统,而传统虚拟化(KVM/XEN/VMware)方式则是在硬件层面实现,并且完全虚拟一个操作系统,这是两者最大的不同之处。
详细对比说明
1、 Docker 容器的启动可以在秒级实现,相比传统的虚拟机方式要快很多(分钟级)。 其 次,容器对系统资源的利用率很高,一台主机上可以同时运行数百个 Docker 应用。
2、 容器基本不消耗额外的系统资源,使系统的开销尽量小。传统虚拟机方式运行应用与虚
拟机的数量 1:1 (应用级别)
3、 虚拟机技术依赖物理 CPU 和内存,属于硬件级别的(特别是桌面虚拟化);而 Docker 构
建在操作系统上,利用操作系统的系统隔离技术运行,甚至 Docker 可以在虚拟机中运
行。
4、无需要硬件是否支持,在大多数主流的 Linux/Unix 与 Windows 系统上都支持。
虚拟化发展历程
七、Dokcer 架构与术语
Docker 使用客户端-服务器 (C/S) 架构模式,即可使用远程 API 来管理服务端和创建容 器。
Docker 容器需要通过 Docker 镜像来创建。
1、Docker C/S 架构逻辑图
1、Docker 分为客户端与服务端, 客户端可以管理本地的服务端(默认), 也可以管理远程 的服务端。
2、Docker 服务端在启动容器时需要从仓库获取启动镜像。
3、运行镜像分为两个部分:
a.默认的公共仓库。b.自建与第三方的私有仓库。
4、私有仓库有两种实现方式:
a. 使用 Docker Registry 部署。b. Vmware Harbor
2、Docker 基本术语
Docker 镜像(Images) Docker 镜像是用于创建 Docker 容器的模板。
Docker 容器(Container) 容器是独立运行的一个或一组应用。
Docker 客户端(Client) Docker 客户端通过命令行或者其他工具使用 Docker API(https://docs.docker.com/reference/api/docker_remote_api) 与Docker 的守护进程通信。
Docker 主机(Host) 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器