在Docker容器中访问运行的Jupyter笔记本

130
我使用Python库和Jupyter创建了一个Docker映像。我使用-p 8888:8888选项启动容器,以便在主机和容器之间链接端口。当我在容器内部启动一个Jupyter内核时,它运行在localhost:8888上(并且找不到浏览器)。我使用了jupyter notebook命令。
但是从我的主机,我需要使用什么IP地址才能在主机的浏览器中使用Jupyter?
通过运行ifconfig命令,我找到了eth0dockerwlan0lo等。
谢谢!

使用 nvidia-docker 启动 Docker 容器。 - J.Guillaumin
你检查过本地主机的8888端口是否有程序在监听吗?比如使用netcat命令? - sge
我尝试在浏览器中使用localhost:8888,但没有使用netcat。 - J.Guillaumin
1
你需要调试一下这个情况。首先,查看一下你的容器是否正在运行(不要使用-d参数启动,附加或者直接运行docker ps)。其次,你需要检查一下端口是否真正地传递到了主机上。 - sge
5
你好。 抱歉,我休假了五天。这个解决方案有效:在容器中输入:jupyter notebook --ip 0.0.0.0 --no-browser 在浏览器(ost)中输入:localhost:8888/tree - J.Guillaumin
11个回答

103

您需要在 0.0.0.0 上运行您的笔记本: jupyter notebook -i 0.0.0.0。如果只在本地主机上运行,则仅能在容器内部访问。


87
Docker: docker run -it -p 8888:8888 image:version 容器: jupyter notebook --ip 0.0.0.0 --no-browser 主机: localhost:8888/tree - J.Guillaumin
19
现在你需要添加这个标志: --allow-root!这是为了解决Jupyter的一个安全问题。或者你可以自定义配置文件来允许root(*.py在~/.jupyter.中)。 - J.Guillaumin
1
在使用 docker run 命令时,如果你发布的端口与 jupyter 默认的 8888 端口不同,需要在 jupyter 命令中使用 --port XXXX 参数。此外,你可能还需要在 jupyter 命令中加入 --allow-root 参数。 - kilgoretrout
1
如果你的Jupyter镜像没有启动参数的选项,只需在开发时使用主机网络;docker run --gpus all -it --network host tensorflow/tensorflow:latest-gpu-jupyter - Alex Punnen
可以在主机端一次性运行:docker run -it -p 8888:8888 image:version jupyter notebook --ip 0.0.0.0 --no-browser --allow-root - Kevin
显示剩余2条评论

92

主机: docker run -it -p 8888:8888 image:version

容器内部: jupyter notebook --ip 0.0.0.0 --no-browser --allow-root

主机访问该URL: localhost:8888/tree‌​

首次登录时,终端会显示一个链接以使用令牌登录。


6
如果主机的端口8888已被占用,我们可以使用其他端口,例如8899。主机命令:docker run -it -p 8899:8888 image:version主机访问网址:localhost:8899/tree - user978112
Jupyter Lab 也可以像这样工作:jupyter lab --ip 0.0.0.0 --no-browser --allow-root - Cyryl1972

48

docker run 命令是必需的,以便为容器打开一个端口,允许主机浏览器连接,使用 -p 为 docker 容器分配端口,并从 docker images 中选择您的 jupyter 镜像。

docker run -it -p 8888:8888 image:version

在容器中启动笔记本,并将打开的端口指定给它:

jupyter notebook --ip 0.0.0.0 --port 8888 --no-browser --allow-root

您可以通过桌面浏览器访问笔记本:http://localhost:8888 笔记本会提示您输入在创建时生成的令牌。


它是使用绑定挂载还是卷?或者根本没有与主机共享存储。 - Luk Aron
@LukAron 除非在docker run命令中指定了“-v”选项,否则不会与主机共享存储。要映射卷以进行共享,可以使用类似于“-v /path/to/host/source:/container/path/to/src”的内容。但是要小心,这将隐藏容器可能存在的任何位于“/container/path/to/src”的内容。 - hlongmore
很遗憾,那个踩贴者没有给出原因;这几乎是我现在成功使用的命令。唯一的区别是我指定了jupyter的完整路径,并且我使其可以使用环境变量选择不同的端口。 - hlongmore
1
嗯,对我来说不起作用。希望我知道要检查什么。 - Evan Zamir

13

获取 Jupyter 笔记本服务器的链接:

在执行 docker run 命令后,会自动生成一个超链接。它看起来像这样:http://localhost:8888/?token=f3a8354eb82c92f5a12399fe1835bf8f31275f917928c8d2 :: /home/jovyan/work

如果您想在以后再次获得链接,可以键入 docker exec -it <docker_container_name> jupyter notebook list


由于此问题jupyter notebook list无法正常工作 :( - Ciprian Tomoiagă
哦!对于IP,您可以使用命令“hostname -I”获取远程服务器的IP(如果您正在使用远程主机)。然后将URL中的“localhost”替换为IP。 - Josephine M. Ho
如果您在初始的 docker run 命令中指定了 -it,并且您是从 PyCharm Professional 中运行的,则可以直接单击 Attached Console 窗口中的链接。如果您只是从 shell 中运行它,则您的 shell 可能会或可能不会让您单击该链接。 - hlongmore

5
以下是我在Windows 7上使用Docker Toolbox运行它的方法。
如果您正在使用Docker Toolbox,请打开Docker快速启动终端,并注意此处的IP地址:
docker is configured to use the default machine with IP 192.168.99.100
For help getting started, check out the docs at https://docs.docker.com

一旦你从TensorFlow安装网站运行docker命令:

docker pull tensorflow/tensorflow                  # Download latest image
docker run -it -p 8888:8888 tensorflow/tensorflow  # Start a Jupyter notebook server

您将会收到这样的一条消息:
Copy/paste this URL into your browser when you connect for the first time,
to login with a token:
    http://127.0.0.1:8888/?token=d6e80acaf08e09853dc72f6b0f022b8225f94f

在主机上,将127.0.0.1替换为192.168.99.100并使用该URL的其余部分。


如果我想让Jupyter在端口5000上运行,它能正常工作吗? - jeffry copps
@jeffrycopps 是的,你只需要正确指定端口 -p <主机端口>:<容器端口>。例如,如果你想在容器上运行 5000 端口,但是在主机上使用 8888 端口,则使用 -p 8888:5000,并确保 --expose 5000。此外,根据你的具体配置,你可能需要指定 -p 127.0.0.1:8888:5000 来从主机访问它。(我知道你已经问了一年多了,但我想帮助任何有同样问题的人。) - hlongmore

2
您可以使用命令jupyter notebook --allow-root --ip[您的容器的IP地址]或使用选项--ip0.0.0.0来允许所有IP访问。

2
作为构建自己的Docker镜像的替代方案,您也可以使用ML Workspace镜像。ML Workspace是一个开源的Web IDE,它将Jupyter、VS Code、桌面GUI和许多其他工具和库组合成一个方便的Docker镜像。部署单个工作空间实例就像这样简单:
docker run -p 8080:8080 mltooling/ml-workspace:latest

所有工具都可以从同一个端口访问,并集成到Jupyter UI中。您可以在这里找到更多文档。


1
在容器中,您可以运行以下命令使其在本地机器上可用(使用您的Docker机器的IP地址)。
jupyter notebook --ip 0.0.0.0 --allow-root
根据容器的设置,您可能不需要提供--allow-root标志。

1
docker run -i -t -p 8888:8888 continuumio/anaconda3 /bin/bash -c "/opt/conda/bin/conda install jupyter -y --quiet && mkdir /opt/notebooks && /opt/conda/bin/jupyter notebook --notebook-dir=/opt/notebooks --ip='*' --port=8888 --no-browser --allow-root"

我不得不在命令中添加 --allow-root,现在它正在运行。


0

进入Docker并检查cat /etc/jupyter/jupyter_notebook_config.py

  • 您应该看到/添加此行:

c.NotebookApp.allow_origin = 'https://colab.research.google.com'


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接