本文主要介绍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容器概念的更多信息,请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。