[toc]
- 使用SSH
- 使用nsenter、nsinit
- 使用docker exec
- 使用docker attach
使用ssh登陆进容器
在生产环境中排除了使用docker attach命令进入容器之后,相信大家第一个想到的就是ssh。在镜像(或容器)中安装SSH Server,这样就能保证多人进入,容器且相互之间也不受干扰,在当前的生产环境中(没有使用Docker的情况)也是这样做的。但是使用了Docker容器之后不建议使用ssh进入到Docker容
在容器中启动sshd,存在开销和攻击面增大的问题。同时也违反了Docker所倡导的一个容器一个进程的原则。
为什么不需要在 Docker 容器中运行 sshd
使用nsenter、nsinit等第三方工具
需要额外学习使用第三方工具。
nsenter可以访问另一个进程的名称空间。所以为了连接到某个容器我们还需要获取该容器的第一个进程的PID。
github网址:https://github.com/jpetazzo/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
$cp nsenter /usr/local/bin
Docker attach
所以大多数情况最好还是使用Docker原生方法,Docker目前主要提供了Docker exec和Docker attach方法
Docker attach可以attach到一个已经运行的容器的stdin,然后进行命令执行的动作。 但是需要注意的是,如果从这个stdin中exit,会导致容器的停止。
$docker attach containerId
但在,使用该命令有一个问题。当多个窗口同时使用该命令进入该容器时,所有的窗口都会同步显示。如果有一个窗口阻塞了,那么其他窗口也无法再进行操作。
因为这个原因,所以docker attach命令不太适合于生产环境,平时自己开发应用时可以使用该命令。
Docker exec
docker在1.3.X版本之后还提供了一个新的命令exec用于进入容器,这种方式相对更简单一些,下面我们来看一下该命令的使用
$docker exec -h
- -i时,由于没有分配伪终端,看起来像pipe执行一样。但是执行结果、命令返回值都可以正确获取
-
-t参数,则可以看到一个console窗口,但是执行命令会发现由于没有获得stdin
的输出,无法看到命令执行情况 - -it时,则和我们平常操作console界面类似。而且也不会像attach方式因为退出,导致 整个容器退出。 这种方式可以替代ssh或者nsenter、nsinit方式,在容器内进行操作,very nice
- -d参数在后台执行一个进程。可以看出,如果一个命令需要长时间进程,使用-d参数会很快返回,程序在后台运行。如果不使用-d参数,由于命令需要长时间执行,docker exec会卡住,一直等命令执行完成才返回
2017-11-27-Boy