docker容器的概念,docker原理详解,docker容器的原理分析

docker容器的概念,docker原理详解,docker容器的原理分析

本文主要介绍docker容器的相关信息,帮助你更好的理解和学习使用docker容器。感兴趣的朋友可以了解一下。

目录

01容器的本质是什么?2c组技术和命名空间技术简介03容器、镜像和仓库之间的关系

01 容器的本质是什么?

今天的关键问题是解释清楚什么是容器。

要理解容器的概念,首先我们需要知道什么是进程。当我们在Linux操作系统中执行一个程序时,这个程序可能是一个二进制文件。当它被调用时,它成为计算机内存中的数据、寄存器中的值、堆栈中的指令以及各种设备状态信息的集合。这种计算机执行环境的合成称为进程。

容器就是为这个过程提供一个‘边界’。说白了就是把这个过程‘包装’起来。本质上,它是通过约束和修改过程的某些动态性能来实现的这个“包”的动作。

显而易见,容器是一个有“边界”的特殊过程。

现在让我们来看看MySQL容器的流程特征。

1.首先检查我们机器上mysql容器的containerID值,如下所示:

[root @ VM-16-13-centos service]# dockerps | grepmysql

4784586d 01e 0 my SQL docker-entry point.3 months agou 3 months k8s _ MySQL . 16 d54d 16 _ MySQL-pd7jr _ default _ 0032 BCE 0-2b0f-11eb-98ad-5254002 DBD 85 _ d775f 414

可以看到,containerID的值是4784586d01e0。

2.首先,我们通过docker exec命令进入一个容器(下面会介绍这个命令的介绍),ps -ef命令检查进程:

[root @ VM-16-13-centos service]# docker exec-it 4784586d 01 E0 bash

root@mysql-pd7jr:/#ps-ef

UIDPIDPPIDCSTIMETTYTIMECMD

mysql1002020?03时20分20秒

root8820009:42?00:00:00狂欢

root888882009:46?00:00:00ps-ef

可以发现mysqld的进程号是1。

我想在这里多说一些:

1、docker exec -it 4784586d01e0 bash

这个指令告诉容器我想进入容器并运行一个bash指令。

2.如果您的docker不支持ps命令,您需要使用以下命令来安装ps命令:

apt-get更新apt-get安装procps

然后我们退出容器,再次查看mysqld进程的进程号:

[root @ VM-16-13-centos service]# PS-ef | grepmysql

root 5152505902020 pts/500:00:00 my SQL-u root-pxxxxxx

root 136442487902020 pts/400:00:00 my SQL-u root-pxxxxxx

polkitd188531883702020?03时20分25秒我的世界

发现进程号是18853。

可以得出结论,mysqld进程在容器内外执行的结果是不一样的。

为什么会这样?

其本质是docker容器中的进程被隔离在一个新的环境中,这样这些进程只能看到重新计算的PID号。如前所述,docker本质上是通过限制和修改流程的某些动态特性,将流程“打包”在物理机器上。我们看到的这种现象是‘包装’的结果。

那么Linux是如何约束和修改物理机进程的呢?这里引入了一个新概念:

对于Docker等大多数Linux容器来说,Linux的Cgroups技术是用来创建约束的主要手段,而

命名空间技术是用于修改过程视图的主要方法。

02 Cgroup技术和Namespace技术介绍

名称空间技术主要用于为容器提供资源隔离。命名空间是实现这一功能的简单方法。通常,当我们创建一个Linux进程时,系统会执行一个克隆命令,类似于:

intpid=clone(main_function,stack_size,SIGCHLD,NULL);

它返回我们创建的进程的PID号。

命名空间技术是当Linux创建一个进程时,有一个额外的参数。这个新参数暂时叫做newid。这样,我们在容器中看到的进程的PID号就是这个newid。这个命名空间叫做PID命名空间。

除了这个命名空间,还有其他的,比如mount命名空间,Network命名空间等等。分别用于隔离挂载点和网络。

当然,并不是所有的资源都是面向名称空间的,比如时间和操作系统内核,它们是由服务器上的所有容器共享的。

一旦容器开始运行,我们需要控制它使用的机器资源,比如磁盘、内存、CPU等。否则,可能会耗尽物理机的资源,导致一些系统进程崩溃。Cgroup技术旨在限制Linux进程对资源的使用。其整个进程是Linux控制组,以文件和目录的形式存储在/sys/fs/cgroups目录下,如下:

[root @ VM-16-13-centos service]# ls-l/sys/fs/cgroup/

总计0

drwxr-xr-x4 root 0 nov 2011:38 blk io

lrwxrwxrwx 1 root root 11 nov 2011:38 CPU-CPU,cpuacct

lrwxrwxrwx 1 root root 11 nov 2011:38 cpuacct-CPU,cpuacct

drwxr-xr-X5 root 0 nov 2011:38 CPU,cpuacct

drwxr-xr-x3 root 0 nov 2011:38 cpuset

drwxr-xr-x4 root 0 nov 2011:38个设备

drwxr-xr-x3 root 0 nov 2011:38冷冻机

drwxr-xr-x3 root 0 nov 2011:38 hugetlb

drwxr-xr-X5 root 0 nov 2011:38 memory

lrwxrwxrwx 1 root root 16 novv 2011:38 net _ cls-net _ cls,net_prio

drwxr-xr-x3root 0 nov 2011:38 net _ cls,net_prio

lrwxrwxrwx 1 root root 16 novv 2011:38 net_prio-net _ cls,net _ prio

drwxr-xr-x3root 0 nov 2011:38 perf _ event

drwxr-xr-x4 root 0 nov 2011:38 pids

drwxr-xr-x4 root 0 nov 2011:38 systemd

在不同的文件目录中,存储着不同资源类型的限制值,其中常用的有:

Blkio:为块设备设置i/o限制,块设备一般用于磁盘和其他设备。

Cpuset:为进程分配独立的CPU内核和相应的内存节点。

内存:设置进程的内存使用限制。

当我们通过命令启动容器时,操作系统会将这个docker进程对应的PID填充到对应控制组的文件中,从而控制当前进程使用的CPU资源值。

03容器、镜像和仓库之间的关系

Docker包括三个基本概念:

图像(图像)

容器(集装箱)

仓库(仓库)

这三个部分构成了Docker的整个生命周期,如上图所示。

Docker镜像包含文件系统,类似于虚拟机的镜像。这是一个只读模板。这个文件系统通常也称为rootfs,通常包含一系列目录,如bin、etc、sys、usr等。

Docker容器是从mirror实例化而来的,和我们学过的面向对象的概念非常相似。我们可以把镜像看作一个类,把容器看作一个类的实例化对象,这样就可以很好的理解镜像和容器的关系。

Docker仓库:类似于代码仓库,是Docker集中存放图片文件的地方。

这种关系可以更清楚地表达如下:

这就是docker容器概念的细节。关于docker容器概念的更多信息,请关注我们的其他相关文章!

docker容器的概念,docker原理详解,docker容器的原理分析