docker容器中配置Jupyter notebook和Vscode
概述
该配置的目的:
- remote server上开一个容器——容器内运行jupyter lab server—— 笔记本浏览器远程连接jupyter lab
- remote server上开一个容器——容器内运行Vscode server——笔记本Vscode通过remote ssh连接容器内的Vscode
一、Jupyter lab的配置
- 在remote server上运行之前配置好的stable-baselines3的镜像
# -v 是指把remote server上的/home/rl_dev挂载到容器内的~/rl_dev,来保存容器中的修改
# -p 将remote server上的端口8888 与 容器内的端口8888相连 (--network host意味着host上的所有端口直接跟容器内的相连,也可以)
# -u 以容器内用户名为pamirl方式进入
# -itd 交互后台模式
nvidia-docker run -itd -p 8888:8888 -u pamirl -v /home/user/rl_dev:/home/pamirl/rl_dev --name dev_rl stable_rl:py38_mujoco210_baselines3 bash
- 安装jupyter lab
# 默认在用户目录下~/,名为deep_rl的conda环境下
conda activate deep_rl
conda install jupyterlab
conda install ipykernel
# 把当前conda虚拟环境deep_rl 显示为 jupyterlab中的kernel名为deep_rl:stable-baselines
# 方便我们在jupyter lab切换环境
python -m ipykernel install --user --name deep_rl --display-name deep_rl:stable-baselines3
- 生成jupyter lab server的配置文件
jupyter lab password # 假设输入密码123456,会在~/.jupyter目录下生成一个jupyter_server_config.json文件
jupyter lab --generate-config # 生成jupyter_lab_config.py
- 进入jupyter_lab_config.py进行配置
# password里为jupyter_server_config.json的内容
# 记得去掉注释符号 ‘#’
c.ServerApp.password = "sha1:asdnvjkj1283das79sad75sd19hgasdhasd"
c.ServerApp.ip = '*'
c.ServerApp.allow_remote_access = True
- 在用户目录下运行
jupyter lab
,在自己的labtop上输入remote_server_ip:8888
,输入密码123456,就能远程访问容器中的jupyter lab,容器内在~/rl_dev内的改动均会被保存在remote server上的/home/user/rl_dev内(所以下图中的test.ipynb就不会保存在remote server上)
- 如果最新容器内的配置想保留,需要docker commit一下生成一个新镜像(花不了多少空间,也可以进一步修改最原始的Dockerfile,将配置相关命令加进入,看个人需要)
- 运行jupyer lab推荐用tmux!
二、Vscode 的配置
- 多开一个端口给Vscode,重新运行镜像:
# remote server上的8889端口,与容器内的ssh服务默认使用的22端口相连
# 运行的镜像名称是stable_rl:jupyterlab (之前文章配好了stable-baselines3 jupyter lab的镜像)
nvidia-docker run -itd -p 8888:8888 -p 8889:22 -u pamirl -v /home/rl_docker/rl_dev:/home/pamirl/rl_dev --name dev_rl stable_rl:jupyterlab bash
- 容器内检查ssh服务开启状态:
ps -e | grep ssh
- 容器内修改ssh服务的配置:
sudo vim /etc/ssh/sshd_config
(比如端口改成23,这里用默认的22端口) - 容器内开启ssh服务
sudo service ssh start
:之前配置镜像时,给用户pamirl加了sudo权限
在Mac上的Vscode,安装插件Remote SSH,如下登陆即可:
总结:容器内ssh服务端口更改——开启ssh服务——本地Vscode通过Remote SSH连上去!
既然能ssh上去,那么免密登陆配置就很简单了。