2023-08-23:Docker安装、技术
学习自:01 Docker 安装:入门案例带你了解容器技术原理
1、Docker能做什么
官方说法:Docker是一个用于开发、发布、运行应用程序的开放平台。
通俗说法:集装箱,不同软件具有不同标准的集装箱规格,集装箱可以保证这些软件分别整齐摆放相互不受到影响。有了集装箱就不需要为每个软件专门设置运输工具了,可以把它们放在一艘船上,用集装箱进行分装。Docker要做的就是把各种软件打包为一个集装箱(镜像),然后分发,且在运行时可以互相隔离。
2、Docker安装
该节整理成:Docker:安装
3、容器技术原理
1)chroot
提起容器就要提chroot,它是最早的容器雏形。
chroot意味着切换根目录,它可以把任何目录更改为当前进程的根目录,这和容器很相似。
由于我们实际学习中很少用到chroot指令,因此这里要对chroot的功能进行一个介绍:
chroot是Unix和Linux操作系统的一个指令,针对正在运行的软件进程和子进程,改变它外显的根目录。一个运行在该环境下(由chroot设置根目录)的进程,不能访问目录之外的其他目录(这与我们在一个容器中是很相似的)。
一个chroot的例子:
去往目录/usr/local,在该目录下创建一个rootfs目录
cd /usr/local mkdir rootfs
用Docker在rootfs目录下拉起一个busybox镜像创建的系统,关于镜像的概念可以先不管,这里可以理解为Docker在rootfs目录下创建了一些目录和放置了一些二进制文件:
cd rootfs docker export $(docker create busybox) -o busybox.tar tar -xf busybox.tar
该命令执行完毕,在/usr/local/rootfs下会得到一些目录和文件:
可以看到,这些目录和我们在系统根目录/下看到的文件结构大致相同。接下来见证chroot的功效
使用如下命令,启动一个sh进程,并将/usr/local/rootfs作为sh进程的根目录
chroot /usr/locla/rootfs /bin/sh
此时,我们的进程已经处于该命令启动的sh进程中:
在当前sh命令行窗口下,我们用ls(这里的ls是rootfs下的bin/ls而非系统环境下的/bin/ls)查看一下当前进程的根目录情况(/),看其是否与主机上的其他目录隔开了:
/bin/ls /
这里可以看到,当前进程的根目录已经变成了/usr/local/rootfs目录,这样就实现了当前进程与主机的隔离。至此,一个目录隔离的容器就完成了,但仅仅如此还不能称之为一个容器。原因在于它还没有实现网络、进程等的隔离:输入命令 /bin/ip route查看网络部署情况:
/bin/ip route
可以看到还是会显示出主机上的网络情况。
要想实现一个完整的容器,我们还要用到Linux的其他三项技术:Namespace、Cgroups、联合文件系统。
2)NameSpace
NameSpace是Linux的一个内核功能,它可以对内核资源进行隔离,使得容器中的进程可以在单独的命名空间中运行,并且只可以访问当前容器命名空间的资源。
NameSpace可以隔离PID、UID、主机名、文件名、网络、进程通信等相关资源。
Docker主要用到以下五种命名空间:
- pid namespace:隔离进程ID
- net:隔离网络接口,在虚拟的net namespace中,用户可以拥有自己独立的IP、路由、端口等
- mnt:文件系统挂载点隔离
- ipc:信号量、消息队列、共享内存隔离
- uts:主机名、域名隔离
3)Cgroups
Cgroups也是一个Linux内核功能,可以限制、隔离进程的资源使用情况(CPU、内存、磁盘I/O、网络)。在容器中,Cgroups常用于限制容器的CPU、内存等资源的使用。
4)联合文件系统,UnionFS
联合文件系统,是一种通过创建文件层进程操作的文件系统,因此联合文件系统非常轻快。
Docker使用联合文件系统为容器提供构建层,使得容器可以实现写时复制、镜像分层构建和储存。
常用的联合文件系统有AUFS、Overlay、Devicemapper。
小结
Docker提供了工具与平台来管理容器的生命周期:
1、使用容器开发应用程序及其支持组件;
2、容器称为分发和测试应用程序的单元;
3、可以将应用程序作为容器或协调服务部署到生产环境中。无论生产环境是本地数据中心,云提供商还是两者的混合,其工作原理都相同。
回顾
1、Docker的作用:开发、发布、运行应用程序的开放平台。可以将不同应用程序打包成镜像,隔离运行环境,分装时不用考虑彼此影响。
2、使用chroot可以改变某个进程的root目录,让它看到一个非系统环境下的根目录,实现了目录隔离
3、容器除了目录隔离外,还要实现网络、进程等的隔离:
网络隔离:容器中看不到系统上的网卡信息;
进程隔离:容器中用ps查看运行的进程时,只能看到容器内部的进程信息
4、完整的容器实现,要用到Linux的三项技术:NameSpace、Cgroups、联合文件系统:
NameSpace(为容器提供独立的命名空间,提供命名空间之间的资源隔离)
Linux的内核功能,对内核资源进行隔离,使容器中的进程可以在单独的命名空间中运行,并且只能访问当前容器命名空间的资源。
NameSpace可以实现对PID、UID、主机名、文件名、网络、进程通信的隔离。
Docker中有5种命名空间:
- PID
- net:在Docker中,用户可以拥有自己独立的IP、路由、端口等
- mnt:网络挂载点
- IPC:信号量、消息队列、共享内存隔离
- uts:主机名、域名隔离
Cgroups(规定容器的资源使用)
Linux内核功能,对资源使用情况进行限制、隔离,用于限制容器的CPU、内存等资源的使用。
资源:CPU、内存、磁盘IO、网络
联合文件系统,UnionFS(一种文件系统分层的机制)
联合文件系统是一种通过创建文件层进程的文件系统。
Docker利用它为容器提供构建层(容器层、镜像层等),这样以层级关系生成需要的容器,节省空间和时间。
常用的联合文件系统有AUFS、Overlay(RHEL上用的就是这种,生成的镜像文件会专门保存在/var/lib/docker/overlay2中)、Devicemapper