1.容器数据卷是什么
实现容器数据持久化的一种方式。
2.容器数据卷的特点
①可以在容器之间、容器与宿主机之间共享或重用数据
②数据卷中的更改可以直接生效
③数据卷的更改不会包含在镜像的更新中
④数据卷的生命周期一直持续到没有容器使用它为止
3.自动共享
我们可以使用docker cp命令在主机和容器间相互拷贝数据,相对比较麻烦,当设置好容器数据卷后,不管是主机还是容器,当数据卷目录下有变动时,其他有映射关系的目录会自动同步。
4.添加方式
4.1 命令添加
# docker run -it -v 宿主机绝对路径:容器内目录 镜像名
# docker run -itd -v /root/pmVolume:/containerVolume ubuntu /bin/bash
执行完该命令后,会自动在宿主机/root目录下生成pmVolume目录,在生成的容器中生成/containerVolume目录
并且在这两个目录下有任何变化时,另一方目录会自动变化。(容器停止时也会同步)
查看底层信息
# docker inspect 80dd327ca6f4
"Mounts": [
{
"Type": "bind",
"Source": "/root/pmVolume",
"Destination": "/containerVolume",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
]
创建只读容器数据卷(容器中只读)
# docker run -itd -v /root/pmVolume:/containerVolume:ro ubuntu /bin/bash
4.2 Dockerfile添加
因为上面使用-v是宿主机到容器的数据卷绑定,这个对宿主机有依赖,不适合容器的移植与分享,所以dockerfile方式适用于容器之间的数据卷。
mydockerfile内容:
FROM ubuntu
VOLUME ["/volume1","/volume2"]
CMD echo "Data Volume created successfully!"
CMD /bin/bash
通过dockerfile构建镜像
# docker build -f mydockerfile -t pm/ubuntu ./
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM ubuntu
---> f643c72bc252
Step 2/4 : VOLUME ["/volume1","/volume2"]
---> Running in 4f677de96b04
Removing intermediate container 4f677de96b04
---> 9fc884b7767a
Step 3/4 : CMD echo "Data Volume created successfully!"
---> Running in 1dd72128a5da
Removing intermediate container 1dd72128a5da
---> e278ba450d4e
Step 4/4 : CMD /bin/bash
---> Running in d4c7640a26eb
Removing intermediate container d4c7640a26eb
---> c92c94406166
Successfully built c92c94406166
Successfully tagged pm/ubuntu:latest
使用上面镜像创建的容器中会自动生成目录/volume1和/volume2,通过docker inspect可以查看对应的宿主机的目录,如/var/lib/docker/volumes/30f3aaaf92a50f6a240efc6d204d6d33bca1cf6503c28d59f2bbb84d50062e48/_data
5.数据卷容器
从一个带有数据卷的容器,生成一个新的容器,新生成的容器也会创建数据卷目录,并跟其他容器同步。
# docker run -it --volumes-from c3ff969b7c07 ubuntu /bin/bash
注:当有多个容器都是通过这个方法创建的时候,只要还有一个容器存在,这个数据卷都是存在的。