容器数据卷介绍
容器数据卷就是将docker容器内的数据保存到宿主机的磁盘中
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过联合文件系统。提供用于持续存储或共享数据的特性
卷的设计目的就是数据的持久化、完全独立于容器的生存周期,因此docker不会在容器删除时删除其挂载的数据卷
将运用于运行的环境打包镜像,run后形成容器实例运行,但是对数据的要求希望是持久化的
docker容器产生的数据,如果不备份,那么容器实例删除后,容器内数据就会丢失
为了能够保存数据,在docker中使用数据卷
特点:
1.数据卷可在容器之间共享或者重用数据
2.卷中的更改可以直接实时生效
3.数据卷中的更改不会包含在镜像的更新中
4.数据卷的生命周期会一直持续到没有容器使用它为止
添加数据卷参数-v
-v参数就是进行一个卷的挂载
主机路径:容器内的路径
通过容器数据卷的方式来进行数据的持久化
根据映射,将容器内的数据备份+持久化到宿主机目录
数据持久化:把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)
--privileged=true 开启特权
为解决docker挂载主机目录时报错,容器卷后面必须添加这个参数
为解决docker挂载主机目录时报错,容器卷后面必须添加这个参数
案例
1. 宿主机与容器之间映射添加容器卷
格式
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内绝对路径目录 镜像名称
使用ubuntu镜像,运行容器实例,自定义容器名称为“u1”,映射添加容器卷
宿主机目录为/tmp/host_date
容器内目录为/tmp/docker_date
若目录不存在,会自动创建目录
下载镜像
[root@localhost ~]# docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
7b1a6ab2e44d: Pull complete
Digest: sha256:626ffe58f6e7566e00254b638eb7e0f3b11d4da9675088f4781a50ae288f3322
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest
运行容器实例
[root@localhost ~]# docker run -it --name u1 --privileged=true -v /tmp/host_date:/tmp/docker_dan/bash
root@237f55d67b1b:/# ll
total 0
drwxr-xr-x. 1 root root 17 Apr 17 01:06 ./
drwxr-xr-x. 1 root root 17 Apr 17 01:06 ../
-rwxr-xr-x. 1 root root 0 Apr 17 01:06 .dockerenv*
lrwxrwxrwx. 1 root root 7 Oct 6 2021 bin -> usr/bin/
drwxr-xr-x. 2 root root 6 Apr 15 2020 boot/
drwxr-xr-x. 15 root root 3040 Apr 17 01:06 dev/
drwxr-xr-x. 1 root root 66 Apr 17 01:06 etc/
drwxr-xr-x. 2 root root 6 Apr 15 2020 home/
lrwxrwxrwx. 1 root root 7 Oct 6 2021 lib -> usr/lib/
lrwxrwxrwx. 1 root root 9 Oct 6 2021 lib32 -> usr/lib32/
lrwxrwxrwx. 1 root root 9 Oct 6 2021 lib64 -> usr/lib64/
lrwxrwxrwx. 1 root root 10 Oct 6 2021 libx32 -> usr/libx32/
drwxr-xr-x. 2 root root 6 Oct 6 2021 media/
drwxr-xr-x. 2 root root 6 Oct 6 2021 mnt/
drwxr-xr-x. 2 root root 6 Oct 6 2021 opt/
dr-xr-xr-x. 141 root root 0 Apr 17 01:06 proc/
drwx------. 2 root root 37 Oct 6 2021 root/
drwxr-xr-x. 5 root root 58 Oct 6 2021 run/
lrwxrwxrwx. 1 root root 8 Oct 6 2021 sbin -> usr/sbin/
drwxr-xr-x. 2 root root 6 Oct 6 2021 srv/
dr-xr-xr-x. 13 root root 0 Apr 17 00:07 sys/
drwxrwxrwt. 1 root root 25 Apr 17 01:06 tmp/
drwxr-xr-x. 13 root root 145 Oct 6 2021 usr/
drwxr-xr-x. 11 root root 139 Oct 6 2021 var/
root@237f55d67b1b:/# ls /tmp/
docker_date
容器内进行挂载目录创建文件,在宿主机进行查看
注意:不要exit退出,新建一个远程连接
root@237f55d67b1b:/# cd tmp/docker_date/
root@237f55d67b1b:/tmp/docker_date# pwd
/tmp/docker_date
root@237f55d67b1b:/tmp/docker_date# echo "hahhh" >> dockerin.txt
root@237f55d67b1b:/tmp/docker_date# cat dockerin.txt
hahhh
root@237f55d67b1b:/tmp/docker_date# ls
dockerin.txt
#宿主机查看
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
237f55d67b1b ubuntu "/bin/bash" 3 minutes ago Up 3 minutes u1
[root@localhost ~]# ls /tmp/
host_date vmware-root_709-42482872
systemd-private-ccafb5d922a1464d845db821575609f9-chronyd.service-xRqvaO
[root@localhost ~]# cd /tmp/host_date/
[root@localhost host_date]# ls
dockerin.txt
[root@localhost host_date]# cat dockerin.txt
hahhh
宿主机创建文件
[root@localhost host_date]# pwd
/tmp/host_date
[root@localhost host_date]# ls
dockerin.txt
[root@localhost host_date]# echo "qqqq" >> hostin.txt
[root@localhost host_date]# ls
dockerin.txt hostin.txt
[root@localhost host_date]# cat hostin.txt
qqqq
[root@localhost host_date]#
[root@localhost host_date]#
[root@localhost host_date]# vi a.txt
[root@localhost host_date]#
[root@localhost host_date]# ls
a.txt dockerin.txt hostin.txt
[root@localhost host_date]# cat a.txt
hello world
hello host update
#容器内查看
root@237f55d67b1b:/tmp/docker_date# ls
dockerin.txt hostin.txt
root@237f55d67b1b:/tmp/docker_date# cat hostin.txt
qqqq
root@237f55d67b1b:/tmp/docker_date# cat a.txt
hello world
hello host update
root@237f55d67b1b:/tmp/docker_date# ls
a.txt dockerin.txt hostin.txt
查看数据卷是否挂载成功
格式:docker inspect 容器名称或ID
将版本、属性等重要信息以json打包显示
可以添加–format参数指定输出,也可以使用grep过滤
[root@localhost ~]# docker inspect u1 --format {{.Mounts}}
[{bind /tmp/host_date /tmp/docker_date true rprivate}]
[root@localhost ~]#
[root@localhost ~]# docker inspect u1 |grep "Mounts" -A8
"Mounts": [
{
"Type": "bind",
"Source": "/tmp/host_date", #源路径
"Destination": "/tmp/docker_date", #目的路径
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
容器实例在使用过程中宕机,宿主机文件进行更改,重启容器实例,文件会同步更新
#容器内目前的文件
root@7845c4977c78:/tmp/docker_data# ls
dockerin.txt hostin.txt
# 使用ctrl+p+q退出容器,保证退出容器不停止
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7845c4977c78 ubuntu "bash" 7 minutes ago Up 7 minutes u1
[root@localhost ~]#
[root@localhost ~]# docker stop u1
u1
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost ~]# ls /tmp/host_data/
dockerin.txt hostin.txt
#在宿主机的挂载目录上创建文件
[root@localhost host_data]# touch c.txt
[root@localhost host_data]# ll
total 4
-rw-r--r--. 1 root root 0 Apr 17 20:19 c.txt
-rw-r--r--. 1 root root 0 Apr 17 20:11 dockerin.txt
-rw-r--r--. 1 root root 21 Apr 17 20:11 hostin.txt
#重新启动容器
[root@localhost ~]# docker start u1
u1
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7845c4977c78 ubuntu "bash" 11 minutes ago Up Less than a second u1
#进入容器
[root@localhost ~]# docker exec -it u1 /bin/bash
root@7845c4977c78:/# ls
bin dev home lib32 libx32 mnt proc run srv tmp var
boot etc lib lib64 media opt root sbin sys usr
root@7845c4977c78:/# cd tmp/
root@7845c4977c78:/tmp# ls
docker_data
root@7845c4977c78:/tmp# cd docker_data/
#发现c.txt文件同步更新了
root@7845c4977c78:/tmp/docker_data# ls
c.txt dockerin.txt hostin.txt
读写规则映射添加说明
1. 默认可读可写rw
docker run -it --name 容器名称 --privileged=true -v /宿主机绝对路径目录:/容器内绝对路径目录:rw 镜像名称
2. 容器实例内被限制,只能读取不能写,ro=read only
docker run -it --name 容器名称 --privileged=true -v /宿主机绝对路径目录:/容器内绝对路径目录:ro 镜像名称
#删除之前创建的容器
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7845c4977c78 ubuntu "bash" 22 minutes ago Up 10 minutes u1
[root@localhost ~]# docker rm -f u1
u1
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
#运行容器,并设置权限为只读
[root@localhost ~]# docker run -it --name u2 --privileged=true -v /mydocker/u:/tmp/u :ro ubuntu
root@4aa435d9aeb9:/# cd tmp/u/
root@4aa435d9aeb9:/tmp/u# ls
root@4aa435d9aeb9:/tmp/u# ls #新建远程连接,在挂载目录/mydocker/u内新建文件
w.txt
root@4aa435d9aeb9:/tmp/u# cat w.txt #新建远程连接,在挂载目录/mydocker/u内编辑文件内容
hello world
root@4aa435d9aeb9:/tmp/u# echo "hahhhh" >> w.txt #在容器内追加内容到文件内,提示"只读文件系统",说明权限设置成功
bash: w.txt: Read-only file system
root@4aa435d9aeb9:/tmp/u# touch b.txt #容器内新建文件,提示"只读文件系统"
touch: cannot touch 'b.txt': Read-only file system
root@4aa435d9aeb9:/tmp/u# cat w.txt #内容没有发生改变
hello world
卷的继承的共享
清理之前做的环境
#删除新建的宿主机目录/mydocker
[root@localhost ~]# ls /
bin dev home lib64 mnt opt root sbin sys usr
boot etc lib media mydocker proc run srv tmp var
[root@localhost ~]# rm -rf /mydocker/
[root@localhost ~]# ls /
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
#删除之前运行的容器u2
[root@localhost ~]# docker rm -f u2
u2
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
容器1 和 宿主机添加映射关系
#运行容器1
[root@localhost ~]# docker run -it --privileged=true -v /mydocker/u:/tmp/u --name u1 ubuntu
root@766d2bbc0e73:/#
root@766d2bbc0e73:/# cd tmp/u/
root@766d2bbc0e73:/tmp/u# ls
root@766d2bbc0e73:/tmp/u# touch u1data.txt
root@766d2bbc0e73:/tmp/u# ls
u1data.txt
#宿主机
[root@localhost ~]# cd /mydocker/u/
[root@localhost u]# ls
[root@localhost u]# ls
u1data.txt
容器2继承容器1的卷规则
格式:
docker run -it --privileged=true --volumes-from 父类(容器名称) --name=容器名称 镜像名称
#运行容器2
[root@localhost ~]# docker run -it --privileged=true --volumes-from u1 --name=u2 ubuntu root@52355d1cee0d:/# cd tmp/u/
root@52355d1cee0d:/tmp/u# ls #发现挂载目录和容器1一样,目录数据同步过来了
host.txt u1data.txt
#在容器2的挂载目录下创建文件
root@52355d1cee0d:/tmp/u# touch u2.txt
root@52355d1cee0d:/tmp/u# ls
host.txt u1data.txt u2.txt
#容器1 同步成功
root@766d2bbc0e73:/tmp/u# ls
host.txt u1data.txt
root@766d2bbc0e73:/tmp/u# ls
host.txt u1data.txt u2.txt
#宿主机 同步成功
[root@localhost u]# ls
host.txt u1data.txt u2.txt
[root@localhost u]# pwd
/mydocker/u
#新建远程连接查看容器信息
[root@localhost u]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
52355d1cee0d ubuntu "bash" 6 seconds ago Up 6 seconds u2
766d2bbc0e73 ubuntu "bash" 7 minutes ago Up 7 minutes u1
[root@localhost u]# docker inspect u2 --format {{.Mounts}} #挂载卷和u1一样,说明继承成功
[{bind /mydocker/u /tmp/u true rprivate}]
[root@localhost u]# docker inspect u1 --format {{.Mounts}}
[{bind /mydocker/u /tmp/u true rprivate}]
如果容器1宕机不会影响对容器2的继承
它们都是独立的容器,只是继承了挂载的目录
#停止容器1运行
[root@localhost u]# docker stop u1
[root@localhost u]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
52355d1cee0d ubuntu "bash" 6 minutes ago Up 6 minutes u2
#宿主机新建文件
[root@localhost u]# ls
host.txt u1data.txt u2.txt
[root@localhost u]# touch host2.txt
[root@localhost u]# ls
host2.txt host.txt u1data.txt u2.txt
#容器2查看 同步更新
root@52355d1cee0d:/tmp/u# ls
host.txt u1data.txt u2.txt
root@52355d1cee0d:/tmp/u# ls
host.txt host2.txt u1data.txt u2.txt
重新启动容器1 数据仍然同步更新