访问在 Docker 容器上运行的 Jupyter notebook

Posted

技术标签:

【中文标题】访问在 Docker 容器上运行的 Jupyter notebook【英文标题】:Access Jupyter notebook running on Docker container 【发布时间】:2016-12-14 07:28:39 【问题描述】:

我使用 python 库和 Jupyter 创建了一个 docker 映像。 我使用选项-p 8888:8888 启动容器,以链接主机和容器之间的端口。 当我在容器内启动 Jupyter 内核时,它在 localhost:8888 上运行(并且没有找到浏览器)。我使用了命令jupyter notebook

但是对于我的主机,我必须使用什么 IP 地址才能在主机浏览器中使用 Jupyter?

使用命令ifconfig,我找到eth0dockerwlan0lo...

谢谢!

【问题讨论】:

启动docker容器我使用nvidia-docker 你检查过,如果有东西在 localhost:8888 上监听吗?例如使用 netcat? 我在浏览器中尝试了 localhost:8888,但没有使用 netcat 那么您需要调试情况。首先,查看您的容器是否实际运行(不带 -d 启动、附加或直接运行 docker ps)。其次,您需要检查您的端口是否实际传递到您的主机。 您好,很抱歉,我请假了 5 天。此解决方案有效:进入容器:jupyter notebook --ip 0.0.0.0 --no-browser 进入浏览器(ost):localhost:8888/tree 【参考方案1】:

您需要在0.0.0.0:jupyter notebook -i 0.0.0.0 上运行您的笔记本。在 localhost 上运行使其只能在容器内部使用。

【讨论】:

Docker:docker run -it -p 8888:8888 image:version 容器:jupyter notebook --ip 0.0.0.0 --no-browser 主机:localhost:8888/tree‌​ @j-guillaumin 非常感谢!它只是通过使用命令 jupyter notebook --ip 0.0.0.0 --no-browser 而不是 jupyter notebook 来工作。 现在你必须添加这个标志:--allow-root!它来自 Jupyter 的一个安全问题。或者您可以自定义配置文件以允许root(~/.jupyter.中的*.py) --port XXXXjupyter 一起使用,以防您使用docker run 发布与jupyter 默认8888 不同的端口。您还可能需要在jupyter 调用中包含--allow-root 如果你的jupter镜像没有带参数启动的选项,只需要使用主机联网进行开发; docker run --gpus all -it --network host tensorflow/tensorflow:latest-gpu-jupyter【参考方案2】:

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

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

主机访问此网址:localhost:8888/tree‌​

当您第一次登录时,终端上会显示一个使用令牌登录的链接。

【讨论】:

如果主机的8888端口被占用,我们可以使用其他端口,例如8899。主机:docker run -it -p 8899:8888 image:version主机访问这个url:localhost:8899/tree‌​ Jupyter 实验室也是这样工作的:jupyter lab --ip 0.0.0.0 --no-browser --allow-root【参考方案3】:

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 上的桌面浏览器访问笔记本 笔记本会提示您输入创建笔记本时生成的令牌。

【讨论】:

是使用绑定挂载还是卷?或者没有与主机共享存储 @LukAron 除非为 docker run 命令指定了-v 选项,否则不会与主机共享存储。要映射卷以进行共享,可以使用 -v /path/to/host/source:/container/path/to/src 之类的东西。但要小心,这将隐藏容器在/container/path/to/src 处可能拥有的任何内容。 很遗憾,downvoter 没有给出原因;这几乎是我现在成功使用的命令。唯一的区别是我指定了 jupyter 的完整路径,并且可以使用环境变量选择不同的端口。 嗯不适合我。希望我知道要检查什么。【参考方案4】:

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

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

如果您想稍后再次获取该链接,可以输入docker exec -it <docker_container_name> jupyter notebook list

【讨论】:

jupyter notebook list 由于this 问题而无法工作:( 哦!对于 IP,您可以使用命令 hostname -I 获取远程服务器的 IP(如果您使用的是远程主机)。然后将 URL 中的“localhost”替换为 IP。 如果您在初始的docker run 命令中指定-it,并且您是从PyCharm Professional 中运行的,您只需单击Attached Console 窗口中的链接。如果你只是从 shell 运行它,你的 shell 可能会也可能不会让你点击链接。【参考方案5】:

以下是我如何使用 docker 工具箱在 Windows 7 上运行它。

如果您使用的是 docker 工具箱,请打开 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 installation website 运行 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 上运行,它会起作用吗? @jeffrycopps 是的,您只需要正确指定端口-p <host port>:<container port>。例如,如果您想在5000 的容器上运行它,但在8888 托管,请使用-p 8888:5000,并确保--expose 5000。此外,根据您的具体配置,您可能需要指定-p 127.0.0.1:8888:5000 才能从主机访问它。 (我知道你问这个问题已经一年多了,但我想我会帮助任何可能有同样问题的人。)【参考方案6】:

您可以使用命令jupyter notebook --allow-root --ip[of your container] 或使用选项--ip0.0.0.0 授予对所有IP 的访问权限。

【讨论】:

【参考方案7】:

除了构建自己的 Docker 映像之外,您还可以使用 ML Workspace 映像。 ML Workspace 是一个开源 Web IDE,它将 Jupyter、VS Code、桌面 GUI 和许多其他工具和库组合到一个方便的 Docker 映像中。部署单个工作区实例非常简单:

docker run -p 8080:8080 mltooling/ml-workspace:latest

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

【讨论】:

【参考方案8】:

在容器中,您可以运行以下命令以使其在本地机器上可用(使用您的 docker 机器的 IP 地址)。

jupyter notebook --ip 0.0.0.0 --allow-root

根据容器的设置,您可能不需要提供 --allow-root 标志。

【讨论】:

【参考方案9】:

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 添加到命令中,现在它正在运行

【讨论】:

以上是关于访问在 Docker 容器上运行的 Jupyter notebook的主要内容,如果未能解决你的问题,请参考以下文章

如何在从 docker 容器运行的 jupyter 笔记本中获取黑色代码格式?

在 Docker 容器中将 Spyder 连接到远程 Jupyter Notebook

如何使用官方Tensorflow docker容器在主机目录中保存和编辑Jupyter笔记本?

Docker使环境变量不可写

连接到远程服务器上的 docker 中运行的 jupyter notebook

Docker 上的 Jupyter 笔记本 - 权限被拒绝