无法在正在运行的 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 ssh
和man 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的主要内容,如果未能解决你的问题,请参考以下文章
SSH 权限被拒绝(公钥、密码) - 容器 docker ubuntu 18.04