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目录
1 2 | cd /usr/local mkdir rootfs |
用Docker在rootfs目录下拉起一个busybox镜像创建的系统,关于镜像的概念可以先不管,这里可以理解为Docker在rootfs目录下创建了一些目录和放置了一些二进制文件:
1 2 3 | cd rootfs docker export $(docker create busybox) -o busybox. tar tar -xf busybox. tar |
该命令执行完毕,在/usr/local/rootfs下会得到一些目录和文件:
接下来见证chroot的功效
使用如下命令,启动一个sh进程,并将/usr/local/rootfs作为sh进程的根目录
1 | chroot /usr/locla/rootfs /bin/sh |
此时,我们的进程已经处于该命令启动的sh进程中:
在当前sh命令行窗口下,我们用ls(这里的ls是rootfs下的bin/ls而非系统环境下的/bin/ls)查看一下当前进程的根目录情况(/),看其是否与主机上的其他目录隔开了:
1 | /bin/ls / |
这里可以看到,当前进程的根目录已经变成了/usr/local/rootfs目录,这样就实现了当前进程与主机的隔离。至此,一个目录隔离的容器就完成了,但仅仅如此还不能称之为一个容器。原因在于它还没有实现网络、进程等的隔离:输入命令 /bin/ip route查看网络部署情况:
1 | /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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性