ssh是较可靠,专为远程登录会话和其他网络服务提供安全性的协议,广泛用于远程登录的场景,也是远程调试代码的神兵利器。在开发中经常会在服务器启动自己的 docker 容器进行开发,又需要调试代码,vim的调试环境配置起来门槛又太高。于是就有了使用Windows直接ssh打通docker进行调试的需求。本文记录Windows远程登录Linux服务器docker容器的方法。
环境说明 {#环境说明}
- 登录主机操作系统 Win 10
- 被登录主机操作系统 docker container in Linux
- 主机与被登录主机(此处指服务器,不是docker)网络联通,IP在同一网段
- 服务器与docker的IP在同一网段
配置方法 {#配置方法}
建立docker与Linux服务器的端口映射 {#建立docker与Linux服务器的端口映射}
ssh协议链接时默认使用22端口,Windows与docker的端口往往不能直接进行映射(很可能不在一个网段),因此需要将docker的22端口映射到Linux服务器的某个端口,此时需要在建立docker容器时进行配置:
- 其中
-p
的部分表示将本机(服务器)的3721端口映射到容器的22端口。
容器内部安装ssh服务 {#容器内部安装ssh服务}
需要在被登录的容器内部建立并启动ssh服务。
- 首先需要安装:
- 安装完成后需要容器每次启动时自动运行相关服务,可以在
~/.bashrc
中加入:
这样就保证了docker容器自动启动该服务。
- 查看ssh运行状态
如果是
* sshd is running
说明ssh正常运行
修改容器内root用户登录设置 {#修改容器内root用户登录设置}
有的容器默认不支持root用户远程使用ssh协议进行密码登录的,此时需要更改设置。
- 打开
/etc/ssh/sshd_config
文件:
- 将
PermitRootLogin
设置为 yes
修改root密码 {#修改root密码}
远程登录时需要使用系统的用户密码,我们就直接使用root用户登录好了,需要设置新建容器的密码:
设置SSH {#设置SSH}
-
将.pub 内容复制粘贴加入到远程 ~/.ssh/authorized_keys
SSH连接服务器 {#SSH连接服务器}
需要用户名(被登录端用户)与被登录的主机ip和端口号
例如: 用户名- root ip:192.168.10.12 端口映射为 3721
- linux
- Windows
- 如果不清楚Linux系统端口映射配置情况:
X-shell配置 {#X-shell配置}
命令行ssh登录成功后就可以在X-shell中建立配置信息方便地连接了。
- 新建会话,填写名称、IP、端口号(我们刚刚配置过的):
- 用户身份认证,填入用户名密码(刚刚配置过的):
- 随后就可以使用该会话直接登录docker容器了,为远程调试打下了坚实的基础:
填坑 {#填坑}
-
ssh: Could not resolve hostname 192.168.10.12:3721: Name or service not known
这是在Windows中使用了Linux格式的SSH登录命令导致的解析错误
将命令语法更换为Windows的格式即可
-
root 用户无论如何密码不被接受
需要在被登录主机 /etc/ssh/sshd_config 中设置:
- 重点:PermitRootLogin yes
-
Connection to 192.168.10.12 closed.
-
或
-
Connection closed by foreign host.
意思是 断开主机链接了,出现这种问题,跟你的IPTABLES,防火墙什么的都没关系。
造成这个原 因是因为原来连接到SSHD服务器进程的22端口,当你的客户端突然断开时,服务器端的TCP连接就处于一个半打开状态。当下一次同一客户机再次建立 TCP连接时,服务器检测到这个半打开的TCP连接,并向客户机回传一个置位RST的TCP报文,客户机就会显示connection closed by foreign host。
这是TCP协议本身的一个保护措施,并不是什么错误,你只要再重新连接服务器就能连上。--------- http://www.pooy.net/connection-closed-foreign-host.html
总结一下解决方案: 关机重启
参考资料 {#参考资料}
文章链接:
https://www.zywvvd.com/notes/system/windows/win-ssh-linux-docker/win-ssh-linux-docker/