docker镜像是由多个可读层叠加而成,启动容器时只会加载只读镜像层并在镜像栈顶部添加一个读写层
如运行容器修改一个已存在的文件,该文件会从读写层下面的只读层复制到读写层。该文件只读版本依然存在,只是被读写层该文件副本所隐藏
写时复制机制:Copy On Write(COW)
主机上的这个与容器形成绑定关系的目录被称作存储卷
通过跟宿主机的指定目录和容器内部文件系统进行绑定。这样容器写入文件的时候会直接写入宿主机的目录下
Docker存在的问题有:
存储卷则提供一个很好的解决方案
存储卷在容器初始化时自动创建,由base image卷中的数据复制而来
存储卷为Docker提供了独立于容器的数据管理机制:
在使用Docker的过程中,往往需要能查看容器内应用产生的数据,或者需要把容器内的数据进行备份,甚至多个容器之间进行数据的共享
容器中管理数据主要有两种方式:
docker run -it --name CONTAINER_NAME -v VOLUMEDIR IMAGE_NAME
docker run -it --name CONTAINER_NAME -v HOSTDIR:VOLUMEDIR:(权限) IMAGE_NAME
//目录需要添加绝对路径
[root@node0 ~]# docker run -P -it --rm -v /test busybox
/ # ls
bin dev etc home proc root sys test tmp usr var
/ # touch test/a
/ # ls test/
a
[root@node0 ~]# docker run -P -it --rm -v /test:/data busybox #目录必须使用绝对路径,不存在将自动创建
/ # ls
bin data dev etc home proc root sys tmp usr var
/ # touch data/a
/ # ls data/
a
[root@node0 ~]# ls /
bin dev home lib64 mnt proc run srv test usr
boot etc lib media opt root sbin sys tmp var
[root@node0 ~]# ls /test/
a
Docker挂载数据卷的默认权限是读写(rw),用户也可以通过(ro)指定为只读
[root@node0 ~]# docker run -it -P --rm --name test -v /data:/htdocs:ro httpd
//只读目录,无法写入
[root@node0 data]# mkdir a
mkdir: cannot create directory ‘a’: No such file or directory
挂载一个本地主机文件作为数据卷
//通过挂载文件查看历史
[root@node0 ~]# docker run -it -P --rm --name test -v /root/.bash_history:/.bash_history busybox
原文:https://www.cnblogs.com/fangxinxin/p/14476267.html