我尝试从windows主机ssh到docker-ubuntu容器。我知道,我可以使用docker exec -it <container-name> /bin/bash
来启动,但是,我想做一个正常的"sshroot@192.168.xx.xx"登录,因为我想模拟远程计算机登录,而且它也很容易与我的pycharm配合使用。
然而,在我安装并启动了"openssh服务器"之后,仍然无法从主机使用ssh登录。
:~$ ssh root@192.168.99.105
>>> The authenticity of host '192.168.99.105 (192.168.99.105)' can't be established.
ECDSA key fingerprint is SHA256:********
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.99.105' (ECDSA) to the list of known hosts.
root@192.168.99.105's password: xxx
Permission denied, please try again.
我该如何解决这个问题?我只想简单地ssh到这个容器。。。
回答标题中提出的问题:
为什么我不能简单地从我的windows主机ssh到docker容器?
Docker是一种在进程上配置Linux内核设置的方法,以限制进程可以看到的内容(命名空间(和进程可以使用的资源数量(cgroups(。因此,这个问题变成了"为什么我不能ssh到一个进程中",答案通常是因为该进程不是sshd服务器。docker的Ubuntu镜像并不是一个包含所有相关守护进程的虚拟机,它甚至不包括内核。相反,它是一个最小的文件系统,具有Ubuntu环境中的实用程序(如apt-get
和bash
(。
另一方面,docker exec
命令确实有效,因为它在与容器其他部分相同的隔离环境中运行第二个命令。因此,如果映像中安装了bash
,那么docker exec -it $container_id bash
将运行一个与其他容器进程具有相同名称空间和cgroups的交互式shell。
如果您想ssh到您的容器中,我的建议是不要这样做。这类似于代码气味,表明您将容器视为VM,并且容器的不变性和短暂性会出现问题。使用容器的目标是将所有更改推入版本控制,构建一个新映像,并针对生产环境的每一次更改部署该映像。这消除了状态漂移的风险,即交互更改是由一个人随着时间的推移而做出的,而稍后试图重建环境的人并不知道。
如果您仍然希望忽略该建议,或者您的应用程序明确地是sshd服务器,那么您需要将sshd安装并配置为容器中正在运行的应用程序。Docker提供了关于如何做到这一点的文档,如果你在sshd上搜索,Docker Hub上有很多来自不同个人的例子(请注意,我不认为其中任何一个是官方的,所以我不会推荐任何一个(。
您可能需要在容器上配置sshd,以允许root访问和/或启用密码身份验证。
sudo sed -i 's|[#]*PasswordAuthentication no|PasswordAuthentication yes|g' /etc/ssh/sshd_config
echo PermitRootLogin yes | sudo tee -a /etc/ssh/sshd_config
sudo service sshd restart
如果容器映像是基于ubuntu/debian的,那么其中一个或两个命令可能会有所帮助。就我个人而言,我从未需要ssh到docker容器中。