2016-09-27 132 views
3

我一直在学习Docker,其最终目标是使用它来提供和共享Jupyter笔记本。下面是一个例子Dockerfile:无法连接到由Docker服务的Jupyter Notebook

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容器中卷曲它。同样ps auwx | grep 'jupyter'确认Jupyter Notebook网络服务器正在运行。

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

我使用泊坞窗的Mac版本1.12.1-beta26.1构建1200

回答

6

你的问题是,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"] 
+0

哦,我的天啊。哈!谢谢!!!! –