nsenter工具进入docker容器
概述
对于运行在后台的docker容器,我们经常需要做的事情是进入到容器中,docker为我们提供了docker exec 、docker attach 命令,并且还提供了nsenter工具,外部工具供我们使用。docker attach存在的问题是:当多个窗口同时attach到同一个容器时,所有的窗口都会同步的显示,假如其中的一个窗口发生阻塞时,其它的窗口也会阻塞,docker attach命令可以说是最不方便的进入后台docker容器的方法。docker exec命令是在docker 1.3之后增加的一个比docker attach命令更加方便的命令。和docker exec差不多方便的命令是nsenter工具。
nsenter安装
$ cd /tmp;
$ curl https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz | tar -zxf-; cd util-linux-2.24;
$ ./configure --without-ncurses
$ make nsenter && sudo cp nsenter /usr/local/bin
nsenter使用
在使用nsenter命令之前需要获取到docker容器的进程,然后再使用nsenter工具进去到docker容器中,具体的使用方法如下:
$ docker inspect -f {
{.State.Pid}} 容器名或者容器id #每一个容器都有.State.Pid,所以这个命令除了容器的id需要我们根据docker ps -a去查找,其他的全部为固定的格式
$ nsenter --target 上面查到的进程id --mount --uts --ipc --net --pid #输入该命令便进入到容器中
解释nsenter指令中进程id之后的参数的含义:
* –mount参数是进去到mount namespace中
* –uts参数是进入到uts namespace中
* –ipc参数是进入到System V IPC namaspace中
* –net参数是进入到network namespace中
* –pid参数是进入到pid namespace中
* –user参数是进入到user namespace中
在Linux中,最爱简单的查看指定命令参数含义的办法是在终端中输入:
$ nsenter --help #会回显所有与该命令有关的参数
$ man nsenter #能查到更加详细的使用示例和参数说明
现象
启动docker容器
docker run –name [CONTAINER_NAME] [CONTAINER_ID]
查看容器运行状态
docker ps -a
发现刚刚启动的mydocker容器已经退出
原因
docker容器的主线程(dockfile中CMD执行的命令)结束,容器会退出
办法
可以使用交互式启动
docker run -i [CONTAINER_NAME or CONTAINER_ID]
上面的不太友好,建议使用后台模式和tty选项
docker run -dit [CONTAINER_NAME or CONTAINER_ID]
查看容器状态
docker ps -a
docker调出后台容器
docker attach [CONTAINER_NAME or CONTAINER_ID]
TIPs:退出时,使用[ctrl + D],这样会结束docker当前线程,容器结束,可以使用[ctrl + P][ctrl + Q]退出而不终止容器运行
如下命令,会在指定容器中执行指定命令,[ctrl+D]退出后不会终止容器运行
docker exec -it [CONTAINER_NAME or CONTAINER_ID] /bin/bash
nsenter工具进入docker容器概述对于运行在后台的docker容器,我们经常需要做的事情是进入到容器中,docker为我们提供了docker exec 、docker attach 命令,并且还提供了nsenter工具,外部工具供我们使用。docker attach存在的问题是:当多个窗口同时attach到同一个容器时,所有的窗口都会同步的显示,假如其中的一个窗口发生阻塞时,其它的窗口...
我们run了一个image,如果
容器
的任务执行完了,那么这个
容器
就会
退出
。当然我们想要exec 进入也就不行了。
如果不想要
容器
退出
,那么必须让
容器
的任务一直执行,比如一些web监听任务或者top命令等。
docker
file
FROM centos
docker
run -it id top
那么这个
容器
就会执行top,不会
退出
。
我们可以使用:
4、
运行
mysql:(run)
运行
时需要指定mysql密码,密码我设置为root
docker
run --name mysql -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7
5、查看所有正在
运行
的
容器
问题描述执行
docker
run image-id bash后,
容器
退出
解决方法
docker
容器
的主线程(dockfile中CMD执行的命令)结束,
容器
会
退出
有以下几种解决方法:使主进程无法结束
docker
run -d centos /bin/bash -c "while true;do echo hello
docker
;sleep 1;done"使用交互式启动
docker
run -
运行
容器
时可以指定其执行什么命令,但是这个命令执行完了,这个
容器
就自动终止了
所以这个命令执行不会完成,那么
容器
就不会终止
1.
docker
run时可以指定/bin/sh
"while true; do sleep 1; done”
2.
运行
容器
执行的脚本最后可以增加
#!/bin/bash
while [ 1 = 1 ]
sleep 1;
查看
容器
运行
状态
docker
ps -a
发现刚刚启动的my
docker
容器
已经
退出
原因
docker
容器
的主线程(dockfile中定义)结束,
容器
会
退出
办法
docker
run -dit ubuntu
After it, I can saw the processes runni
docker
run -d configserver tail -f /dev/null
docker
run -d configserver /bin/bash ping 127.0.0.1
docker
run -d configserver /bin/bash -c "while true;do