一、docker容器之 - docker起源、Docker相关的架构和术语、Docker实现技术与原理与介绍

一、Docker的起源与发行版本

1.1、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(数据存储)等技术,实现基于操作 系统层面的(应用)虚拟化技术。
  • 最初实现是基于 LXC 技术,从 0.7 版本以后开始去除 LXC,转而使用自行开发的 libcontainer(容器管理技术)。 

 

1.2、Docker的发行版本

Docker 从 1.13.x 版本开始,版本分为企业版 EE 和社区版 CE,版本号也改为按照时间线来 发布,比如 17.03 就是 2017 年 3 月,有点类似于 ubuntu 的版本发布方式。
Docker EE(企业版),Docker CE(社区版)

在 CentOS 系统中可以使用 docker version 查看版本信息

# docker version 
Client: Docker Engine - Community 
 Version:           19.03.5 
 API version:       1.40 
 Go version:        go1.12.12 
 Git commit:        633a0ea 
 Built:             Wed Nov 13 07:25:41 2019 
 OS/Arch:           linux/amd64 
 Experimental:      false

  

二、Docker的实现原理

通过三个方面实现容器化技术的前置:

  1. 操作系统的 NameSpace 隔离系统资源技术,通过隔离网络、PID 进程、系统信号 量、文件系统挂载、主机名与域名, 来实现在同一宿主机系统中,运行不同的容 器,而每个容器之间相互隔离,运行互不干扰。
  2. 使用系统的 Cgroups 系统资源配额功能, 限制资源包括: CPU、Memory、Blkio(块 设备)、Network。
  3. 通过 OverlayFS 数据存储技术, 实现容器镜像的物理存储与新建容器存储。

 

2.1、Linux NameSpace

当一台物理主机(宿主机)运行容器的时候, 为了避免容器所需系统资源之间相互干扰 与。所以 Docker 利用操作系统的隔离技术-NameSpace, 来实现在同一个操作系统 中,不同容器之间的资源独立运行。 Linux Namespace 是 Linux 系统提供的一种资源隔离机制,可实现系统资源隔离的列 表如下:

  • Mount   - 用于隔离文件系统的挂载点
  • UTS    - 用于隔离HostName 和 DomianName
  • IPC   - 用于隔离进程间通信
  • PID    - 用于隔离进程 ID
  • Network   - 用于隔离网络
  • User   - 用于隔离用户和用户组 UID/GID 

查看Linux系统资源隔离:

1.查找进程 
[root@master jdk]# ps aux | grep ssh 
root        727  0.0  0.1 112796  4296 ?        Ss   01:24   0:00 /usr/sbin/sshd -D 
 
2.查看 NS 
[root@master-1 prometheus]# ll /proc/727 /ns/ 
total 0 
lrwxrwxrwx 1 root root 0 Nov 23 22:48 ipc -> ipc:[4026531839] 
lrwxrwxrwx 1 root root 0 Nov 23 22:48 mnt -> mnt:[4026531840] 
lrwxrwxrwx 1 root root 0 Nov 23 22:48 net -> net:[4026531956] 
lrwxrwxrwx 1 root root 0 Nov 23 22:48 pid -> pid:[4026531836] 
lrwxrwxrwx 1 root root 0 Nov 23 22:48 user -> user:[4026531837] 
lrwxrwxrwx 1 root root 0 Nov 23 22:48 uts -> uts:[4026531838] 

  

2.2、 Cgroups  (资源控制)

 在操作系统解决了资源相互隔离的问题以后,还需要解决资源限制的问题,也就是避 免在同一个操作系统中,防止有些资源消耗较大的容器,将整个物理机器(宿主机)的 硬件资源(CPU, Memory) 占满。  在 Linux 系统中能够控制的资源列表如下:

  • Memory:内存限制
  • hugetlb:huge pages 使用量
  • cpu:CPU 使用率
  • cpuacct:CPU 使用率
  • cpuset:绑定 cgroups 到指定 CPUs 和 NUMA 节点
  • innodb_lock_wait_timeout:block 设备的 IO 速度
  • net_cls:网络接口设置优先级
  • devices:mknode 访问设备权限
  • freezer:suspend 和 restore cgroups 进程
  • perf_event:性能监控
  • pids:限制子树 cgroups 总进程数 

查看系统实现的限制资源:

]# cat /proc/cgroups    
#subsys_name    hierarchy       num_cgroups     enabled 
cpuset  10      1       1 
cpu     3       1       1 
cpuacct 3       1       1 
memory  8       1       1 
devices 2       14      1 
freezer 5       1       1 
net_cls 4       1       1 
blkio   7       1       1 
perf_event      9       1       1 
hugetlb 11      1       1 
pids    6       1       1 
net_prio        4       1       1

  

2.3、OverlayFS

OverlayFS 是一种堆叠文件系统,它依赖并建立在其它的文件系统之上(例如 ext4fs 和 xfs 等),并不直接参与磁盘空间结构的划分,仅仅将原来系统文件中的文件或者目录进行"合并一 起", 最后向用户展示"合并"的文件是在同一级的目录, 这就是联合挂载技术, 相对于 AUFS (<1.12 早期使用的存储技术), OverlayFS 速度更快,实现更简单。

Linux 内核为 Docker 提供的 OverlayFS 驱动有两种:Overlay 和 Overlay2。而 Overlay2 是 相对于 Overlay 的一种改进,在 Inode 利用率方面比 Overlay 更有效。但是 Overlay 有环境需 求:Docker 版本 17.06.02+,宿主机文件系统需要是 EXT4 或 XFS 格式。

 

  • OverlayFs的实现方式

OverlayFS 通过三个目录:lower 目录、upper 目录、以及 work 目录实现,其中 lower 目录 可以是多个, upper 目录为可以进行读写操作的目录, work 目录为工作基础目录,挂载后内容 会被清空,且在使用过程中其内容用户不可见,最后联合挂载完成给用户呈现的统一视图称为 merged 目录。 

 

  • 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 
3.查看挂载 
[root@master ~]# mount | grep merged 
 
4.在/upper 目录中写入文件,在 merged 中可以显示 
[root@master /]# touch /upper/upper.txt 
[root@master /]# ll /merged/ 
total 0 
-rw-r--r-- 1 root root 0 Mar 14 02:17 upper.txt 
5. 在 merged 中写入文件, 实际存储到了/uppper 
[root@master /]# touch /merged/d.txt 
[root@master /]# ll /upper/ 
total 0 
-rw-r--r-- 1 root root 0 Mar 14 02:19 d.txt 
 
注:如果没有 upperdir, merged 是只读的 
[root@node-2 overlay2]# umount /merged 
[root@node-2 overlay2]# mount -t overlay overlay -o lowerdir=/lower1:/lower2 /merged 
[root@master /]# touch /merged/c.txt touch: cannot touch ‘/merged/c.txt’: Read-only file system 

  

2.4、NameSpace、Cgroup 与 OverlayFS 关系 

  • 在操作系统中, 可以根据宿主机的资源情况,创建不同应用与数量不同的容器。每个容器 的 CPU、Memory、Network 由系统的内核 NameSpace 进行隔离, 相互之间不影响。
  • 为了防止某个正在运行的容器大量占用宿主机的系统资源(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架构与术语

4.1、Docker架构

Docker 使用客户端-服务器 (C/S) 架构模式,即可使用远程 API 来管理服务端和创建容 器。 Docker 容器需要通过 Docker 镜像来创建。

  1. Docker 分为客户端与服务端, 客户端可以管理本地的服务端(默认), 也可以管理远程 的服务端。
  2. Docker 服务端在启动容器时需要从仓库获取启动镜像。
  3. 运行镜像分为两个部分: a.默认的公共仓库。b.自建与第三方的私有仓库。
  4. 私有仓库有两种实现方式: a. 使用 Docker Registry 部署。b. Vmware Harbor

 

4.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 守护进程和容器 

 

posted @ 2020-11-02 14:55  欧-阳  阅读(815)  评论(0)    收藏  举报