Docker之Docker介绍

一 Docker介绍

Docker是一个开源项目,诞生于2013年初,最初是dotCloud公司内部的一个开源的PAAS服务的业余项目。它是基于Google公司推出的Go语言实现。项目后来加入了Linux基金会,遵从了Apache2.0协议,项目代码在Github上进行维护。

Docker是基于linux内核实现,docker最早采用LXC技术,LXC是linux原生支持的容器技术,可以提供轻量级的虚拟化,可以说docker就是基于LXC发展起来的,提供LXC的高级封装,标准的配置方法在LXC的基础上docker提供了一系列更强大的功能。而虚拟化技术KVM基于模块实现,后来docker改为自己研发并开源的runc技术运行容器,彻底抛弃了LXC。

Docker相比虚拟机的交付速度更快,资源消耗更低,Docker采用客户端/服务端架构,使用远程API来管理和创建容器,其可以轻松的创建一个轻量级的、可移植的、自给自足的容器,docker的三大理念是build、ship、run,docker遵从apache,并通过namespace级cgroup等来提供容器的资源隔离与安全保障等,所以Docker容器在运行时不需要类似虚拟机的额外开销,因此可以大幅度提高资源利用率,总而言之docker是一种用了新颖方式实现的轻量级虚拟机,类似于vm但是在原理上和vm的差别还是很大,并且docker的专业叫法是应用容器。

二 Docker的组成

  • Docker主机(host):一个物理机或虚拟机,用于运行Docker服务进程和容器。
  • Docker服务端(server):Docker守护进程,运行docker容器。
  • Docker客户端(client):客户端使用docker命令或其它工具调用docker API。
  • Docker仓库(registry):保存镜像的仓库,类似于git或svn这样的版本控制系统。 官方仓库:https://hub.docker.com
  • Docker镜像(images):镜像可以理解为创建实例使用的模板。
  • Docker容器(container):容器是从镜像生成对外提供服务的一个或一组服务。

三 Docker对比虚拟机

  • 资源利用率更高:一台物理机可以运行数百个容器,但是一般只能运行数十个虚拟机。
  • 开销更小:不需要启动单独的虚拟机占用硬件资源。
  • 启动速度更快:可以在数秒内完成启动。

四 Linux Namespace技术

4.1 MNT Namespace

每个容器都要有独立的跟文件系统有独立的用户空间,以实现在容器里面启动服务并且使用容器的运行环境,即一个宿主机是ubuntu的服务器,可以在里面启动一个centos运行环境的容器并且在容器里启动一个nginx服务,此nginx运行时使用的运行环境就是centos系统的运行环境,但是在容器里面是不能访问宿主机资源,宿主机是使用了chroot技术把容器锁定到一个指定的运行目录里面。

例如: /var/lib/containerd/io.containerd.runtime.v2.task/moby/容器ID

4.2 IPC Namespace

一个容器的进行间通信,允许一个容器内的不同进程的数据访问,但是不能跨容器访问其它容器的数据。

4.3 UTS Namespace

UTS Namespace用于系统标识,其中包含了hostname和域名domainname,它使得一个容器用以数据自己hostname标识,这个主机名称独立于宿主机系统和其它的容器。

4.4 PID Namespace

Linux系统中,有一个PID为1的进程(init/systemd)是其它所有进程的父进程,那么在每个容器内也要有一个父进程来管理其下属的子进程,那么多个容器的进程通过PID Namespace进行隔离。

4.5 NET Namespace

每一个容器都类似于虚拟机一样有自己的网卡、监听端口、TCP/IP协议栈等,Docker使用network namespace启动一个vethx接口,这样你的容器将拥有它自己的桥接ip地址,通常是docker0,而docker0实质就是linux的虚拟网桥,网桥是在OSI七层的数据链路层的网络设备,通过MAC地址对网络进行划分,并且在不同网络直接传递数据。

4.6 User Namespace

User Namespace允许在各个宿主机的各个容器空间内创建相同的用户名以及相同的用户UID和GID,只是会把用户的作用范围限制在每个容器内,即A容器和B容器可以有相同的用户名称和ID的账户,但是此用户的有效范围仅是当前容器内,不能访问另一个容器内的文件系统,即相互隔离、互补隔离、互补影响、用不相见。

五 Linux control groups

Linux cgroups的全称是 linux control groups,它最主要的作用,就是限制一个进程组能够使用资源上限,包括CPU、内存、磁盘、网络带宽等。此外还能够对进程进行优先级设置,以及将进程挂起和恢复操作。

5.1 验证系统cgroups

root@node01:~# cat /etc/issue
Ubuntu 20.04.3 LTS \n \l

root@node01:~# uname -r
5.4.0-84-generic
root@node01:~# cat /boot/config-5.4.0-84-generic | grep CGROUP
CONFIG_CGROUPS=y
CONFIG_BLK_CGROUP=y
CONFIG_CGROUP_WRITEBACK=y
CONFIG_CGROUP_SCHED=y
CONFIG_CGROUP_PIDS=y
CONFIG_CGROUP_RDMA=y
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_HUGETLB=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_CGROUP_PERF=y
CONFIG_CGROUP_BPF=y
# CONFIG_CGROUP_DEBUG is not set
CONFIG_SOCK_CGROUP_DATA=y
# CONFIG_BLK_CGROUP_IOLATENCY is not set
CONFIG_BLK_CGROUP_IOCOST=y

 # CONFIG_BFQ_CGROUP_DEBUG is not set
CONFIG_NETFILTER_XT_MATCH_CGROUP=m
CONFIG_NET_CLS_CGROUP=m
CONFIG_CGROUP_NET_PRIO=y
CONFIG_CGROUP_NET_CLASSID=y

5.2 cgroups中内存模块

root@node01:~# cat /boot/config-5.4.0-84-generic | grep MEM |grep CG
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y
# CONFIG_MEMCG_SWAP_ENABLED is not set
CONFIG_MEMCG_KMEM=y
CONFIG_SLUB_MEMCG_SYSFS_ON=y

5.3 cgroups具体实现

  • blkio:块设备IO限制。
  • cpu:使用调度程序为cgroup任务提供cpu的访问。
  • cpuacct:产生cgroup任务的cpu资源报告。
  • cpuset:如果是多核心的cpu,这个子系统会为cgroup任务分配单独的cpu和内存。
  • devices:允许或拒绝cgroup任何对设备的访问。
  • freezer:暂停和恢复cgroup任务。
  • memory:设置每个cgroup的内存限制以及产生内存资源报告。
  • net_cls:标记每个网络包以供cgroup方便使用。
  • ns:命名空间子系统。
  • perf_event:增加了对每group的监测跟踪的能力,可以监测属于某个特定的group的所有线程以及运行在特点CPU上的线程。

5.4 查看系统cgroups

点击查看代码
root@node01:~# ll /sys/fs/cgroup/
total 0
drwxr-xr-x 15 root root 380 Sep 11 22:56 ./
drwxr-xr-x 11 root root   0 Sep 11 22:56 ../
dr-xr-xr-x  6 root root   0 Sep 11 22:56 blkio/
lrwxrwxrwx  1 root root  11 Sep 11 22:56 cpu -> cpu,cpuacct/
dr-xr-xr-x  6 root root   0 Sep 11 22:56 cpu,cpuacct/
lrwxrwxrwx  1 root root  11 Sep 11 22:56 cpuacct -> cpu,cpuacct/
dr-xr-xr-x  3 root root   0 Sep 11 22:56 cpuset/
dr-xr-xr-x  6 root root   0 Sep 11 22:56 devices/
dr-xr-xr-x  4 root root   0 Sep 11 22:56 freezer/
dr-xr-xr-x  3 root root   0 Sep 11 22:56 hugetlb/
dr-xr-xr-x  6 root root   0 Sep 11 22:56 memory/
lrwxrwxrwx  1 root root  16 Sep 11 22:56 net_cls -> net_cls,net_prio/
dr-xr-xr-x  3 root root   0 Sep 11 22:56 net_cls,net_prio/
lrwxrwxrwx  1 root root  16 Sep 11 22:56 net_prio -> net_cls,net_prio/
dr-xr-xr-x  3 root root   0 Sep 11 22:56 perf_event/
dr-xr-xr-x  6 root root   0 Sep 11 22:56 pids/
dr-xr-xr-x  2 root root   0 Sep 11 22:56 rdma/
dr-xr-xr-x  6 root root   0 Sep 11 22:56 systemd/
dr-xr-xr-x  5 root root   0 Sep 11 22:56 unified/

六 Docker优势

  • 快速部署:段时间内可以部署成千上万个应用,更快速交付到线上。
  • 高效虚拟化:不需要额外的hypervisor支持,直接基于linux实现应用虚拟化,相比虚拟机大幅度提高性能和效率。
  • 节省开支:提高服务器利用率,降低IT支出。
  • 简化配置:将运行环境打包保存至容器,使用时直接启动即可。
  • 快速迁移和扩展:可跨平台运行在物理机、虚拟机、公有云等环境,良好的兼容性可以方便将应用从A宿主机迁移到B宿主机,甚至是A平台迁移到B平台。

七 Docker缺点

  • 隔离性:各应用之间的隔离不如虚拟机彻底。

八 Docker的核心技术

8.1 容器规范

容器技术除了docker之外,还有coreOS的rkt,还有阿里的Pouch,为了保证容器生态的标准性和健康可持续发展,包括linux基金会、docker、微软、红帽、谷歌和IBM等公司在2015年6月共同成立了一个叫open cintainer的组织,其目的就是制定开放的标准容器规范,目前OCI一共发布了两个规范,分别是runtime space和image format spec,有了这两个规范,不同的容器公司开发的容器只要兼容这两个规范,就可以保证容器的可移植性和相互操作性。

8.2 容器runtime

runtime是真正运行容器的地方,因此为了运行不同的容器runtime需要和操作系统内核紧密合作相互支持,以便为容器提供相应的运行环境。

目前主流的三种runtime:

  • Lxc:linux早期的runtime,docker早期就是采用lxc作为runtime。
  • runc:目前docker默认的runtime,runc遵守OCI规范,因此可以兼容lxc。
  • rkt:是coreOS开发的容器runtime,也符合OCI规范,所以使用rkt runtime也可以运行docker容器。

8.3 容器镜像

OCI容器镜像主要包含以下内容:

  • 文件系统:定义以layer保存的文件系统,在镜像里面是layer.tar,每个layer保存了和上层之间变化的部分,image format space定义了layer应该保存哪些文件,怎么表示增加、修改和删除的文件等操作。
  • manifest文件:描述有哪些layer,tag标签以及config文件名称。
  • config文件:是一个以hash命名的json文件,保存了镜像平台。容器运行时容器运行时需要的一些信息,比如环境变量、工作目录、命令参数等。
  • index文件:可选的文件,指向不同平台的manifest文件,这个文件能保证一个镜像可以跨平台使用。每个平台拥有不用的manifest文件使用index作为索引。
  • 父镜像:大多数层的元信息结构都包含一个parent字段,指向该镜像的父镜像。

参数:

  • ID:镜像ID,每一层都有ID。
  • tag标签:标签用于将用户指定的、具有描述性的名称对应到镜像ID。
  • 仓库:repository镜像仓库。
  • os:定义类型。
  • architecture:定义cpu架构。
  • author:作者信息。
  • create:镜像创建日期。

8.4 容器管理工具

管理工具连接runtime与用户,对用户提供图形或命令方式操作,然后管理工具将用户操作传递给runtime执行。

lxc是lxd的管理工具。

runc的管理工具是docker engine,docker engine包含后台deamon和cli两部分。

rkt的管理工具是rkt cli。

8.5 容器定义工具

容器定义工具允许用户定义容器的属性和内容,以方便容器能够被保存、共享和重建。

Docker image:是docker容器的模板,runtime以及docker image创建容器。

Dockerfile:包含N个命令的文本文件,通过dockerfile创建出docker image。

ACI:与docker image类似,是coreOS开发的rkt容器的镜像格式。

8.6 Registry

统一保存镜像而且是多个不同镜像版本的地方,叫做镜像仓库。

image registry:docker官方提供的私有仓库部署工具。

Docker hub:docker官方的公共仓库,已经保存了大量常用镜像,可以方便大家直接使用。

harbor:vmware提供的自带web界面认证功能的镜像仓库,目前有很多公司使用。

8.7 编排工具

容器编排引擎可以实现统一管理、动态伸缩、故障自愈、批量执行等功能。

Docker swarm:docker开发的容器编排引擎。

kubernetes:google开发的容器编排引擎,内部项目为borg,且同时支持docker和coreOS。

Mesos+Marathon:通用的集群组员调用平台,mesos(资源分配)与marathon(容器编排平台)一起提供容器编排引擎功能。

九 Docker的依赖技术

9.1 容器网络

docker自带的网络docker network仅支持管理单机上的容器网络,当多主机运行的时候需要使用第三方开源网络,例如calico、flannel等。

9.2 服务发现

容器的动态扩容特性决定了容器IP也会随之变化,因此需要有一种机制可以自动识别并将用户请求动态转发到新创建的容器上,kubernetes自带服务发现功能,需要结合kube-dns服务解析内部域名。

9.3 容器监控

可以通过原生命令docker ps/top/stats查看容器运行状态,另外也可以使用heapster/prometheus等第三方监控工具监控容器的运行状态。

9.4 数据管理

容器的动态迁移会导致其在不同的host之间迁移,因此如何保证与容器相关的数据也能随之迁移或随时访问,可以使用逻辑卷/储存挂载等方式解决。

9.5 日志收集

docker原生的日志查看工具docker logs,但是容器内部的日志需要通过ELK等专门的日志收集分析和展示工具进行处理。

 

 

 

 

 

 

 

 

 

上一篇:【运维】-- Docker基础必知必会(1)


下一篇:Photoshop让画面清晰突出MM照片意境