本博客为个人学习极客时间中张磊课程时所作的笔记,仅作交流,不得作为商用
目录
什么是进程
什么是进程?相信很多人都能回答上来,对于进程,其静态表现就是程序,大部分时间都安安静静待在磁盘上;而一旦运行起来,即其动态表现,程序被翻译、解释并运行,然后从磁盘空间或I/O设备加载相关数据,可能还要访问网络资源,接着系统根据程序运行计算机指令......也就是说,进程是程序运行起来后计算机执行环境的总和,而这,也是容器的基础——因为容器,其实是一种特殊的进程。
进程的边界
容器之所以被称为特殊的进程,是因为容器这个进程是有边界的。上一篇博客提到容器是一种沙盒技术,即能够向集装箱一样把应用装起来,这样应用与应用之间因为存在边界而不至于互相干扰,而被装进集装箱的应用也能被方便的搬运——这就是PaaS最理想的状态。容器技术的核心功能,就是通过约束和修改进程的动态表现,从而为其人为打造“边界”。在Linux中,Cgroup技术是用来制造约束的主要手段,而Namespace技术则是修改进程视图的主要方法,即让进程看到的资源信息与实际资源信息不同,俗称“障眼法”。
Linux的障眼法
我们可以通过创建一个Docker容器来体验Linux的障眼法,本文环境为CentOS 7+,通过yum安装docker,简明流程如下:
1.更新yum源
#yum -y update
2.添加yum仓库
# cat >/etc/yum.repos.d/docker.repo <<-EOF
然后输入
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF3.安装Docker包
#yum install -y docker-engine
4.检查docker-selenux有没有安装,如果未安装,执行(一般情况下应该安装了)
# yum install -y docker-selinux
5.启动服务
# systemctl start docker.service
首先创建一个容器(第一次创建会从远端拉去镜像,然后启动并进入容器):
# docker run -it busybox /bin/sh
/ #其中,
-i: --interactive(相互作用的) Keep STDIN open even if not attached(即使没有连接,也要保持STDIN打开)
-t: --tty Allocate a pseudo-TTY(分配一个 冒充的终端设备)
这条指令的意思是:启动容器、在容器中执行/bin/sh,为我分配命令行终端与容器交互。
执行ps指令查看进程信息:
/ # ps
PID USER TIME COMMAND
1 root 0:00 /bin/sh
5 root 0:00 ps
/ #
可以发现/bin/sh进程的PID为1,说明/bin/sh与ps进程都被Docker隔离在了一个与宿主机(运行容器的机器)完全不同的环境中。
如何做到的呢?
其实很简单,Linux系统会为每个进程分配唯一的PID号,就像员工工牌,如果PID=100意味着你是公司第100号员工,1号员工就是老板,每个新员工入职时都会分配工号并递增。Docker做的就是在101号员工入职时给他施“障眼法”,使其看不到前面的100号员工,使其错误的以为自