进入Docker容器的4种方式
- 使用docker attach
- 使用SSH
- 使用nsenter
- 使用docker exec
一、使用docker attach进入Docker容器
Docker提供了attach命令来进入Docker容器。
接下来我们创建一个守护态的Docker容器,然后使用docker attach命令进入该容器。
$ docker run -itd ubuntu /bin/bash
然后我们使用docker ps查看到该容器信息,接下来就使用docker attach进入该容器
$ docker attach 44fc0f0582d9
可以看到我们已经进入到该容器中了。
但在,使用该命令有一个问题。当多个窗口同时使用该命令进入该容器时,所有的窗口都会同步显示。如果有一个窗口阻塞了,那么其他窗口也无法再进行操作。
因为这个原因,所以docker attach命令不太适合于生产环境.
二、使用SSH进入Docker容器
在生产环境中排除了使用docker attach命令进入容器之后,相信大家第一个想到的就是ssh。在镜像(或容器)中安装SSH Server,这样就能保证多人进入
容器且相互之间不受干扰了,相信大家在当前的生产环境中(没有使用Docker的情况)也是这样做的。但是使用了Docker容器之后不建议使用ssh进入到Docker容
器内。关于为什么不建议使用,请参考如下文章:
为什么不需要在 Docker 容器中运行 sshd
三、使用nsenter进入Docker容器
nsenter是一个小的工具,用来进入命名空间中。技术上,它可以进入现有的命名空间,或者产生一个进程进入新的一组命名空间。“命名空间是什么?”他们是容器的重要组成部分。简单点说:通过使用 nsenter ,你可以进入一个已经存在的container中,尽管这个container没有运行ssh 或者任意特殊用途的守护进程。
从哪里获得 nsenter ?
在GitHub上查看 jpetazzo/nsenter 。简单的安装是:
$ docker run -v /usr/local/bin:/target jpetazzo/nsenter
它将会把 nsenter 安装到 /usr/local/bin 中,你就可以立刻使用它了。
</br>
或者你也可以使用源码安装
nsenter 也可以在你的发行版中获得(在 util-linux 包中)。
$ curl https://www.kernel.org/pub/linux/utils/util-linux/v2.30/util-linux-2.30.tar.gz | tar -zxf-
$ cd util-linux-2.30/
$ ./configure --help
$ ./configure --without-ncurses
$ make nsenter && cp nsenter /usr/local/bin/
nsenter可以访问另一个进程的名称空间。所以为了连接到某个容器我们还需要获取该容器的第一个进程的PID。可以使用docker inspect命令来拿到该PID。
如何使用?
首先,计算出你要进入容器的PID:
$ PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
然后进入容器:
nsenter --target $PID --mount --uts --ipc --net --pid
root@dockerhost:~# docker run -itd --name ubuntu_test ubuntu
b06fae9dcf21d808e8d58a5a7fcfa56b09f0ae861851e61f53984da4e8c0ff63
root@dockerhost:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b06fae9dcf21 ubuntu "/bin/bash" 3 seconds ago Up 2 seconds ubuntu_test
root@dockerhost:~# docker inspect --format {{.State.Pid}} ubuntu_test
110383
root@dockerhost:~# PID=$(docker inspect --format {{.State.Pid}} ubuntu_test)
root@dockerhost:~# echo $PID
110383
root@dockerhost:~# nsenter --target $PID --mount --uts --ipc --net --pid
mesg: ttyname failed: No such file or directory
root@b06fae9dcf21:/# w
w: 62 column window is too narrow
root@b06fae9dcf21:/# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 12:36 pts/0 00:00:00 /bin/bash
root 9 0 0 12:38 ? 00:00:00 -bash
root 16 9 0 12:38 ? 00:00:00 ps -ef
root@b06fae9dcf21:/#
当然,如果你认为每次都输入那么多参数太麻烦的话,网上也有许多做好的脚本供大家使用。
地址如下:
http://yeasy.gitbooks.io/docker_practice/content/container/enter.html
http://www.tuicool.com/articles/eYnUBrR
四、使用docker exec进入Docker容器
除了上面几种做法之外,docker在1.3.X版本之后还提供了一个新的命令exec用于进入容器,这种方式相对更简单一些,下面我们来看一下该命令的使用:
$ docker exec --help
$ docker exec -it b06fae9dcf21 /bin/bash