【问题标题】:docker: SSH access directly into containerdocker:直接通过 SSH 访问容器
【发布时间】:2016-01-15 01:47:17
【问题描述】:

到目前为止,我们使用了几个 linux 用户:

  • system_foo@server
  • system_bar@server
  • ...

我们想把系统用户放到 docker 容器中。

  • linux 用户system_foo --> 容器system_foo

服务器内部的变化没有问题,但是远程系统使用这些用户向我们发送数据。

我们需要让ssh system_foo@server 工作。无法更改远程系统。

如果每个 linux 操作系统只有一个系统(将端口 22 传递给容器),我会很容易。但是有好几个。

我们如何才能从旧方案更改为 docker 容器并保持服务ssh system_foo@server 可用而不在远程站点进行更改?

如果您不理解问题,请发表评论。谢谢。

【问题讨论】:

  • 所以你想要每个连接一个容器?你不能把docker run配置成etc/passwd中的用户shell吗?
  • 我说对了吗?:您想创建一个类似虚拟机的环境。这样每个用户都有自己的容器(VM),用户可以通过 ssh 进入它并做任何想做的事情。
  • @ZeissS 是的,也许/etc/passwd 中的简单包装脚本就足够了。我需要调查端口转发和子协议 sftp 是否也在工作。感谢您的“回答”。
  • @beginer 是的,之前允许通过 ssh 访问该帐户,并且在我们内部更改之后应该允许。

标签: linux ssh virtualization docker


【解决方案1】:

但是,让我们记住,在容器中支持 ssh 通常是一种反模式(除非它只是您的容器“关注”但那么能够 ssh 的意义何在。请参阅 http://techblog.constantcontact.com/devops/a-tale-of-three-docker-anti-patterns/ 了解有关信息那个反模式

【讨论】:

  • 是的,它是一种反模式。这就是为什么我们不会在我们的案例中使用 docker。
【解决方案2】:

nsenter 可以为您工作。首先 ssh 到主机,然后 nsenter 到容器。

PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)`
nsenter --target $PID --mount --uts --ipc --net --pid

来源 http://jpetazzo.github.io/2014/06/23/docker-ssh-considered-evil/

【讨论】:

    【解决方案3】:

    根据 cmets 判断,您可能正在寻找像 dockersh 这样的解决方案。 dockersh 用作登录外壳,允许您将登录到您的实例的每个用户放置到一个隔离的容器中。

    这可能不会让你使用sftp

    请注意,dockersh 在其 README 中包含安全警告,您一定要查看:

    警告:虽然这个项目试图让用户进入容器 降低了权限并放弃了限制用户能力的能力 提升他们的权限级别,不一定是完全的 安全的。值得注意的是,当 Docker 添加用户命名空间支持时,这可以是 用于进一步锁定权限。

    【讨论】:

      【解决方案4】:

      几个月前,我这样帮助过我。这不好,但有效。但 需要使用 pub-key auth。

      .ssh/authorized_keys 中通过command 调用的脚本

      #!/usr/bin/python
      import os
      import sys
      import subprocess
      cmd=['ssh', 'user@localhost:2222']
      if not 'SSH_ORIGINAL_COMMAND' in os.environ:
          cmd.extend(sys.argv[1:])
      else:
          cmd.append(os.environ['SSH_ORIGINAL_COMMAND'])
      sys.exit(subprocess.call(cmd))
      

      文件系统_foo@server: .ssh/authorized_keys

      command="/home/modwork/bin/ssh-wrapper.py" ssh-rsa AAAAB3NzaC1yc2EAAAAB...
      

      如果远程系统执行ssh system_foo@server,则位于server 的SSH 守护程序将执行.ssh/authorized_keys 中给出的命令。此命令对不同的 ssh-daemon 执行 ssh。

      在 docker 容器中,需要运行监听 2222 端口的 ssh-daemon。

      【讨论】: