运行环境:在VMware中运行一台OS为centos8的宿主机,在上面运行docker
目标:把fastai的镜像起起来,并且能够看到jupyter界面
分解:
看看人家的dockerfile写的啥
docker history spellrun/fastai --no-trunc=true
运行docker容器
问题:docker run完就挂了,没有持续运行
解决:没有使用交互式运行,应使用 docker run -t -i spellrun/fastai /bin/bash
为了映射端口试了下这样
docker run -it --rm -p 8888:8888 --entrypoint=bash spellrun/fastai
#额外 设置--rm选项,这样在容器退出时就能够自动清理容器内部的文件系统
问题:jupyter启动失败
解决:
使用这个命令行,启动好像成功了
jupyter-notebook --no-browser --ip 0.0.0.0 --port=8888 --allow-root
映射jupyter端口出来
可以在虚拟机里面用127.0.0.1和宿主机ip地址192.168.132.128访问到了,但在远程还是访问不到。怀疑是宿主机配置有问题。
lsof 没看到有开888端口也是很诡异
在宿主机使用curl看到结果如下:
[root@localhost ~]# curlhttp://192.168.132.128:8888/
curl: (7) Failed to connect to 192.168.132.128 port 8888: Connection refused
[root@localhost ~]# curlhttp://127.0.0.1:8888/
curl: (56) Recv failure: Connection reset by peer
也许是ipv6问题,不太确定
在宿主机上执行:
[root@localhost ~]# netstat -nltp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1629/dnsmasq
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1174/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 5908/cupsd
tcp6 0 0 :::111 :::* LISTEN 1/systemd
tcp6 0 0 :::22 :::* LISTEN 1174/sshd
tcp6 0 0 ::1:631 :::* LISTEN 5908/cupsd
tcp6 0 0 :::8888 :::* LISTEN 103094/docker-proxy
看到8888只开了tcp6么有开tcp
docker 使用桥接模式的时候默认使用ipv6地址,导致虚拟机挂起之后恢复无法访问端口。设置ipv4转发也没用
https://juejin.im/post/5d8cc0f451882509443bb0ae
感觉是没有映射到这个公网地址上去。
使用这个命令发现,docker的网络绑定好像绑到另一张网卡上去了
[root@localhost ~]# docker inspect happy_germain | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAddress": "172.17.0.2",
所以看一下docker启动时如何指定网卡
解答:
docker run -it --rm -p 192.168.132.128:8888:8888 --entrypoint=bash spellrun/fastai
果然可以了
接下来要解决jupyter 启动的密码
jupyter notebook --ip='*' --NotebookApp.token='' --NotebookApp.password=''
[ref]https://stackoverflow.com/questions/41159797/how-to-disable-password-request-for-a-jupyter-notebook-session
设置启动目录:
# c.NotebookApp.notebook_dir = ''
然后是映射一个目录到宿主机
挂载磁盘到外面能pull到代码的地方
用-v {overlord_dir}:{docker_dir} 格式来指定挂载目录
docker run -it --rm -p 192.168.132.128:8888:8888 --entrypoint=bash -v /src/fastai_docker1:/src spellrun/fastai
启动 docker run
指定目录启动是NotebookApp.notebook_dir='/src'
jupyter-notebook --no-browser --ip 0.0.0.0 --port=8888 --allow-root --NotebookApp.token='' --NotebookApp.password='' --NotebookApp.notebook_dir='/src'
【way2】 上面这些都是在jupyter 启动时用参数指定,也可以用docker加一层强写jupyter_application_config.py 来达成,后面可以试试