Jupyter Notebook Docker 部署完整教程
这个教程基于你的服务器环境(阿里云 VM,root 用户,Docker 已安装),使用你现有的 jupyter/scipy-notebook 镜像。从部署、配置、使用到备份,一步步详细说明。整个过程假设你是通过 SSH 连接服务器操作。如果你是初学者,建议一步步复制命令执行。
前提条件
- Docker 已安装并运行(从你的
docker images输出看,已有)。 - 服务器有公网 IP(从登录日志看,如 120.228.142.193),并确保防火墙/安全组允许 8888 端口(阿里云控制台 > 安全组 > 添加入站规则:TCP 8888,来源 0.0.0.0/0)。
- 如果端口未开,运行:
(如果用 ufw:firewall-cmd --add-port=8888/tcp --permanent firewall-cmd --reloadufw allow 8888)。
步骤 1: 部署 Jupyter 容器
使用 Docker 运行容器,支持数据持久化和权限修复。默认镜像使用 jupyter/scipy-notebook(你的列表中有)。
-
创建数据目录并修复权限:
- Jupyter 容器用户是
jovyan(UID=1000),主机目录需匹配权限。
mkdir -p /root/jupyter_data chown -R 1000:1000 /root/jupyter_data - Jupyter 容器用户是
-
运行容器(后台模式,带挂载和工作目录):
docker run -d -p 8888:8888 --name jupyter-notebook -v /root/jupyter_data:/home/jovyan/work -w /home/jovyan/work jupyter/scipy-notebook- 解释:
-d:后台运行。-p 8888:8888:端口映射。--name jupyter-notebook:容器名。-v /root/jupyter_data:/home/jovyan/work:挂载主机目录到容器/home/jovyan/work,数据持久化。-w /home/jovyan/work:设置默认工作目录,避免文件保存到非持久化根目录。
- 如果想以 root 运行(简化权限,但不推荐):
加--user root:docker run -d -p 8888:8888 --name jupyter-notebook -v /root/jupyter_data:/home/jovyan/work --user root jupyter/scipy-notebook
- 解释:
-
检查容器状态:
docker ps- 看到
jupyter-notebook在 running 状态即可。
- 看到
-
获取访问令牌(token):
docker logs jupyter-notebook- 日志中找类似
http://127.0.0.1:8888/lab?token=xxxxxxxxxxxxxxx的行,复制 token(如4ed3ea6fe25563f9b61c83550319241dcf01264f27e6f856)。
- 日志中找类似
步骤 2: 访问 Jupyter Lab
Jupyter 默认启动 Lab 接口(现代版 Notebook)。
-
从远程浏览器访问(推荐,非服务器本地):
- 直接公网访问:
- 浏览器打开:
http://你的服务器公网IP:8888/lab?token=你的token - 获取公网 IP:
curl ifconfig.me
- 浏览器打开:
- SSH 端口转发(更安全,无需暴露公网端口):
- 在本地终端运行:
ssh -L 8888:localhost:8888 root@你的服务器IP - 然后本地浏览器打开:
http://localhost:8888/lab?token=你的token
- 在本地终端运行:
- 直接公网访问:
-
登录后界面:
- 你会看到文件浏览器,默认在 “work” 目录(挂载的持久化目录)。
- 如果看到权限错误(如 “Permission denied”),参考步骤1的权限修复,重启容器。
-
自定义配置(可选):
- 无 token 登录:启动时加
--NotebookApp.token=''(不安全,仅本地用)。 - 设置密码:启动时加
--NotebookApp.password='sha1:你的哈希'(先用 Python 生成哈希:from notebook.auth import passwd; passwd('你的密码'))。 - 示例命令:
docker run -d -p 8888:8888 --name jupyter-notebook -v /root/jupyter_data:/home/jovyan/work -w /home/jovyan/work --NotebookApp.token='' jupyter/scipy-notebook
- 无 token 登录:启动时加
步骤 3: 基本使用 Jupyter
-
创建和编辑 Notebook:
- 在文件浏览器,点击 “New” > “Notebook” > 选择内核(如 Python 3)。
- 在单元格写代码(如
print("Hello World")),按 Shift+Enter 执行。 - 保存:Ctrl+S,或自动保存。文件会保存在
/root/jupyter_data(主机查看ls /root/jupyter_data)。
-
上传/下载文件:
- 上传:文件浏览器 > “Upload” 按钮,选择文件上传到 “work” 目录。
- 下载:右键文件 > “Download”。
-
安装包(容器内):
- 进入容器:
docker exec -it jupyter-notebook bash - 安装:
pip install 包名(如pip install numpy),但镜像已有 scipy 等。 - 退出:
exit
- 进入容器:
-
内核管理:
- 支持 Python、R 等(取决于镜像)。重启内核:Kernel > Restart。
-
常见操作:
- Markdown 单元格:写文档,按 Shift+Enter 渲染。
- 命令模式:Esc 进入,添加/删除单元格 (a/b/dd)。
- 扩展:镜像已有 scipy,支持数据分析、绘图等。
-
停止/重启容器:
- 停止:
docker stop jupyter-notebook - 重启:
docker start jupyter-notebook(token 可能变,查日志)。 - 删除:
docker rm jupyter-notebook(数据在主机安全)。
- 停止:
步骤 4: トラブルシューティング(常见问题)
- 权限 denied:如步骤1,
chown -R 1000:1000 /root/jupyter_data。 - 无数据在主机:确保文件保存到 “work” 目录。根目录文件不持久化。
- 端口冲突:改端口,如
-p 8889:8888,访问用 8889。 - 日志查看:
docker logs -f jupyter-notebook(实时)。 - 镜像更新:拉新版
docker pull jupyter/scipy-notebook。 - 资源不足:加内存/CPU 参数,如
--memory=4g --cpus=2。
步骤 5: 备份数据
数据在 /root/jupyter_data,定期备份以防丢失。
-
手动备份:
docker stop jupyter-notebook tar -czf /root/jupyter_backup_$(date +%Y%m%d).tar.gz /root/jupyter_data docker start jupyter-notebook- 下载备份:从本地
scp root@服务器IP:/root/jupyter_backup_*.tar.gz .
- 下载备份:从本地
-
自动化备份:
- 创建脚本
/root/backup_jupyter.sh:#!/bin/bash docker stop jupyter-notebook tar -czf /root/jupyter_backup_$(date +%Y%m%d).tar.gz /root/jupyter_data docker start jupyter-notebook - 权限:
chmod +x /root/backup_jupyter.sh - 定时:
crontab -e,加0 2 * * * /root/backup_jupyter.sh(每天2点)。
- 创建脚本
-
恢复:
docker stop jupyter-notebook rm -rf /root/jupyter_data/* # 清空旧数据 tar -xzf /root/jupyter_backup_*.tar.gz -C /root/ chown -R 1000:1000 /root/jupyter_data docker start jupyter-notebook
高级扩展(可选)
- 多用户:用 JupyterHub 镜像代替。
- GPU 支持:用
jupyter/tensorflow-notebook等镜像,如果服务器有 GPU。 - 自定义镜像:创建 Dockerfile 基于现有,添加包。
- 集成 VS Code:用 code-server,或 Jupyter 的 VS Code 扩展。
这个教程覆盖从零到备份的全流程。如果遇到具体错误,贴日志或截图,我再帮调试!