如何确定一个进程是否在lxc/Docker内运行
简介
这篇文章的主要目标是找出该过程是否在集装箱内。我们已经讨论了几种可以帮助我们从容器中过滤出非容器机器的方法。简单的命令和一些特殊的内核文件被用来总结我们的观点。
前提条件
要在你的设置机器上实施完整的文章,你需要具备以下列出的先决条件 —
- Linux操作系统。乌班图
-
Docker守护程序和客户端
方法
下面列出了一些有助于识别机器的方法。该机器可能是一个集装箱或一个非集装箱。
- 使用环境变量
-
使用.dockerenv文件
-
使用控制组信息
-
使用CPU信息
-
使用进程ID。
使用Docker环境
环境变量是用来保存/储存信息的。这些信息可以是一个特定文件的路径、用户名、密码等。
这里我们将创建一个环境变量,存储 “DockerContainer “这个文本。这个环境变量将在运行时传递给容器镜像。
第1步:创建一个Docker文件
在这里,我们创建了一个最小版本的Dockerfile,它需要满足我们用环境变量创建Docker镜像的要求。
# the bash image we are using is Busybox:latest
FROM busybox:latest
#create an environment variable needed when starting this image as a container
ENV TEST_ENV="Docker-Container"
第2步:建立图像
现在为这个Docker文件建立一个Docker镜像。
示例
$ docker build -t env_test:latest.
输出
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM busybox:latest
---> 9d5226e6ce3f
Step 2/2 : ENV TEST_ENV="Docker-Container"
---> Running in b993407fa937
Removing intermediate container b993407fa937
---> c9e931c275be
Successfully built c9e931c275be
Successfully tagged env_test:latest
第3步:运行该容器
在这里,我们已经运行了容器,也传递了环境变量。
$docker run -itd -e TEST_ENV="Docker-Container" --name cont env_test:latest
第4步:检查你现在是否在一个容器中
$echo $TEST_ENV
现在让我们进入容器内,再次检查一下
$docker exec -it cont sh
/# echo $TEST_ENV
输出
Docker-Container
因此,这证明我们在Docker容器内。
使用.dockerenv文件
在创建Docker容器时,会在容器的根部创建一个文件”.dockerenv”。因此,搜索这个文件可以帮助我们知道我们是否在docker容器内。
$ ls -la | grep ./dockerenv
这没有输出,因此文件丢失。
现在在Container机器上试一下–
/ # ls -la | grep .dockerenv
输出
-rwxr-xr-x 1 root root 0 Dec 18 14:00 .dockerenv
因此,这证明了我们是在集装箱上。
使用proc文件系统
特殊文件是Linux文件系统的一个强有力的组成部分。其中一个特殊系统是proc文件系统。这是用来存储内核的状态。
我们在这个proc文件系统中有控制组和CPU时间表。控制组的信息被存储在一个特定的位置。这些组对非容器机和容器机有不同的数据。控制组的路径是/proc/1/cgroup _,CPU时间表的路径是/proc/1/sched_。
第1步:非集装箱式机器
在非容器机器(如Ubuntu)上两个位置的数据 –
示例
$ cat /proc/1/sched | head -n 1
输出
systemd (1, #threads: 1)
在对照组中。
示例
$ cat /proc/1/cgroup | head -n 1
输出
0::/init.scope
第2步:集装箱机
现在在容器上。
示例
/# cat /proc/1/sched | head -n 1
输出
bash (1, #threads: 1)
上面的输出显示,第一个调度是针对bash或容器中的入口点命令。但对于非容器的机器来说,是_systemd _ (Ubuntu)。
对于对照组–
示例
/ # cat /proc/1/cgroup | head -n 1
输出
0::/
使用进程ID
Linux中的每个进程都有一个独特的ID,称为PID。有一个进程kthread只存在于非容器型机器上。它的PID是固定为2号的。因此,通过检查_PID 2 _我们可以识别我们是否在一个容器中。
在非集装箱式机器上
示例
$ ps 2
输出
PID TTY STAT TIME COMMAND
2 ? S 0:00 [kthreadd]
在容器机上,它可能不会显示任何进程。除了kthread以外的进程也是可能的。
结论
内核文件的使用被认为是上述所有方法中最好的方法。有时对于Docker容器.dockerinit文件被用来知道你是否在一个容器中。