文章目录
一、docker简介
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 通过 Linux 内核的 Namespace 技术实现了文件系统、进程、设备以及网络的隔离,然后再通过 Cgroups 对 CPU、 内存等资源进行限制,最终实现了容器之间相互不受影响,由于容器的隔离性仅仅依靠内核来提供,因此容器的隔离性也远弱于虚拟机
1、Docker namespace
命名空间是linux内核强大的特性,每个容器都有自己的命名空间,运行在其中的应用都是在独立操作系统中运行一样。命名空间保证了容器之间彼此互不影响
2、Docker CGroups
容器使用namespace来隔离运行环境,使得容器中的进程就像在一个独立的环境中运行,但是为了防止它占用太多的资源,于是Docker就通过使用Linux cgroups来限制容器中的进程允许使用的系统资源。
Linux Cgroup可以让系统中所运行任务(进程)的用户定义组分配资源—比如CPU时间、系统内存、网络带宽
3、Docker UnionFS
UnionFS全称union file system,即联合文件系统,要理解unionFS,我们首先需要先了解bootfs和rootfs。
按照docker官网上的说法,docker的文件系统分为两层:bootfs和rootfs:
- bootfs包含了bootloader和linux内核。用户是不能对这层作任何修改的。在内核启动之后,bootfs实际上会unmount掉。
bootfs(boot file system)包含操作系统boot loader和linux内核kernel,用户不能修改这个文件系统,一旦linux启动成功后,整个linux内核加载进内存之后bootfs会被卸载掉,从而释放内存。同样的内核版本不同的linux发行版对应的bootfs都是一样的。
- rootfs则包含了一般系统上的常见目录结构,类似于/dev, /proc, /bin等等以及一些基本的文件和命令。
rootfs(root file system),linux系统在启动时,rootfs首先会被挂载为只读模式,然后再启动完成后被修改为读写模式。
4、AUFS
AUFS 即 Advanced UnionFS 其实就是 UnionFS 的升级版,它能够提供更优秀的性能和效率。
AUFS 作为先进联合文件系统,它能够将不同文件夹中的层联合(Union)到了同一个文件夹中,这些文件夹在 AUFS 中称作分支,整个『联合』的过程被称为联合挂载(Union Mount)
Docker最开始采用AUFS作为文件系统,也得益于AUFS分层的概念,实现了多个Container可以共享一个image。但是由于AUFS未并入Linux内核,且只支持Ubuntu,考虑到兼容性问题,在Docker 0.7 版本中引入了存储驱动,目前,Docker支持AUFS、Btrfs、Devicemapper、OverlayFS、ZFS五种存储驱动。
支持将不同目录挂载到同一个虚拟文件下的文件系统。这种文件系统可以一层一层地叠加修改文件。无论底下有多少层都是只读的,只有最上层的文件系统是可写的。当需要修改一个文件时,AUFS创建该文件的一个副本,使用CoW将文件从只读层复制到可写层进行修改,结果也保存在科协层。在Docker中,只读层就是image,可写层就是Container
5、Docker 镜像分层机制
Docker Image 是有一个层级结构的,最底层的 Layer 为 BaseImage(一般为一个操作系统的 ISO 镜像),然后顺序执行每一条指令,生成的 Layer 按照入栈的顺序逐渐累加,最终形成一个 Image
在系统启动时,Docker会首先一层一层的加载image,直到最下面的base image。而这些image都是只读的。
最后,在最上层添加可读写的一个容器, 这里存放着诸如unique id,网络配置之类的信息。
总之:dockers=LXC+AUFS
- LXC负责资源管理(包括cgroup,namespace,chroot等组件,并通过cgroup资源管理);
- AUFS负责镜像管理;
一、Docker常见命令
1、帮助命令
docker version # 显示docker的版本信息
docker info # 显示docker的系统信息,包括镜像和容器的数量
docker --help # 帮助命令
2、镜像命令
docker images # 查看所有本地的主机上的镜像
docker search # 搜索镜像
docker pull 镜像名称