Docker容器数据卷使用(超详细)

容器数据卷介绍

容器数据卷就是将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 数据仍然同步更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SKY慕雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值