无法连接到由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"]