【问题标题】:Unable to ssh localhost within a running Docker container无法在正在运行的 Docker 容器中 ssh localhost
【发布时间】: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 服务?

标签: linux docker ssh localhost containers


【解决方案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 不会向运行容器的环境(例如本地主机)开放自身。此配置打开它以允许通信。
    猜你喜欢
    • 1970-01-01
    • 2018-12-26
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 2022-07-18
    • 1970-01-01
    相关资源
    最近更新 更多