无法连接到由Docker服务的Jupyter Notebook

我一直在学习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笔记本。 如果我通过连接到容器: docker exec -i -t container_id /bin/bash我可以tail -f /home/docker/output.txt看到,我可以在Docker容器内curl它。 同样ps auwx | grep 'jupyter' ps auwx | grep 'jupyter'确认Jupyter Notebooknetworking服务器正在运行。

除了绑定端口8888:8888并在EXPOSING它,我错过了什么? 每当我连接到http://localhost:8888它说'本地主机没有发送任何数据'。

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

你的问题是,jupyter默认只在loopback接口上监听。 您可以通过运行jupyter选项–ip --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"]