开发工具
FinalShell 搞不定 Docker 容器?SSH 连接和调试的几个小技巧!
FinalShell 是很多开发者管理服务器的利器,但第一次用它连接 Docker 容器或者进行 SSH 调试时,可能遇到不少小麻烦。比如连接不稳定、文件传输慢、或者不知道怎么进行端口转发来调试应用。这篇实操帖就是来帮你解决这些问题的,让你轻松搞定 Docker 容器的管理和调试,提升开发效率。
FinalShell 如何连接 Docker 容器的 SSH 服务?
如果你在 Docker 容器镜像中内置或已安装 SSHD 服务,即可用 FinalShell 连接。
操作步骤:
- 获取连接信息:
- 端口映射: 如果 Docker 容器在启动时做了端口映射,例如
docker run -p 2222:22 ...,那么可以通过宿主机的2222端口连接容器的22端口。 - 容器 IP: 如果没有端口映射,或容器与宿主机在同一 Docker 网络,可以用
docker inspect <容器ID或名称>命令查找容器的 IP 地址。
- 端口映射: 如果 Docker 容器在启动时做了端口映射,例如
- FinalShell 新建 SSH 连接:
- 打开 FinalShell 客户端(我这里以 4.6.1 版本为例),点击左上角的“连接”按钮,选择“新建SSH连接”。
- 在弹出的窗口中,填写以下信息:
- 名称: 给连接起一个好记的名字。
- 主机: 填写宿主机的 IP 地址(如果做了端口映射)或者容器的 IP 地址。
- 端口: 填写映射后的宿主机端口,或者容器的 SSHD 端口(通常是 22)。
- 用户名: 容器内 SSH 服务的用户名(如 root)。
- 密码: 对应用户的密码。
- 连接: 点击“确定”保存后,双击列表中的连接项。如果连接失败,请检查 IP、端口、用户名、密码是否正确,以及容器内的 SSHD 服务是否正常运行。
FinalShell 连接 Docker 容器为何总是中断或很慢?
FinalShell 连接 Docker 容器出现中断或速度慢,多半不是 FinalShell 本身问题,而是源于宿主机、容器网络或容器内部环境。
排查方法:
- 网络问题: 检查宿主机到容器的网络是否稳定。可以尝试在宿主机上
ping容器 IP,或者检查 Docker 的网络配置。 - 容器资源不足: 如果容器运行的应用非常占用 CPU 或内存,可能导致 SSHD 服务响应缓慢甚至卡死。你可以通过
docker stats命令查看容器的资源使用情况。我踩过一个坑,有次连接 Docker 容器 SSH 老断线,后来发现是服务器内存不足,容器被 OOM Kill 了。所以,除了网络,服务器负载也得关注。 - SSH KeepAlive 设置: 在 FinalShell 的连接设置里,有一个“高级”选项,可以设置“保持连接”的心跳时间。如果你经常遇到空闲时断开连接,可以把这个时间调短一些,比如每 30 秒发送一个心跳包,能有效防止连接自动关闭。
- 宿主机防火墙: 确保宿主机的防火墙(如
firewalld或ufw)没有阻断到容器 SSH 端口的连接。
FinalShell 如何方便调试 Docker 容器内应用?
在 Docker 容器内部调试应用程序,通常会用到端口转发。FinalShell 提供了非常方便的端口转发功能,可以将容器内部的服务端口映射到本地机器,这样你就可以直接在本地使用 IDE 或调试器连接到容器内的服务进行调试。
操作步骤:
- 确定服务端口: 首先,你需要知道你的应用程序在 Docker 容器内监听的是哪个端口。比如,一个 Java 应用可能监听 8080 端口。
- 配置端口转发:
- 在你已建立的 Docker 容器 SSH 连接上右键,选择“属性”。
- 切换到“端口转发”选项卡。
- 点击“添加”,选择“本地端口转发”。
- 填写:名称、监听地址 (通常 127.0.0.1)、监听端口 (本地机器上你希望使用的端口,如 8080)、目标地址 (容器的 IP 地址)、目标端口 (容器内应用程序监听的端口,如 8080)。
- 勾选“启用”,然后点击“确定”保存。
- 启动本地调试器: 配置完成后,只要 FinalShell 的 SSH 连接是活跃的,你就可以在本地机器上,通过
localhost:8080(这里以端口 8080 为例) 来访问容器内运行的服务了。这意味着你可以用 VS Code、IntelliJ IDEA 等 IDE 的远程调试功能,直接连接到你的本地转发端口,从而实现对容器内应用程序的断点调试。
更多关于端口转发的详细设置,可以参考这篇教程:FinalShell 端口转发配置指南。
FinalShell 怎么快速传输 Docker 容器文件?
FinalShell 集成了强大的 SFTP 功能,让你无需额外的工具就能方便地在本地和 Docker 容器之间拖拽传输文件。
操作步骤:
- 连接容器: 确保你的 FinalShell 已成功连接到 Docker 容器的 SSH 服务。
- 使用 SFTP 面板: 连接成功后,FinalShell 窗口左侧会显示一个文件浏览器面板,这就是 SFTP 功能区。左侧是远程服务器(这里是你的 Docker 容器)的文件系统,右侧是你的本地文件系统。
- 文件传输:
- 上传: 直接从右侧的本地文件系统,拖拽文件或文件夹到左侧的容器文件系统中的目标路径。
- 下载: 从左侧的容器文件系统,拖拽文件或文件夹到右侧的本地文件系统中的目标路径。
- 其他操作: 你也可以在文件浏览器中右键点击文件或文件夹,进行新建、删除、重命名等操作。
SFTP 传输的体验非常流畅,特别适合在开发过程中频繁修改配置文件或者上传部署包。如果你想了解更全面的文件传输技巧,可以查看这篇文章:FinalShell SFTP 文件传输详细教程。
FinalShell 如何配置 SSH 密钥实现 Docker 容器免密登录?
每次输入密码连接 Docker 容器 SSH 可能会很麻烦,尤其是在需要频繁连接多个容器时。使用 SSH 密钥对实现免密登录是一种更安全、更高效的方式。
操作步骤:
- FinalShell 生成密钥对:
- 打开 FinalShell,点击顶部菜单栏的“工具” -> “SSH密钥生成器”。
- 选择 RSA 或 ECDSA 算法,设置密钥长度,然后点击“生成”。
- 生成后,点击“保存公钥”和“保存私钥”按钮,将密钥文件保存到本地。私钥文件通常是
.pem或.ppk格式。
- 公钥复制到容器:
- 用 FinalShell 的密码连接方式登录到你的 Docker 容器。
- 在容器内,创建
.ssh目录(如果不存在):mkdir -p ~/.ssh && chmod 700 ~/.ssh。 - 将刚才生成的公钥内容(通常以
ssh-rsa ...开头的那一大段文本)追加到容器的~/.ssh/authorized_keys文件中。别忘了设置文件权限:chmod 600 ~/.ssh/authorized_keys。
- FinalShell 连接配置私钥:
- 右键你的 Docker 容器 SSH 连接,选择“属性”。
- 在“认证”选项卡中,选择“密钥认证”。
- 点击“私钥文件”旁边的文件夹图标,选择你之前保存的私钥文件。如果你的私钥设置了密码(passphrase),请一并填入。
- 测试: 保存设置后,再次尝试连接你的 Docker 容器。现在应该无需输入密码就能直接登录了。
SSH 密钥的配置方法在管理多个服务器时尤其有用,也能提高连接的安全性。更详细的密钥配置指南,可以参考这篇:FinalShell SSH 密钥配置教程。

常见问题
-
Docker 容器重启后 IP 变了怎么办? Docker 容器在重启后,其 IP 地址确实可能会发生变化。为了避免这个问题,你可以考虑以下解决方案:
- 宿主机端口映射: 始终通过宿主机 IP 和映射端口连接容器,而不是直接连接容器 IP。只要宿主机 IP 不变,映射端口不变,你的 FinalShell 连接配置就不需要修改。
- Docker Compose 或自定义网络: 在
docker-compose.yml中定义服务时,可以给容器指定固定的 IP 地址或者使用服务名进行容器间通信,但这通常配置较复杂,需要一定的 Docker 网络知识。
-
FinalShell 的终端字体显示不清楚,或者乱码? 这通常是字体配置问题。你可以在 FinalShell 的“工具”->“选项”->“终端”中,调整字体和编码设置:
- 字体: 选择一个等宽字体,比如“Consolas”、“Monaco”或“更纱黑体 (Sarasa Term SC)”等,并适当调大字号,以获得更好的阅读体验。
- 字符集: 大多数情况下,选择
UTF-8编码可以解决中文乱码问题。如果你的服务器端系统是较老的版本,可能需要尝试GBK或GB18030。
延伸阅读
若需进一步查阅,可先看本站以下教程: