创客出手

目录

快速自制一个Jupyter远程登录环境

背景

我们经常需要远程调试代码,因此需要经常登录到服务器。但是,如果网络不太稳定的时候ssh就经常断掉,另外,如果需要执行一个很长时间才有结果返回的命令,往往是命令还没执行完,然后因为网络不稳定,ssh的会话就结束了。如果我们能使用jupyter来做远程连接,打开网页输入密码就能登录到服务器环境,那是多美好的事情!而且运行一个长时间执行的命令,技术我的电脑关掉,服务器的会话也不会结束,这应该是一个理想的工具!

今天我们就来试试用docker + jupyter制作一个一键远程登录环境。但事先声明,本文只供知识分享用途,请不要把这个方法用到你的生成环境或者用于非法用途,相关技术带来的后果和责任由用户自行承担。

安装前置条件

  1. 先确保你的远程环境 (服务器,jetson nano,树莓派等)已经安装好docker。如果还没有安装,请参考《在树莓派/JetsonNano安装docker》,如果是普通服务器环境,这篇文章的方法同样适用。
  2. 服务的可以通过ssh登录。
  3. 保证你的网络环境畅通,因为需要做apt-update等动作。

制作Dockerfile

Dockerfile 是docker的脚步文档,其中包含用户可以在命令行上安装程序到镜像的所有命令。使用docker build 用户可以创建一个连续执行多个命令行指令的自动构建镜像。

先来构建我们的Dockerfile,就是在任意一个地方,用文本工具创建这样一个Dockerfile文件

FROM jupyter/minimal-notebook

上面这已经意思是引入jupyter/minimal-notebook这个镜像,这个镜像是jupyter团队为我们准备好的最小化安装镜像。但是这个镜像是经过精简的,因此我们后面需用用apt-get更新。

USER root
RUN apt-get update
RUN apt-get install -y openssh-client
RUN apt-get -y clean

上面几行就是先切换到root的用户,然后更新,再安装openssh-client,为了能够自动连接到服务器。

RUN usermod -aG sudo jovyan
RUN chmod +w /etc/sudoers
RUN echo "%sudo  ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
RUN chmod -w /etc/sudoers

接下来几行可选的,就是为jupyter的默认jovyan用户增加到sudo的群组,方便将来需要更新的操作

USER ${NB_UID}

RUN ssh-keygen -q -t rsa -N '' <<< $'\ny' >/dev/null 2>&1
RUN echo "ssh root@172.17.0.1" >> /home/jovyan/.profile

最后这几行就是自动生成ssh的密钥,然后把自动登录的脚本自动加入到登录启动里面。

这里是Dockerfile的文件

在远端服务器构建这个docker镜像

因为我们要在Jetson Nano、树莓派或者远端服务器运行这个docker,因此,最好在服务器构建。方法就是把上面的Dockerfile文件放到服务器某个位置,然后执行以下命令。其中 -t jupyterdirect:0.0.1就是为镜像指定一个名称和版本,我们暂时命名为jupyterdirect,哈。

docker build . -t jupyterdirect:0.0.1

构建成功是这样样子的
构建docker镜像

第一次运行jupyterdirect镜像

运行镜像只需要运行下面一行,其中-p就是把docker的端口映射到外部的端口,-v就是把container里的目录映射到本地一个位置,我这里不做指定,docker会映射到一个内部目录。

docker run -p 46020:8888 -v /home/jovyan jupyterdirect:0.0.1

运行jupyterdirect镜像
我们记录下红框的token作为第一次登录用

浏览器登录服务器

我们在浏览器打开网址:http://<服务器ip>:40020/lab,如果你设置了其他端口,也请相应修改。
输入token后成功登录
登录
成功登录
注意的是,我们输入token然后顺便设置密码是不行的,具体设置密码的方法可以参考这篇文章《Jetson Nano 安装 Jupyter Lab》

点击terminal后,打yes后现在还需要输入密码,最后一步完成一键登录的步骤。

授权我们的docker

我们刚才输入密码登录了服务器以后,执行一下命令,目的是把已经生成的public key保存到服务器授权文件authorized_keys中。为了安全起见,我们并没有把这一步都自动化了,毕竟随便安装一个docker就能自动登录到服务器也太危险了。

docker run -it jupyterdirect:0.0.1 cat /home/jovyan/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

通常我会把docker命令修改成后台运行,就是docker run 加上-d就行,你也可以加上–restart=alway,这样服务器,jetson nano或者树莓派重启后,我们的容器也会随着docker重启。加上–privileged就能访问设备。

docker run -d --restart=always --privileged -p 46020:8888 -v /home/jovyan jupyterdirect:0.0.1

运行完是这样的
后台运行jupyterdirect

你再来试试打开浏览器,点击一下termal,神奇的事情发生了!

更多关于 , 的文章
关注创客出手公众号

关注创客出手