我的第一步,是学习Docker的基础知识。因此,我将总结一下关于Docker的学习成果

Docker是什么?

我想从虚拟化的概念开始,逐步讲解关于Docker的内容。

目录

    1. 虚拟化技术

 

    1. Docker与VMWare和VirtualBox等虚拟化技术的区别

 

    1. Linux的namespace和cgroups

 

    1. Docker的优点是什么

 

    Docker实践入门

虚拟化是指通过软件技术将一个物理资源(如服务器、存储器、网络或操作系统)拆分为多个虚拟实例的过程。

虚拟化是一种技术,将计算机的硬件、操作系统、存储和网络等组成要素分离,并以虚拟的形式进行构建。

    • Full Virtulization(完全仮想化)

 

    • ハードウェアの動作を完全にemulation(模倣)することで、仮想マシン上で動作するOSに変更を加え ることなく、実行可能。

 

    • Para Virtulization(準仮想化)

 

    • ハードウェアの動作を完全に再現する代わりに、ハードウェアのemulationに変更を加えたインタフ

 

    ェースを提供する。実行速度が上がる代わりに、仮想マシン上で動作するOSに変更を加える必要がある。

超级虚拟机 jī)

它是一种软件,用于虚拟化系统资源或在其上执行虚拟机。

    • ベアメタル型(ハイパーバイザー型)

 

    ホスト型

有两种类型。

裸机型(超级虚拟机型)

硬件上运行着虚拟机监控器。由于虚拟机监控器直接控制硬件,因此可以实现快速操作。

主机式

在既有的操作系统上运行一个虚拟机监控程序,然后在其上运行客户操作系统的东西,可以方便地像应用程序一样轻松使用,但相比直接控制硬件的裸机型虚拟机监控程序,其运行速度较慢。VirtualBox或VMWarePlayer等都属于主机型虚拟机。

ハイパーバイザ.jpg

画像链接:https://www.kagoya.jp/howto/rentalserver/virtualization/

Docker和现有的虚拟化技术的区别是什么? (Docker hé de huà de shì ?)

当研究Docker时,经常会看到下面这样的图。

docker01.jpg

请参考以下链接:https://cn.teldevice.co.jp/column/10509/

传统的虚拟化和Docker有何不同?

传统的虚拟化技术通过虚拟化物理机器,使得可以在其上同时运行多个虚拟操作系统。因此,只要具备虚拟机镜像,就可以构建完全相同的环境,而无需准备物理硬件。

在Docker中,通过在主机操作系统上实现以无需宿主操作系统的独立进程(容器)为单位的虚拟化来进行操作。(操作系统级虚拟化)
此外,由于容器无法访问由其他运行在同一主机操作系统上的容器使用的资源(例如CPU、内存、网络和文件等),每个容器看起来就像独立运行在物理机器上一样。
而从主机操作系统(Linux内核)的角度来看,由于只是启动了进程,因此可以避免模拟硬件所带来的硬盘、CPU、内存等开销。

Linux的命名空间和cgroups

接下来,我打算研究一下在Docker和Linux容器(LXC)中使用的Linux内核功能,即命名空间(namespace)和控制组(cgroups)。

事实上,在Docker之前,从1982年的Linux内核的chroot开始,存在着诸如FreeBSD jail、Solaris Containers等进程隔离和虚拟化技术。(好像是这样。)
具体说,容器技术主要实现了以下两个功能。

    1. 在隔离的空间中执行进程

 

    对进程施加资源限制

使用Linux内核的功能来实现上述两个目标。也就是说,从Linux内核的角度来看,只需要启动一个隔离进程。

这个地方的文章非常易懂。

命名空间

您可以通过输入命令“ls -l /propc/$$/ns”来查看命名空间的列表。

lrwxrwxrwx 1 root root 0  7月 30 09:56 ipc -> ipc:[4026531839]
lrwxrwxrwx 1 root root 0  7月 30 09:56 mnt -> mnt:[4026531840]
lrwxrwxrwx 1 root root 0  7月 30 09:56 net -> net:[4026531956]
lrwxrwxrwx 1 root root 0  7月 30 09:56 pid -> pid:[4026531836]
lrwxrwxrwx 1 root root 0  7月 30 09:56 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0  7月 30 09:56 uts -> uts:[4026531838]

在命名空间中,以ipc、mnt、net、pid、user、uts这六个操作系统资源为对象进行管理,可以将这些资源与其他进程隔离并进行管理。

将每个资源简要地总结起来。

リソース解説ipcIPC(プロセス間通信)リソースであるSystem V IPCオブジェクト、POSIXメッセージキューの分離mntファイルシステムを分離netネットワークインターフェースの分離pidPID(プロセスID)空間を分離useruid,gidを名前空間の間で分離するutsホスト名とドメイン名を名前空間で分離

我在这里读过相关的文章,现在分享一下。

用LXC学习容器入门-实现轻量级虚拟化环境技术
尝试操作netns
立即实践!Linux系统管理
深入理解UTS命名空间
Linux网络命名空间

名称空间可以将这些功能按照名称空间进行分隔。

cgroups 控制组。

cgroups可以将进程进行分组,对于组内的进程可以进行共同的管理。

在cgroup中,每个资源都被分割为不同的子系统,就像下面这样。


$ ls /sys/fs/cgroup/
blkio  cpu  cpu,cpuacct  cpuacct  cpuset  devices  freezer  hugetlb  memory  net_cls  perf_event  systemd
cgroups.png

每个子系统的设置都是以/cgroup/{subsystem}/{group}/{parameter}的形式配置的。例如,针对docker容器的memory设置,文件配置将如下:/cgroups/memory/docker/{dockerId}/{每个参数的设置文件}。

比如说,举个类似的例子。

$ ls /sys/fs/cgroup/memory/docker

cgroup.clone_children       memory.kmem.max_usage_in_bytes      memory.max_usage_in_bytes        memory.pressure_level
cgroup.event_control        memory.kmem.slabinfo                memory.memsw.failcnt             memory.soft_limit_in_bytes
cgroup.procs                memory.kmem.tcp.failcnt             memory.memsw.limit_in_bytes      memory.stat
docker_child_1              memory.kmem.tcp.limit_in_bytes      memory.memsw.max_usage_in_bytes  memory.swappiness
memory.failcnt              memory.kmem.tcp.max_usage_in_bytes  memory.memsw.usage_in_bytes      memory.usage_in_bytes
memory.force_empty          memory.kmem.tcp.usage_in_bytes      memory.move_charge_at_immigrate  memory.use_hierarchy
memory.kmem.failcnt         memory.kmem.usage_in_bytes          memory.numa_stat                 notify_on_release
memory.kmem.limit_in_bytes  memory.limit_in_bytes               memory.oom_control               tasks

在名为docker的组中的任务中,docker组中所属任务的进程ID,以及属于docker组的任务消耗的内存和相关报告、限制信息存储在其他名为memory.~的文件中。

另外,docker_child_1是docker组的子组,其中也存在着类似的memory.~和task文件。

换句话说,在像LXC和Docker这样的容器技术中,通过namespace将Linux操作系统的功能分离,并通过将相关进程归为一个cgroup,实现了虚拟化。这意味着它仍然是利用作为主机的Linux操作系统的内核来运行的。

Docker有什么优点?

我打算在与LXC比较的过程中考虑一下Docker的优点。Docker是在之前存在的LXC(Linux容器)基础上发展而来,旨在提供应用程序的完全可移植性,而Linux容器则被设计为轻量级虚拟服务器。

因此,Docker被优化用于构建和运营应用程序环境,与LXC相比,它对环境的依赖性较低。

为了提供一个完全封装的应用程序环境,Docker默认情况下不会执行操作系统的init进程,如chkconfig或systemctl,所以LXC可能更适合用作虚拟服务器。

因为对这一点理解不够,所以我打算在需要时进行补充。

Docker实践入门

关于Docker的实际操作,我会在后面进行补充。今天就说到这里。

请参阅以下链接。

以下是我参考过的博客文章和文献:
从今天开始使用Docker-了解容器虚拟化的必要性,并首先在开发环境中引入它!
我对Linux容器一无所知 〜通过haconiwa了解Linux容器
不仅仅是Docker,还有容器的世界
在Docker内部使用的Linux内核功能(命名空间/控制组)
立即实践!Linux系统管理/ Vol.260
立即实践!Linux系统管理/ Vol.228

广告
将在 10 秒后关闭
bannerAds