分享 | 交流
让学习成为一种习惯

进入docker容器工具之 nsenter

对于运行在后台的docker容器,我们经常需要做的事情是进入到容器中,docker为我们提供了docker exec 、docker attach 命令,并且还提供了nsenter工具,外部工具供我们使用。docker attach存在的问题是:当多个窗口同时attach到同一个容器时,所有的窗口都会同步的显示,假如其中的一个窗口发生阻塞时,其它的窗口也会阻塞,docker attach命令可以说是最不方便的进入后台docker容器的方法。docker exec命令是在docker 1.3之后增加的一个比docker attach命令更加方便的命令。

关于什么是 nsenter 请参考如下文章:https://github.com/jpetazzo/nsenter 。

在了解了什么是 nsenter 之后,我们需要把 nsenter 安装到主机中(注意:是主机而非容器或镜像),具体的安装命令如下:

$ wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz
$ tar -xzvf util-linux-2.24.tar.gz
$ cd util-linux-2.24/
$ ./configure --without-ncurses
$ make nsenter
$ sudo cp nsenter /usr/local/bin

或者可以直接yum安装
yum install -y util-linux

以上命令直接复制粘贴可用。安装好 nsenter 之后可以用nsenter --help查看该命令的使用。

nsenter 可以访问另一个进程的名称空间。所以为了连接到某个容器,还需要获取该容器第一个进程的PID。可以使用docker inspect -f {{.State.Pid}} <容器ID/名称>命令来拿到该PID,例如容器的ID为44fc0f0582d9,那么对应命令:

$ docker inspect -f {{.State.Pid}} 44fc0f0582d9
3326

在拿到该进程PID之后我们就可以使用nsenter命令访问该容器了。

$ sudo nsenter --target 3326 --mount --uts --ipc --net --pid
root@0b5c25f10a15:/#

其中的3326即刚才拿到的进程的PID。

nsenter启动容器最大的好处就是exit退出容器之后,不影响容器在后台的运行,不会自动退出容器

为了方便使用,我们把这个命令的执行写一个简单的脚本

vim in.sh
#!/bin/bash
CNAME=$1
CPID=$(docker inspect --format "{{.State.Pid}}" $CNAME)
nsenter --target "$CPID" --mount --uts --ipc --net --pid
使用的时候,直接 ./in.sh container 进入容器

未经允许不得转载:留时刻运维网 » 进入docker容器工具之 nsenter

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

留时刻 - Linux系统教程,运维经验分享

加入我们给我留言