【问题标题】:connect via ssh to jhipster docker container on CentOS 7通过 ssh 连接到 CentOS 7 上的 jhipster docker 容器
【发布时间】:2014-10-15 05:23:40
【问题描述】:

我已经安装了 docker (version 0.11.1-dev, build 02d20af/0.11.1);似乎是 CentOS 7 的最新版本(yum update docker 表示没有更新)。

按照installation instructions on jhipster site,我已经拉出当前图像并运行:

sudo docker run -v ~/jhipster:/jhipster -p 8080:8080 -p 9000:9000 -p 4022:22 -t --name jhipster jdubois/jhipster-docker

图像运行正常。但是我无法通过 ssh 连接。如果我使用详细选项运行 ssh

ssh -vv -p 4022 jhipster@localhost

我明白了:

OpenSSH_6.4, OpenSSL 1.0.1e-fips 11 Feb 2013
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 51: Applying options for *
debug2: ssh_connect: needpriv 0
debug1: Connecting to localhost [::1] port 4022.
debug1: Connection established.
debug1: identity file /home/normunds/.ssh/id_rsa type 1
debug1: identity file /home/normunds/.ssh/id_rsa-cert type -1
debug1: identity file /home/normunds/.ssh/id_dsa type -1
debug1: identity file /home/normunds/.ssh/id_dsa-cert type -1
debug1: identity file /home/normunds/.ssh/id_ecdsa type -1
debug1: identity file /home/normunds/.ssh/id_ecdsa-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_6.4
debug1: Remote protocol version 2.0, remote software version OpenSSH_6.6p1 Ubuntu-2ubuntu1
debug1: match: OpenSSH_6.6p1 Ubuntu-2ubuntu1 pat OpenSSH*
debug2: fd 3 setting O_NONBLOCK
debug1: SSH2_MSG_KEXINIT sent
Connection closed by ::1

如果我尝试访问另一个 Ubuntu 主机,我会收到相同的序列(除了主机、端口和 OpenSSH 版本),但不是最后一行显示“连接已关闭”:

debug1: SSH2_MSG_KEXINIT received

最终连接成功。

我尝试通过 localhost:4022, ip-of-container:22 连接;从本地或远程主机获得相同的结果。

所以问题似乎出在容器或 docker 中(或者最终是 docker 中的 ubuntu 设置)。然而docker top jhipster 显示我 sshd 正在运行 - 是的,跟踪显然表明我到达了 ssh 服务器。

有什么想法吗?

已编辑我运行了 docker 镜像,使其进入命令行,然后在调试模式下运行 sshd

sudo docker run -v ~/projects:/jhipster -p 8080:8080 -p 9000:9000 -p 4022:22 -t -i --name jhipster jdubois/jhipster-docker /bin/bash

/usr/sbin/sshd -d

为了进一步调试。在连接尝试 sshd 时失败:

chroot("/var/run/sshd"): 不允许操作[preauth]

【问题讨论】:

    标签: ubuntu ssh centos docker jhipster


    【解决方案1】:

    1) ssh 访问

    CentOS 7 看起来问题在于 CentOS 7 存储库只有一个旧的 Docker 版本; CentOS 6Ubuntu 都使用 1.1.2 版本。 CentOS 7 上的问题可以通过使用命令行选项运行图像(如 OP 的编辑部分)然后运行来绕过:

    sed 's/UsePrivilegeSeparation yes/UsePrivilegeSeparation no/' -i /etc/ssh/sshd_config

    /usr/sbin/sshd

    CentOS 6 在运行 Docker 1.1.2 的 CentOS 6 中进行测试时,我没有遇到同样的问题(ssh 连接更远,因此我假设错误CentOS 7 上是由 Docker 版本引起的),但是 ssh 在客户端 pam 会话上出现错误后立即断开连接未打开并且在容器端PAM: pam_open_session(): 无法为指定会话创建/删除条目

    这里看起来它与 [FIXED] ubuntu 14.04 container with ssh login issues #5663 相关。即使它被标记为“固定”。无论如何,我尝试过的线程中提到的解决方案之一足以解决我的 ssh 连接问题:

    sed '/pam_loginuid.so/s/^/#/g' -i /etc/pam.d/*

    看来,跑起来也够了:

    sed 's/UsePAM yes/UsePAM no/' -i /etc/ssh/sshd_config

    相反,但我没有尝试这个选项。

    结论:CentOS上的ssh连接可以通过命令行运行镜像来修复

    sudo docker run -v ~/projects:/jhipster -p 8080:8080 -p 9000:9000 -p 4022:22 -t -i --name jhipster jdubois/jhipster-docker /bin/bash

    然后是上面讨论的 CentOS 6/CentOS 7 的不同“修复”,然后

    /usr/sbin/sshd

    2) 此时我们可能会问:“为什么要ssh”?一旦我们到达命令行,我们需要做的就是:

    su jhipster
    cd /jhipster
    yo jhipster
    

    对吗?几乎是这样,但这里我们还有另一个问题。在两个 CentOS 版本上再次不同。如果我们通过 ssh 连接,它也会出现。

    在使用旧 Docker 版本的 CentOS 7 上,我们需要修改主机目录的 selinux 上下文(在我们的例子中为 ~/jhipster ):

    chcon -Rt svirt_sandbox_file_t ~/jhipster

    CentOS 6 上这不是必需的(并且 svirt_sandbox_file_t 作为选项不存在),但是容器内的共享文件夹对用户不可用 jhipster。我们首先,作为 root,需要运行:

    chown jhipster:jhipster /jhipster

    然后已经:

    su jhipster
    cd /jhipster
    yo jhipster
    

    【讨论】:

    • “旧 Docker 版本”是什么意思?
    • 当时 Centos 7 存储库只包含一个相对较旧的版本。今天它似乎是最新的。
    • 好的,谢谢,但还是需要svirt_sandbox_file_t,这和老的docker版本无关,而是为了增强Centos7的安全性。
    猜你喜欢
    • 2017-06-30
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多