Docker容器进入的4种方式

[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
Docker容器进入的4种方式_第1张图片
docker exec
  • -i时,由于没有分配伪终端,看起来像pipe执行一样。但是执行结果、命令返回值都可以正确获取
  • -t参数,则可以看到一个console窗口,但是执行命令会发现由于没有获得stdin
    的输出,无法看到命令执行情况
  • -it时,则和我们平常操作console界面类似。而且也不会像attach方式因为退出,导致 整个容器退出。 这种方式可以替代ssh或者nsenter、nsinit方式,在容器内进行操作,very nice
  • -d参数在后台执行一个进程。可以看出,如果一个命令需要长时间进程,使用-d参数会很快返回,程序在后台运行。如果不使用-d参数,由于命令需要长时间执行,docker exec会卡住,一直等命令执行完成才返回

                                     2017-11-27-Boy

你可能感兴趣的:(Docker容器进入的4种方式)