容器与进程

docker学习-容器中的进程 docker 阅读详情

首先,大家可能会有个疑问,容器,到底是怎么一回事儿?

我们说容器其实是一种沙盒技术。顾名思义,沙盒就是能够像一个集装箱一样,把你的应用“装”起来的技术。这样,应用与应用之间,就因为有了边界而不至于相互干扰;而被装进集装箱的应用,也可以被方便地搬来搬去,这不就是PaaS最理想的状态嘛。

不过,这两个能力说起来简单,但要用技术手段去实现它们,可能大多数人就无从下手了。

所以,我就先来跟你说说这个“边界”的实现手段。

假如,现在你要写一个计算加法的小程序,这个程序需要的输入来自于一个文件,计算完成后的结果则输出到另一个文件中。

由于计算机只认识0和1,所以无论用哪种语言编写这段代码,最后都需要通过某种方式翻译成二进制文件,才能在计算机操作系统中运行起来。

而为了能够让这些代码正常运行,我们往往还要给它提供数据,比如我们这个加法程序所需要的输入文件。这些数据加上代码本身的二进制文件,放在磁盘上,就是我们平常所说的一个“程序”,也叫代码的可执行镜像(executable image)。然后,我们就可以在计算机上运行这个“程序”了。

首先,操作系统从“程序”中发现输入数据保存在一个文件中,所以这些数据就被会加载到内存中待命。同时,操作系统又读取到了计算加法的指令,这时,它就需要指示CPU完成加法操作。而CPU与内存协作进行加法计算,又会使用寄存器存放数值、内存堆栈保存执行的命令和变量。同时,计算机里还有被打开的文件,以及各种各样的I/O设备在不断地调用中修改自己的状态。

就这样,一旦“程序”被执行起来,它就从磁盘上的二进制文件,变成了计算机内存中的数据、寄存器里的值、堆栈中的指令、被打开的文件,以及各种设备的状态信息的一个集合。像这样一个程序运起来后的计算机执行环境的总和,就是我们今天的主角:进程。

所以,对于进程来说,它的静态表现就是程序,平常都安安静静地待在磁盘上;而一旦运行起来,它就变成了计算机里的数据和状态的总和,这就是它的动态表现。

而容器技术的核心功能,就是通过约束和修改进程的动态表现,从而为其创造出一个“边界”。

对于Docker等大多数Linux容器来说,Cgroups技术是用来制造约束的主要手段,而Namespace技术则是用来修改进程视图的主要方法。

你可能会觉得Cgroups和Namespace这两个概念很抽象,别担心,接下来我们一起动手实践一下,你就很容易理解这两项技术了。

假设你已经有了一个Linux操作系统上的Docker项目在运行,比如我的环境是Ubuntu 16.04和Docker CE 18.05。


$ docker run -it busybox /bin/sh
/ #

这个命令是Docker项目最重要的一个操作,即大名鼎鼎的docker run。

而-it参数告诉了Docker项目在启动容器后,需要给我们分配一个文本输入/输出环境,也就是TTY,跟容器的标准输入相关联,这样我们就可以和这个Docker容器进行交互了。而/bin/sh就是我们要在Docker容器里运行的程序。

所以,上面这条指令翻译成人类的语言就是:请帮我启动一个容器,在容器里执行/bin/sh,并且给我分配一个命令行终端跟这个容器交互。

这样,我的Ubuntu 16.04机器就变成了一个宿主机,而一个运行着/bin/sh的容器,就跑在了这个宿主机里面。

上面的例子和原理,如果你已经玩过Docker,一定不会感到陌生。此时,如果我们在容器里执行一下ps指令,就会发现一些更有趣的事情:

/ # ps
PID  USER   TIME COMMAND
  1 root   0:00 /bin/sh
  10 root   0:00 ps

可以看到,我们在Docker里最开始执行的/bin/sh,就是这个容器内部的第1号进程(PID=1),而这个容器里一共只有两个进程在运行。这就意味着,前面执行的/bin/sh,以及我们刚刚执行的ps,已经被Docker隔离在了一个跟宿主机完全不同的世界当中。

这究竟是怎么做到呢?

本来,每当我们在宿主机上运行了一个/bin/sh程序,操作系统都会给它分配一个进程编号,比如PID=100。这个编号是进程的唯一标识,就像员工的工牌一样。所以PID=100,可以粗略地理解为这个/bin/sh是我们公司里的第100号员工,而第1号员工就自然是比尔 · 盖茨这样统领全局的人物。

而现在,我们要通过Docker把这个/bin/sh程序运行在一个容器当中。这时候,Docker就会在这个第100号员工入职时给他施一个“障眼法”,让他永远看不到前面的其他99个员工,更看不到比尔 · 盖茨。这样,他就会错误地以为自己就是公司里的第1号员工。

这种机制,其实就是对被隔离应用的进程空间做了手脚,使得这些进程只能看到重新计算过的进程编号,比如PID=1。可实际上,他们在宿主机的操作系统里,还是原来的第100号进程。

这种技术,就是Linux里面的Namespace机制。而Namespace的使用方式也非常有意思:它其实只是Linux创建新进程的一个可选参数。我们知道,在Linux系统中创建线程的系统调用是clone(),比如:

int pid = clone(main_function, stack_size, SIGCHLD, NULL);

这个系统调用就会为我们创建一个新的进程,并且返回它的进程号pid。

而当我们用clone()系统调用创建一个新进程时,就可以在参数中指定CLONE_NEWPID参数,比如:

int pid = clone(main_function, stack_size, CLONE_NEWPID | SIGCHLD, NULL);

这时,新创建的这个进程将会“看到”一个全新的进程空间,在这个进程空间里,它的PID是1。之所以说“看到”,是因为这只是一个“障眼法”,在宿主机真实的进程空间里,这个进程的PID还是真实的数值,比如100。

当然,我们还可以多次执行上面的clone()调用,这样就会创建多个PID Namespace,而每个Namespace里的应用进程,都会认为自己是当前容器里的第1号进程,它们既看不到宿主机里真正的进程空间,也看不到其他PID Namespace里的具体情况。

而除了我们刚刚用到的PID Namespace,Linux操作系统还提供了Mount、UTS、IPC、Network和User这些Namespace,用来对各种不同的进程上下文进行“障眼法”操作。

比如,Mount Namespace,用于让被隔离进程只看到当前Namespace里的挂载点信息;Network Namespace,用于让被隔离进程看到当前Namespace里的网络设备和配置。

这,就是Linux容器最基本的实现原理了。

所以,Docker容器这个听起来玄而又玄的概念,实际上是在创建容器进程时,指定了这个进程所需要启用的一组Namespace参数。这样,容器就只能“看”到当前Namespace所限定的资源、文件、设备、状态,或者配置。而对于宿主机以及其他不相关的程序,它就完全看不到了。

所以说,容器,其实是一种特殊的进程而已。

总结
谈到为“进程划分一个独立空间”的思想,相信你一定会联想到虚拟机。而且,你应该还看过一张虚拟机和容器的对比图。
在这里插入图片描述
这幅图的左边,画出了虚拟机的工作原理。其中,名为Hypervisor的软件是虚拟机最主要的部分。它通过硬件虚拟化功能,模拟出了运行一个操作系统需要的各种硬件,比如CPU、内存、I/O设备等等。然后,它在这些虚拟的硬件上安装了一个新的操作系统,即Guest OS。

这样,用户的应用进程就可以运行在这个虚拟的机器中,它能看到的自然也只有Guest OS的文件和目录,以及这个机器里的虚拟设备。这就是为什么虚拟机也能起到将不同的应用进程相互隔离的作用。

而这幅图的右边,则用一个名为Docker Engine的软件替换了Hypervisor。这也是为什么,很多人会把Docker项目称为“轻量级”虚拟化技术的原因,实际上就是把虚拟机的概念套在了容器上。

可是这样的说法,却并不严谨。

在理解了Namespace的工作方式之后,你就会明白,跟真实存在的虚拟机不同,在使用Docker的时候,并没有一个真正的“Docker容器”运行在宿主机里面。Docker项目帮助用户启动的,还是原来的应用进程,只不过在创建这些进程时,Docker为它们加上了各种各样的Namespace参数。

这时,这些进程就会觉得自己是各自PID Namespace里的第1号进程,只能看到各自Mount Namespace里挂载的目录和文件,只能访问到各自Network Namespace里的网络设备,就仿佛运行在一个个“容器”里面,与世隔绝。

不过,相信你此刻已经会心一笑:这些不过都是“障眼法”罢了。

电网加密芯片全解析:分类与功能​ 在电网数字化转型的浪潮中,数据安全和设备的身份认证变得愈发重要。加密芯片作为保障电网信息安全的核心部件,凭借独特的技术特性,在不同应用场景下发挥着关键作用,有力推动着智能电网的安全稳定发展。接下来,我们将对电网中常见的加密芯片展开分类介绍,并探讨其对应的功能。​。 阅读详情

相关推荐

深入解析Dataloader中shuffle机制与随机种子对模型训练的影响

本文深入探讨了Dataloader中shuffle机制与随机种子对机器学习模型训练的影响。通过实际案例分析,详细解释了数据打乱顺序的必要性、随机种子的正确设置方法以及两者协同工作的原理,帮助开发者避免常见陷阱并提升模型训练效果。

weixin_29166013的博客 141

【探索 Kubernetes|容器基础进阶篇 系列1】容器的本质是进程

相信大家学容器时都看过这个虚拟机和容器的对比图。左边是虚拟机的工作原理,其中Hypervisor 软件是虚拟机最重要的部分它可以实现模拟出各种硬件,比如:CPU、内存、磁盘等,在Hypervisor 软件层之上创建 Guest OS 也就是客户机操作系统,Guest OS 和 Hypervisor 模拟出来的硬件交互,这样用户应用程序就可以运行在这个虚拟机中,用户自然看到的就是这个新的操作系统的文件系统结构,这也是虚拟机也能起到将不同应用程序相互隔离的原因。

持续分享,个人的运维经验,包含:云计算、Linux、Windows、容器、K8s、CICD、Python、运维开发、公有云等;以及个人经历相关内容,包含:实习、面试经验等。 2274

用Python进行GEO数据挖掘(学习笔记四):富集分析

该笔记详细解释了富集分析的工作原理,并简要地利用gseapy在python中进行富集分析的操作。

m0_64111502的博客 5649

为什么建议一个容器中只运行一个进程

在云原生与容器化时代浪潮下,大多数新手的普遍认识是“容器=虚拟机”,既然容器等同于虚拟机,那么在容器中想运行多少个进程就运行多少个进程。 作为从新手村走过来的人,笔者想为这个想法纠偏,避免大家和我走一样的弯路。有两个概念我们要理清:第一,容器不等同于虚拟机;第二,容器中不建议运行多个进程。 本文以Docker容器为主要讨论展开。 为什么说容器不等同于虚拟机呢? 我们来看一个较为学术的定义:A docker container is not a full virtual machine to run a co

JasonCeng_的博客 2117

英飞凌ADS开发环境搭建全流程:从安装到第一个程序烧录

本文详细介绍了英飞凌ADS开发环境搭建的全流程,包括环境准备、ADS安装与配置、MemTools烧录技巧等关键步骤。针对嵌入式开发者,特别提供了从安装到第一个程序烧录的实战指南,涵盖常见问题解决方案和优化建议,帮助开发者快速上手英飞凌AURIX系列微控制器的开发工作。

qsc901234的博客 333

RV1126 MIPI CSI-2驱动RGB888图像采集的V4L2实战解析

本文详细解析了在RV1126平台上通过MIPI CSI-2接口采集RGB888格式图像的完整V4L2实战流程。核心内容包括设备树(DTS)配置、内核驱动适配、Media Controller链路调试,以及使用v4l2-ctl工具进行图像抓取与验证的方法,旨在帮助开发者打通从硬件连接到稳定采集RGB888图像数据的关键环节。

weixin_29161719的博客 166

深入刨析容器(二):容器的进程

这章节主要是从容器的技术概念入手,说一下容器的基础,有了好的基础才能更好的理解容器这门技术,先说一下容器和进程的关系,后续的文章会说进程的隔离与限制资源以及容器的内部灵魂,来一点点深入容器,话不多说,那么开始把!

dfBeautifulLive的博客 2109

在 Kubernetes 上部署 Label Studio

Label Studio 是一款开源的数据标注工具,支持多种标注任务,如文本标注、图像标注、音频标注等。

啥都会一点 668

容器进程解析

容器进程和宿主机进程的关系,如何在容器中kill掉容器中的进程

博客 716

【100%通过率】华为od机试C卷【小朋友来自多少小区】JS 实现

幼儿园组织活动,老师布置了一个任务:每个小朋友去了解与自己同一个小区的小朋友还有几个.我们将这些数量汇总到数组 garden 中。请根据这些小朋友给出的信息,计算班级小朋友至少来自几个小区?

MISAYAONE的博客 2007

【2.12】基于FPGA的Gardner环开发5——闭环反馈,获得完整gardner环

本文介绍了Gardner定时恢复算法在FPGA上的实现过程。首先回顾MATLAB程序中Gardner环的闭环反馈机制,重点分析了环路滤波器输出变量w的处理流程。随后详细阐述了FPGA实现的Verilog设计步骤,包括三个核心模块:1)y_temp=q0-w计算模块,实现反馈变量处理;2)uk=2*q0计算模块,生成插值系数;3)插值计算模块,根据使能信号执行线性插值运算。设计通过引入使能信号控制插值更新时机,采用定点数运算处理数据,并包含负数保护机制确保计算稳定性。文章提供了完整的Verilog代码实现,展

fpga/matlab/simulink算法仿真工程 135

docker实践总结——容器与Linux进程

思考 docker容器启动之后会有相应的Linux进程,容器与进程是怎么样的对应关系?一个容器一个进程吗,还是一个容器多个进程? 容器与进程 docker ps 查看所有已经启动的容器,从第一列找到一个[容器ID] ,下一步备用; ps -ef |grep [容器ID] 查看该容器对应的进程信息,从中找到 进程ID,下一步备用; pstree -ap [进程ID] 看到该容器的进程树信息。 命令执行结果如下: 进程树分析 从上面截图中我们发现: 父进程22745是容器的进程,这个进程下面还有多个 bas

薛定谔的雄猫 1773

NeRF-Pytorch(训练自己的数据集过程全记录+环境配置+COLMAP+问题解决)

写于2025/1/26,在用NeRF训练自己的数据集过程中该踩的坑都踩过了,发现网上并没有详细完整写这些问题解决过程的帖子,遂自己进行一个全记录和复盘。 整篇文章包括:NeRF训练环境配置;COLMAP三维重建过程(直接给出代码,规避一些bug);在训练时候出现的问题。 本篇文章仅针对llff格式数据集。

m0_62577716的博客 1774

容器下进程退出产生僵尸进程的过程与原因

最近容器部署标准化,本来很简单,也没什么特殊的要求,但是在容器里,因为临时需要启动进程,结果停止后出现了僵尸进程。在容器下进程id为1的进程是不能kill掉的,当容器下需要创建进程,运行时启动,那么创建进程的过程非常重要,因为销毁需要逆过程,否则会出现僵尸进程。容器下当新创建的进程(id为1的进程除外)的父进程被kill或者自然退出,当前进程的父进程id会被设为1,即容器下不能被kill的进程,导致僵尸进程的产生。

fenglllle的博客 1448

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

进程、容器与虚拟机的区别

进程、容器与虚拟机的区别

墨鸦的博客 6585

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Docker进程管理:容器内进程监控与信号处理机制

你是否遇到过容器明明显示"运行中"却无响应?或者执行`docker stop`后容器长时间无法退出?这些问题往往与Docker的进程管理机制密切相关。本文将从普通用户视角,解析Docker如何监控容器内进程状态,以及如何优雅地处理停止信号,帮助你避免90%的容器运维问题。 读完本文你将掌握: - 容器生命周期与进程状态的对应关系 - 如何正确发送信号控制容器内应用 - 进程监控的实现原理与常见问...

gitblog_00594的博客 1172

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

K8s概念之进程、容器与 Pod 的终极指南

本文用通俗比喻解析Kubernetes中进程、容器和Pod的区别:进程是程序执行的实例(如房间里的活动);容器是隔离的运行时环境(如独立房间);Pod则是多个容器的逻辑分组(如整栋房子),共享网络、存储并被统一调度。这三个概念层层嵌套,Pod作为Kubernetes最小调度单元,是应用部署的基本单位。通过"房子"的比喻和对比表格,帮助初学者快速理解这些核心概念的本质差异和相互关系。

daihaoxin的专栏 431

【docker】容器与守护进程运维

也称为 dockerd,是 Docker 的后台服务,负责管理 Docker 对象,如镜像、容器、网络和卷。:镜像是 Docker 世界的静态构建,它们是只读的模板,用于创建容器。:也称为 docker 命令行工具,是用户与 Docker 守护进程交互的方式。Supervisor是Linux系统下的一个进程管理工具,该工具具有实现进程自动回复的功能,不需要编写shell脚本。:容器是镜像的运行实例,是 Docker 架构中的运行时组件。all (-a) :显示所有的容器,包括未运行的。

2401_83763710的博客 882

终极容器诊断指南:witr与Docker容器内进程追踪的高级技巧

在容器化应用日益普及的今天,Docker容器内部进程的监控和诊断变得尤为重要。**witr**(Why is this running?)作为一个强大的进程追踪工具,为Docker容器内的进程分析提供了独特的解决方案。本文将为您揭示如何利用witr进行容器内进程追踪的高级技巧,帮助您快速定位和解决容器运行问题。 ## 🔍 为什么容器内进程追踪如此重要? 容器技术虽然简化了应用的部署和管理,但

gitblog_00478的博客 912

容器:单进程模型的革命与未来

在云计算和微服务的浪潮中,容器技术以其轻量级、高效和可移植性的特点,迅速成为软件开发和部署的新宠。其中,单进程模型作为容器技术的核心概念,对于理解容器的工作原理和优势至关重要。本文将深入探讨单进程模型在容器中的应用,并结合实际案例,分析其在现代软件架构中的重要地位和未来发展趋势。此外,随着容器技术的普及,如何确保容器的安全性和合规性也成为了一个重要的考虑因素。:通过Cgroups等技术,容器可以对资源进行精细化的调度和管理,确保应用程序能够获得所需的资源,同时避免资源的过度消耗。

summer_fish的专栏 644

Docker容器进程原理与实战管理指南

容器技术通过Linux命名空间和cgroups实现进程隔离,是轻量级虚拟化的核心实现。命名空间为进程提供独立的PID、网络和文件系统视图,而cgroups则负责资源配额控制。这种架构使Docker容器既能保持虚拟机级别的隔离性,又具备接近原生进程的性能优势。在微服务和云原生场景中,理解容器进程模型对性能调优、故障排查至关重要。通过ps、docker top等工具可以观察容器内外进程差异,而nsenter、strace等工具则用于跨命名空间调试。在生产环境中,需要特别关注僵尸进程处理、信号传递机制和cgrou

weixin_32430941的博客 323

【docker系列】容器自启动与守护进程停止后容器保活

一、Docker守护进程开机自启动,二、Docker容器自启动重启策略说明,三、Docker守护进程停止期间保证容器服务正常。

字母哥博客 8108

docker容器内与宿主机的进程ID对应关系

dotnet容器使用线程异常;想使用精简版本的createdump内存出来分析,不知道进程IP,不能使用命令ps,也不能联网;但createdump $pid; 1.容器在宿主机中的PID //宿主机中使用 docker inspect containerName |grep Pid 2.容器内部的PID //使用docker exec 进入容器内部 cat /proc/*/sched |grep threads 看到/proc/pid/xxx :中间的数字表示容器内部进程ID 3.容器内部PID与

atzqtzq的博客 4403

Docker - 查看容器日志与进程的实用技巧

Docker 容器日志与进程排查实用指南 本文深入解析 Docker 日志与进程管理的核心技巧,帮助开发者高效定位容器问题: 日志管理要点 Docker 日志本质是 stdout/stderr 流,默认通过 json-file 驱动存储 实用参数组合: --since+--until 精准时间筛选 --tail 100 -f 查看尾部日志并实时追踪 -t 显示 Docker 时间戳 Java 应用需特别注意日志配置,避免 System.out 打印导致日志丢失 进程排查技巧 docker top 查看容器进

千淘万漉虽辛苦,吹尽狂沙始到金 9251

Linux 探秘进程与 fork:从内核源码到容器化演进

fork系统调用看似简单,只是一个函数调用,但它背后却涉及到操作系统内核的复杂实现。从进程控制块的复制、内存的管理到文件描述符和信号处理的继承,都需要内核进行精细的处理。这 40 年来,fork的实现不断演进,增加了许多新的功能和优化,体现了计算机科学中简单与复杂的辩证关系。

conkl的博客 1393

UAV心跳机制与容器、进程数据采集

服务心跳机制主要用于确认服务的存活状态,UAVStack的心跳数据还负责上报节点的容器及进程监控数据,支持在前端实时查看应用容器和进程的运行状态,并根据这些数据对容器和进程做出预警。 一、背景 ...

238
上一篇: 详解K8s Pod对象的生命周期
下一篇: K8s之KubeSphere平台部署
云巅的cat
博客等级 码龄7年 42粉丝 27原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值