无法在正在运行的 Docker 容器中 ssh localhost

Posted

技术标签:

【中文标题】无法在正在运行的 Docker 容器中 ssh localhost【英文标题】:Unable to ssh localhost within a running Docker container 【发布时间】:2017-10-31 19:25:29 【问题描述】:

我正在为需要 ssh 到 localhost(即 ssh user@localhost)的应用程序构建 Docker 映像

我正在使用 Ubuntu 桌面机器,并从一个基本的 ubuntu:16.04 容器开始。 以下是我的 Dockerfile 的内容:

FROM ubuntu:16.04

RUN apt-get update && apt-get install -y \
        openjdk-8-jdk \
        ssh && \
        groupadd -r custom_group && useradd -r -g custom_group -m user1

USER user1

RUN ssh-keygen -b 2048 -t rsa -f ~/.ssh/id_rsa -q -N "" && \
        cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

然后我使用命令构建这个容器:

docker build -t test-container .

并使用以下命令运行它:

docker run -it test-container

容器打开并显示以下提示,并且正确生成密钥以启用 ssh 进入 localhost:

user1@0531c0f71e0a:/$ 
user1@0531c0f71e0a:/$ cd ~/.ssh/
user1@0531c0f71e0a:~/.ssh$ ls
authorized_keys  id_rsa  id_rsa.pub

然后 ssh 进入 localhost 并出现错误:

user1@0531c0f71e0a:~$ ssh user1@localhost
ssh: connect to host localhost port 22: Cannot assign requested address

我做错了什么或需要配置任何其他网络设置吗?我只想通过 ssh 进入正在运行的容器中的 localhost。

【问题讨论】:

我猜你选择了错误的包名,即。 ssh 而不是 openssh-server 您使用 IP v6 吗?尝试ssh -4 -v 添加详细并强制 IP v4 嗨@rups 我将'ssh'更改为'openssh-server',仍然受到同样错误的困扰:\ 嗨@user2915097,我在命令中添加了标志并得到:user1@4117512c2196:/$ ssh -4 -v user1@localhost OpenSSH_7.2p2 Ubuntu-4ubuntu2.2, OpenSSL 1.0.2g 1 Mar 2016 debug1: Reading configuration data /etc/ssh/ssh_config debug1: /etc/ssh/ssh_config line 19: Applying options for * debug1: Connecting to localhost [127.0.0.1] port 22. debug1: connect to address 127.0.0.1 port 22: Connection refused debug1: Connecting to localhost [127.0.0.1] port 22. debug1: connect to address 127.0.0.1 port 22: Connection refused ssh: connect to host localhost port 22: Connection refused 你在哪里启动了 ssh 服务? 【参考方案1】:

首先需要在镜像构建脚本中安装ssh服务器:

RUN sudo apt-get install -y openssh-server

然后你需要启动ssh服务器:

RUN sudo /etc/init.d/ssh start

或者甚至可能在 Dockerfile 的最后几行(您必须实例化一个二进制文件以保持容器运行......)

 USER root
 CMD [ "sh", "/etc/init.d/ssh", "start"]

在主机上比

# init a container from an the image
run -d --name my-ssh-container-name-01 \
    -v /opt/local/dir:/opt/container/dir my-image-01

【讨论】:

【参考方案2】:

正如 OP cmets 中的 @user2915097 所述,这是由于容器中的 ssh 实例试图使用 IPv6 连接到主机。 使用-4 强制通过 IPv4 连接解决了这个问题。

$ docker run -it ubuntu ssh -4 user@hostname

【讨论】:

我们可以将 SSH 设置为默认使用 IPV4 吗? @Raptor0009 是的,带有选项AddressFamily inet。可以使用ssh -o 传递。详情请参阅man sshman ssh_config【参考方案3】:

对于 Docker Compose,我可以将以下内容添加到我的 .yml 文件中:

network_mode: "host"

我相信 Docker 中的等价物是:

--net=host

文档:

https://docs.docker.com/compose/compose-file/compose-file-v3/#network_mode

https://docs.docker.com/network/#network-drivers

host:对于独立容器,移除容器之间的网络隔离 容器和 Docker 主机,并直接使用主机的网络。 请参阅使用主机网络。

【讨论】:

@M.Liver 我添加了一些文档链接,但我相信默认情况下 docker 不会向运行容器的环境(例如本地主机)开放自身。此配置打开它以允许通信。

以上是关于无法在正在运行的 Docker 容器中 ssh localhost的主要内容,如果未能解决你的问题,请参考以下文章

gitlab 在 docker 容器中运行

尝试从 docker 容器中使用 SSH 密钥 [重复]

SSH 权限被拒绝(公钥、密码) - 容器 docker ubuntu 18.04

如何在 OSX(boot2docker)上获得与 docker 容器的 ssh 连接

如何ssh docker容器

为Docker容器中运行的gitlab添加ssh的一些问题记录