无法连接到 Docker 提供的 Jupyter Notebook
Unable to connect to Jupyter Notebook served by Docker
我一直在学习 Docker,最终目标是使用它来提供和共享 Jupyter 笔记本。下面是一个示例 Dockerfile:
FROM python:2
ENV PYTHONUNBUFFERRED 1
RUN pip install jupyter
RUN useradd --create-home --home-dir /home/docker --shell /bin/bash docker
RUN adduser docker sudo
ADD start.sh /home/docker/start.sh
RUN chmod +x /home/docker/start.sh
RUN chown docker /home/docker/start.sh
ADD prod_sentiment.ipynb /home/docker/prod_sentiment.ipynb
ADD output.txt /home/docker/output.txt
RUN chmod +x /home/docker/output.txt
RUN chown docker /home/docker/output.txt
EXPOSE 8888
RUN usermod -a -G sudo docker
RUN echo "docker ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
USER docker
ENV HOME=/home/docker
ENV SHELL=/bin/bash
ENV USER=docker
RUN printenv
CMD ./home/docker/start.sh
start.sh
文件如下所示:
#! /bin/sh
echo 'starting'
nohup jupyter notebook --no-browser > /home/docker/output.txt
然后我:
docker build --rm -t 'test' .
docker run -d -ti -p 8888:8888 test
从这一点来看,我认为我应该能够导航到 localhost:8888
并查看 Jupyter Notebook。如果我通过以下方式连接到容器:docker exec -i -t container_id /bin/bash
我可以 tail -f /home/docker/output.txt
看到我可以从 Docker 容器中卷曲它。同样,ps auwx | grep 'jupyter'
确认 Jupyter Notebook 网络服务器是 运行。
除了在 Docker 文件中绑定 8888:8888
和 EXPOSING
端口外,我还缺少什么?每当我连接到 http://localhost:8888
时,它都会说“localhost 没有发送任何数据”。
我正在为 Mac 版本 1.12.1-beta26.1 build 1200 使用 Docker。
你的问题是jupyter默认只监听loopback接口。您可以通过 运行 jupyter 使用选项 --ip=0.0.0.0
更改此设置,这将导致它绑定到所有接口(在容器内)。
编辑:还有一些关于此 in the jupyter documentation 的更多信息。加上他们在该文档中提供的示例:
# Add Tini. Tini operates as a process subreaper for jupyter. This prevents
# kernel crashes.
ENV TINI_VERSION v0.6.0
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /usr/bin/tini
RUN chmod +x /usr/bin/tini
ENTRYPOINT ["/usr/bin/tini", "--"]
EXPOSE 8888
CMD ["jupyter", "notebook", "--port=8888", "--no-browser", "--ip=0.0.0.0"]
我一直在学习 Docker,最终目标是使用它来提供和共享 Jupyter 笔记本。下面是一个示例 Dockerfile:
FROM python:2
ENV PYTHONUNBUFFERRED 1
RUN pip install jupyter
RUN useradd --create-home --home-dir /home/docker --shell /bin/bash docker
RUN adduser docker sudo
ADD start.sh /home/docker/start.sh
RUN chmod +x /home/docker/start.sh
RUN chown docker /home/docker/start.sh
ADD prod_sentiment.ipynb /home/docker/prod_sentiment.ipynb
ADD output.txt /home/docker/output.txt
RUN chmod +x /home/docker/output.txt
RUN chown docker /home/docker/output.txt
EXPOSE 8888
RUN usermod -a -G sudo docker
RUN echo "docker ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
USER docker
ENV HOME=/home/docker
ENV SHELL=/bin/bash
ENV USER=docker
RUN printenv
CMD ./home/docker/start.sh
start.sh
文件如下所示:
#! /bin/sh
echo 'starting'
nohup jupyter notebook --no-browser > /home/docker/output.txt
然后我:
docker build --rm -t 'test' .
docker run -d -ti -p 8888:8888 test
从这一点来看,我认为我应该能够导航到 localhost:8888
并查看 Jupyter Notebook。如果我通过以下方式连接到容器:docker exec -i -t container_id /bin/bash
我可以 tail -f /home/docker/output.txt
看到我可以从 Docker 容器中卷曲它。同样,ps auwx | grep 'jupyter'
确认 Jupyter Notebook 网络服务器是 运行。
除了在 Docker 文件中绑定 8888:8888
和 EXPOSING
端口外,我还缺少什么?每当我连接到 http://localhost:8888
时,它都会说“localhost 没有发送任何数据”。
我正在为 Mac 版本 1.12.1-beta26.1 build 1200 使用 Docker。
你的问题是jupyter默认只监听loopback接口。您可以通过 运行 jupyter 使用选项 --ip=0.0.0.0
更改此设置,这将导致它绑定到所有接口(在容器内)。
编辑:还有一些关于此 in the jupyter documentation 的更多信息。加上他们在该文档中提供的示例:
# Add Tini. Tini operates as a process subreaper for jupyter. This prevents
# kernel crashes.
ENV TINI_VERSION v0.6.0
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /usr/bin/tini
RUN chmod +x /usr/bin/tini
ENTRYPOINT ["/usr/bin/tini", "--"]
EXPOSE 8888
CMD ["jupyter", "notebook", "--port=8888", "--no-browser", "--ip=0.0.0.0"]