1、准备镜像
我这里用的是ubuntu:latest镜像和docker.paddlepaddle.org/book:0.10.0
ubuntu:
docker pull ubuntu
由于我直接用名字默认版本是latest,所以命令如此。
paddlepaddle:
docker run -d -p 8888:8888 docker.paddlepaddle.org/book:0.10.0
这个镜像会自动下载,比较特殊点。
2、生成卷
这里以ubuntu镜像作为卷,paddlepaddle挂在上去。
ubuntu:
docker run -dit --name datastore -v /data ubuntu
-v代表需要不被改变的目录。
其实,这样子就是普通的生成一个可以改变的目录而已,这就可以当成一个卷用了,但为什么可以这么做呢?
因为根据镜像生成的container,会缓存下来,通过docker ps -a就可以查看到。
paddlepaddle:
docker run -d --rm -p 8888:8888 --name book --volumes-from datastore docker.paddlepaddle.org/book:0.10.0
其中-d代表后台运行并detach,
--rm就是容器停止后自动删除缓存(不让它出现在docker ps -a的列表中),
-p 8888:8888表示将容器的8888端口映射到本地的8888端口,
--name book是给容器实例起别名,
--volumes-from datastore表示挂在一个名叫datastore卷(即我们的上面的ubuntu卷)
这里挂在了datastore卷,所以当你访问book的时候会发现,多了一个/data目录,在这个卷中,改写、录入数据都不会消失 ,即使你重启了机器,这样看,卷真的很美好。
但是呢?事实不是这样子的,我上面提到过缓存,如果这个缓存删除了,会怎样?对的,这个目录的内容没了,再次运行第二条命令时,会提示:
docker: Error response from daemon: No such container: datastore.
此时你只能再运行多一次,生成卷的命令,但是这个已经是,新的容器了,你的数据已经不在了。但是真的是说没就没么?也是不是的,在宿主机/var/lib/docker/volumes目录下,你可以找到数据。
具体你可以查看博客:Docker容器学习梳理–Volume数据卷使用
在我看来,还不如直接把数据直接绑定到宿主机的本地目录,既然数据在本机,还在那么深的目录,还不如自己挂载到本地某目录上去,因为单机,我也只能想到那么多了,也许,规模大就有用了吧。
所以呢?改一下第二条命令:
docker run -d --rm -p 8888:8888 --name book -v /data:/data docker.paddlepaddle.org/book:0.10.0
-v 宿主机目录:容器里目录 或者是 宿主机文件:容器里文件
PS:你想docker attach book是不行的,需要通过浏览器访问localhsot:8888通过网页新建一个终端才能访问,如果你按着我的敲,你想attach 的话,使用如下命令:
docker run --rm -dit -p 8888:8888 --name book -v /data:/data docker.paddlepaddle.org/book:0.10.0 /bin/bash
PS2:还有一种创建容器的方法:
docker run -dit --name datastore -v /data:/data ubuntu
这样子即时你删了docker ps -a的容器,数据还在,因为数据本来就在本地的,但是会不会多次一举,我一个-v选项直接挂在到目标容器,比这个经过容器,再共享简单多了吧,还是想不到为什么要这么做,知道的欢迎评论,解答一下。
这里推荐一篇比较齐全的文章:理解Docker(8):Docker 存储之卷(Volume)