如何通过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"]
执行操作步骤:
- 执行
docker build -t spyder构建镜像 - 执行
docker run -d -p 2000:22 --name spyder_container spyder运行容器 - 执行
docker exec -it spyder_container /bin/bash进入容器,输入python3 -m spyder_kernels.console启动内核 - 在新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 - 方式二:提前映射所有可能用到的内核端口(灵活性差,不推荐)。
- 方式一:使用host网络启动容器,直接共享宿主机网络空间,无需额外端口映射:
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"]
正确操作流程
- 使用修正后的Dockerfile构建镜像:
docker build -t spyder . - 启动容器(推荐host网络):
docker run -d --network=host --name spyder_container spyder - 进入容器:
docker exec -it spyder_container /bin/bash - 启动内核并绑定所有网卡:
python3 -m spyder_kernels.console --ip=0.0.0.0 - 复制内核配置文件到宿主机:
docker cp spyder_container:/root/.local/share/jupyter/runtime/kernel-*.json Desktop - 打开配置文件,将
ip字段改为localhost - 在Spyder中添加远程内核,填写对应端口、密钥等信息,测试连接
内容的提问来源于stack exchange,提问作者Berker
相关产品推荐
相关产品推荐

