1.简介

默认情况下,容器不使用任何 volume,此时,容器的数据被保存在容器之内,它只在容器的生命周期内存在,会随着容器的被删除而被删除。当然,也可以使用 docker commit 命令将它持久化为一个新的镜像。很多情况下我需要数据持续化保存.

2.Data volume (数据卷)

Docker容器启动的时候,如果要挂载宿主机的一个目录,可以用-v参数指定

这样在容器启动后,容器内会自动创建/home/data的目录。通过这种方式,我们可以明确一点,即-v参数中,冒号":"前面的目录是宿主机目录,后面的目录是容器内目录。
ps:路径为绝对路径

启动容器
[root@au opt]# docker run -d --name=dor -v /opt/dataSource:/home/data yjgithub/dor 

容器: yjgithub/dor
宿主机绝对路径:/opt/dataSource
容器绝对路径:/home/data

通过docker inspect命令查看详细信息

docker inspect $containerId

[root@au opt]#docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES
1249319e10ca        yjgithub/dor        "nginx -g 'daemon of…"   About a minute ago   Up About a minute   80/tcp              dor

[root@au opt]#docker inspect  1249319e10ca 
"Mounts": [
            {
                "Type": "bind",
                "Source": "/opt/dataSource",
                "Destination": "/home/data",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

ps:

1.容器销毁了,在宿主机上新建的挂载目录不会消失
2.如果宿主机目录存在,在运行容器时也会映射到容器中
3.宿主机目录数据,在运行容器时也会同步
4.挂载宿主机已存在目录后,在容器内对其进行操作,报“Permission denied”,
   4.1 设置selinux永久关闭 
       修改/etc/sysconfig/selinux文件,将SELINUX的值设置为disabled。
   4.2 以特权方式启动容器 指定--privileged参数  
       [root@au opt]# docker run -d --name=dor --privileged=true -v /opt/dataSource:/home/data yjgithub/dor

3.使用 data container (container )

如果要在容器之间共享数据,最好是使用 data container。这种 container 中不会跑应用,而只是挂载一个卷
创建一个 data container:

[root@au opt]#docker create -v /opt/dataSource/share:/dbdata --name dbstore yjgithub/dor /bin/true

使用这个 volume

[root@au opt]#docker run -d -P --name web --volumes-from dbstore  yjgithub/dor
[root@au share]# docker inspect web
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/opt/dataSource/share",
                "Destination": "/dbdata",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

结果还是一样的,即将 au 对应的主机上的目录挂载给容器内的 /volume 目录。
这种做法,能想到的好处就是容器件共用数据
感觉上两种做法都是一样的,何不直接用第一种? 如果还有更好的做法或者其他场景,可以一起讨论下.

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐