必须加--ip=0.0.0.0和--allow-root,因jupyter默认仅监听localhost且容器以root运行;还需--port=8888、--no-browser,并通过jupyter_token或密码哈希强化认证,避免明文密码与权限错配。

直接运行就行,但必须加 --ip=0.0.0.0 和 --allow-root,否则容器里根本连不上。
docker run 启动时必加的参数
默认情况下,Jupyter 只监听 localhost,而容器内没有“本地”概念;同时多数基础镜像以 root 用户启动,不加 --allow-root 会直接报错退出。
-
--ip=0.0.0.0:绑定所有网络接口,让宿主机和外部能访问 -
--port=8888:显式指定端口(和-p映射保持一致) -
--allow-root:允许 root 用户运行(Docker 容器默认就是 root) -
--no-browser:禁用自动打开浏览器(容器里没浏览器)
完整命令示例:
docker run -p 8888:8888 \ -v "$PWD/notebooks":/home/jovyan/work \ jupyter/base-notebook \ jupyter notebook --ip=0.0.0.0 --port=8888 --allow-root --no-browser
token 和 password 怎么设才安全
默认 token 是随机生成、只在日志里打印一次,容易丢失或被截获。生产环境别依赖它。
- 用环境变量传 token:
-e JUPYTER_TOKEN=$(openssl rand -hex 16),每次启动都换 - 更稳妥的是密码哈希:先在本地 Python 中运行
from notebook.auth import passwd; passwd("mypass"),得到sha1:xxx:yyy,再写进配置或用-e JUPYTER_PASSWORD='sha1:xxx:yyy' - 注意:
--NotebookApp.password优先级高于 token,设了就自动禁用 token 登录 - 别在命令行里明文写密码,比如
--NotebookApp.password='mypass'—— 进程列表里直接可见
挂载目录权限经常出问题
Jupyter 镜像默认用户是 jovyan(UID 1000),但宿主机当前用户 UID 很可能不是 1000,导致挂载目录里新建文件属主错乱、甚至无写入权限。
- 查宿主机当前 UID:
id -u - 启动时指定用户:
--user $(id -u):$(id -g),让容器内进程以宿主机同 UID 运行 - 或者改镜像启动用户(Dockerfile 里加
USER jovyan并确保目录可写) - 临时解决:
chown -R 1000:1000 notebooks/,但不推荐长期用
Docker Compose 启动要注意 config 文件路径
很多人把 jupyter_notebook_config.py 放错位置,结果配置不生效。Jupyter 在容器里读的是 /home/jovyan/.jupyter/ 下的文件,不是根目录或 /etc/。
- 正确挂载方式:
-v ./jupyter-config:/home/jovyan/.jupyter - 生成配置模板:先跑一次临时容器
docker run --rm -v $(pwd)/jupyter-config:/home/jovyan/.jupyter jupyter/base-notebook jupyter notebook --generate-config - 配置里关键项必须显式写死:
c.NotebookApp.ip = '0.0.0.0'、c.NotebookApp.allow_origin = '*'(若需跨域)、c.NotebookApp.open_browser = False
最常被忽略的是:c.NotebookApp.token 设为空字符串('')后,必须同时设 c.NotebookApp.password,否则服务启动失败 —— 这个组合逻辑不写文档里,只在源码里硬编码校验。











