You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过SSH连接Spyder的远程Docker内核?

问题描述

我编写了如下Dockerfile:

FROM ubuntu:latest

RUN apt update && apt install  openssh-server sudo -y

run apt-get update
run apt-get install python3
run apt-get -y install python3-pip
run pip install spyder-kernels

RUN echo "root:password" | chpasswd

RUN service ssh start

EXPOSE 22

CMD ["/usr/sbin/sshd","-D"]

执行操作步骤:

  1. 执行docker build -t spyder构建镜像
  2. 执行docker run -d -p 2000:22 --name spyder_container spyder运行容器
  3. 执行docker exec -it spyder_container /bin/bash进入容器,输入python3 -m spyder_kernels.console启动内核
  4. 在新PowerShell窗口执行:
docker cp spyder_container:/root/.local/share/jupyter/runtime/kernel-16.json Desktop

该文件内容如下:

{
  "shell_port": 35431,
  "iopub_port": 40443,
  "stdin_port": 35379,
  "control_port": 39321,
  "hb_port": 38567,
  "ip": "127.0.0.1",
  "key": "29a176a0-15b65a765ce1568ad69ebbbe",
  "transport": "tcp",
  "signature_scheme": "hmac-sha256",
  "kernel_name": ""
}

最后在Spyder配置窗口填写信息(密码为“password”),但无法建立连接。

补充信息:我用docker inspect -f "{{ .NetworkSettings.IPAddress }}" spyder_container获取容器IP后,尝试ssh root@172.17.0.6登录,提示ssh: connect to host 172.17.0.6 port 22: Connection timed out。之后我在Dockerfile中添加了以下内容,但问题依旧:

RUN sed -i '/^#/!s/PermitRootLogin .*/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sudo service ssh restart

问题排查与修正

1. SSH服务配置与启动问题

  • Docker镜像构建阶段执行的RUN service ssh start无效,容器启动时不会保留该进程,最终还是靠CMD启动sshd。但需要确保sshd配置正确:
    • 必须开启PasswordAuthentication yes(默认可能为关闭状态),否则密码登录会失败;同时确认PermitRootLogin yes配置生效。修正后的配置命令:
      RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
      RUN sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config
      
    • 构建阶段不需要执行service ssh restart,容器启动时会重新初始化sshd服务;另外必须添加RUN ssh-keygen -A生成sshd依赖的密钥文件,否则sshd启动会失败。

2. 内核绑定地址问题

  • 内核默认绑定127.0.0.1,仅允许容器内部访问,宿主机的Spyder无法连接。启动内核时需指定绑定到容器所有网卡:
    python3 -m spyder_kernels.console --ip=0.0.0.0
    
  • 复制内核配置文件后,需将文件中的ip字段改为宿主机的localhost或容器IP。

3. 端口访问问题

  • 内核运行的多个端口(如35431、40443等)未映射到宿主机,导致Spyder无法访问。推荐两种解决方式:
    • 方式一:使用host网络启动容器,直接共享宿主机网络空间,无需额外端口映射:
      docker run -d --network=host --name spyder_container spyder
      
    • 方式二:提前映射所有可能用到的内核端口(灵活性差,不推荐)。

4. SSH登录失败修正

  • 你映射了宿主机2000端口到容器22端口,正确的SSH登录命令应为:
    ssh root@localhost -p 2000
    
  • 若直接访问容器IP的22端口失败,大概率是宿主机防火墙拦截或Docker网络配置限制,优先使用映射端口登录。

修正后的完整Dockerfile示例

FROM ubuntu:latest

# 一次性安装所有依赖,减少镜像层数
RUN apt update && apt install openssh-server sudo python3 python3-pip -y

# 安装spyder-kernels
RUN pip install spyder-kernels

# 设置root密码
RUN echo "root:password" | chpasswd

# 配置sshd允许root密码登录
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config

# 生成sshd必需的密钥文件
RUN ssh-keygen -A

EXPOSE 22

# 启动sshd服务
CMD ["/usr/sbin/sshd", "-D"]

正确操作流程

  1. 使用修正后的Dockerfile构建镜像:docker build -t spyder .
  2. 启动容器(推荐host网络):docker run -d --network=host --name spyder_container spyder
  3. 进入容器:docker exec -it spyder_container /bin/bash
  4. 启动内核并绑定所有网卡:python3 -m spyder_kernels.console --ip=0.0.0.0
  5. 复制内核配置文件到宿主机:docker cp spyder_container:/root/.local/share/jupyter/runtime/kernel-*.json Desktop
  6. 打开配置文件,将ip字段改为localhost
  7. 在Spyder中添加远程内核,填写对应端口、密钥等信息,测试连接

内容的提问来源于stack exchange,提问作者Berker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 03:55:21