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

 

posted @ 2023-08-23 10:17  ShineLe  阅读(70)  评论(0编辑  收藏  举报