无法连接到Docker提供的Jupyter Notebook

Lor*_*ole 4 bash docker jupyter-notebook docker-for-mac

我一直在学习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
Run Code Online (Sandbox Code Playgroud)

start.sh文件看起来像这样:

#! /bin/sh
echo 'starting'
nohup jupyter notebook --no-browser > /home/docker/output.txt
Run Code Online (Sandbox Code Playgroud)

然后我:

docker build --rm -t 'test' .
docker run -d -ti -p 8888:8888 test
Run Code Online (Sandbox Code Playgroud)

从这一点来说,我认为我应该能够导航localhost:8888并查看Jupyter笔记本.如果我通过以下方式连接到容器:docker exec -i -t container_id /bin/bash我可以tail -f /home/docker/output.txt看到我可以从Docker容器中卷曲它.同样ps auwx | grep 'jupyter'确认Jupyter Notebook网络服务器正在运行.

除了端口绑定端口8888:8888以及EXPOSING它在Dockerfile中,我还缺少什么?每当我连接到http://localhost:8888它时,'localhost都没有发送任何数据'.

我正在使用Docker for Mac版本1.12.1-beta26.1 build 1200.

joe*_*lnb 6

你的问题是jupyter默认只监听loopback接口.您可以通过运行jupyter来更改此选项--ip=0.0.0.0,该选项将导致它在所有接口(容器内)上绑定.

编辑:在jupyter文档中还有一些关于此的更多信息.再加上他们在该文档中提供的示例:

# 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"]
Run Code Online (Sandbox Code Playgroud)