容器数据卷详解和经典案例

目录

 容器卷作用

运行带数据卷的容器

容器卷案例 

 宿主和容器之间映射添加数据卷

容器内容能够实时同步到宿主机

交互运行,进入容器,并在容器内创建文件

 宿主机内容能够实时同步到容器

查看容器券是否挂载成功

 停止容器后恢复,数据依旧还存在

容器卷的读写规则

容器卷的继承和共享


重点,勿忘:

--privileged = true  开启权限参数 ,主要解决Docker挂载主机目录访问出现cannot open directory :Permission denied 的问题,强烈建议开启。

开启之后,container 内的root拥有真正的root权限,否则container 内的root只是外部的一个普通用户权限而已。

 容器卷作用

上命令:

 docker run -d -p 5000:5000 -v /zzyyuse/myregistry/:/tmp/registry --privileged=true registry

-d 后台运行

-p 5000:5000 指定映射端口,左边的5000是宿主机端口,右边5000是容器端口

--privileged=true 开启权限

registry 容器的名称

-v /zzyyuse/myregistry/:/tmp/registry :-v 实现了容器卷路径的映射,其中左边的路径是宿主机路径,右边的路径是容器路径(特别注意,如果机器上没有指定的路径,系统会自动创建)(再次特别注意:可以使用多次-v 同时映射不同的容器卷)

作用:

1、映射,容器内的数据映射到宿主机

2、备份的作用,因为容器很可能被删除或者终止

3、持久化到本地的主目录

卷就是目录或者文件,存在于一个或多个容器中,由docker 挂载到容器。但是不属于联合文件系统,因此能够绕过联合文件系统来提供的一些用于持续存储或则共享数据的特性。

卷的设计目的就是为了数据的持久化,完全独立于容器的生命周期,因此Docker 不会在容器删除时,删除其挂载的的数据卷。

运行带数据卷的容器

命令一般格式:

 docker run -it  -v /宿主机绝对路径:/容器内绝对目录 --privileged=true 容器名

特点:

1、容器卷可以在容器之间共享和重用数据

2、卷中的更改可以直接实时生效

3、数据卷中的更改不会包含在镜像的更新中

4、数据卷的生命周期一直持续到没有容器使用它为止

容器卷案例 

 宿主和容器之间映射添加数据卷

容器内容能够实时同步到宿主机

交互运行,进入容器,并在容器内创建文件

[root@localhost ~]# docker images
REPOSITORY                 TAG       IMAGE ID       CREATED         SIZE
tomcat                     latest    451d25ef4583   2 weeks ago     483MB
redis                      latest    2e50d70ba706   3 weeks ago     117MB
ubuntu                     latest    27941809078c   5 weeks ago     77.8MB
registry                   latest    773dbf02e42e   7 weeks ago     24.1MB
hello-world                latest    feb5d9fea6a5   9 months ago    13.3kB
centos                     latest    5d0da3dc9764   10 months ago   231MB
192.168.2.250:5000/redis   6.0.8     16ecd2772934   20 months ago   104MB
redis                      6.0.8     16ecd2772934   20 months ago   104MB
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# docker run -it -v /wll/myregistry/:/tmp/redistry/ --privileged=true ubuntu
root@a83cee965fa4:/# cd /tmp/redistry/
root@a83cee965fa4:/tmp/redistry# ls
root@a83cee965fa4:/tmp/redistry# pwd
/tmp/redistry
root@a83cee965fa4:/tmp/redistry# ls
root@a83cee965fa4:/tmp/redistry# touch redistry_txt.txt
root@a83cee965fa4:/tmp/redistry# vi redistry_txt.txt
bash: vi: command not found
root@a83cee965fa4:/tmp/redistry# echo "ceshi" > redistry_txt.txt
root@a83cee965fa4:/tmp/redistry# cat redistry_txt.txt
ceshi
root@a83cee965fa4:/tmp/redistry#

宿主机上查看已经同步容器内的文件

Last login: Sun Jul 17 09:56:16 2022 from hyt-dell3410.lan
[root@localhost ~]# cd /wll/myregistry/
[root@localhost myregistry]# pwd
/wll/myregistry
[root@localhost myregistry]# ls
redistry_txt.txt
[root@localhost myregistry]# cat redistry_txt.txt
ceshi
[root@localhost myregistry]#

 宿主机内容能够实时同步到容器

宿主机修改内容

[root@localhost myregistry]# cat redistry_txt.txt
ceshi
[root@localhost myregistry]# echo "suzhuji add" >>redistry_txt.txt
[root@localhost myregistry]# cat redistry_txt.txt
ceshi
suzhuji add
[root@localhost myregistry]#

 容器内查看内容已更新

root@a83cee965fa4:/tmp/redistry# cat redistry_txt.txt
ceshi
suzhuji add
root@a83cee965fa4:/tmp/redistry#

查看容器券是否挂载成功

经查看已经挂载成功

[root@localhost myregistry]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS          PORTS     NAMES
a83cee965fa4   ubuntu    "bash"    21 minutes ago   Up 21 minutes             charming_davinci
[root@localhost myregistry]# docker inspect a83cee965fa4
。。。。。。。。。
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/wll/myregistry",
                "Destination": "/tmp/redistry",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
。。。。。。。。。。。。。。

 停止容器后恢复,数据依旧还存在

停止容器

[root@localhost myregistry]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS          PORTS     NAMES
a83cee965fa4   ubuntu    "bash"    28 minutes ago   Up 28 minutes             charming_davinci
[root@localhost myregistry]#
[root@localhost myregistry]# docker stop a83cee965fa4

a83cee965fa4
[root@localhost myregistry]#
[root@localhost myregistry]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@localhost myregistry]#

 宿主机映射的容器卷新增内容(特别注意:容器已经停止)

[root@localhost myregistry]# pwd
/wll/myregistry
[root@localhost myregistry]# ls
redistry_txt.txt
[root@localhost myregistry]# cat redistry_txt.txt
ceshi
suzhuji add
[root@localhost myregistry]# echo "host add while contain stoped work" > host_add.txt
[root@localhost myregistry]# ls
host_add.txt  redistry_txt.txt
[root@localhost myregistry]# cat host_add.txt
host add while contain stoped work
[root@localhost myregistry]#

重新启动容器,并进入,查看文件仍旧保留,仍旧能够看到新添加的内容

[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@localhost ~]# docker start a83cee965fa4
a83cee965fa4
[root@localhost ~]# docker exec -it a83cee965fa4 /bin/bash
root@a83cee965fa4:/# cd /tmp/redistry/
root@a83cee965fa4:/tmp/redistry# ls
host_add.txt  redistry_txt.txt
root@a83cee965fa4:/tmp/redistry# cat host_add.txt
host add while contain stoped work
root@a83cee965fa4:/tmp/redistry#

容器卷的读写规则

1、默认规则为rw,可读可写,上例的命令就等同于:

docker run -it -v /wll/myregistry/:/tmp/redistry/:rw --privileged=true ubuntu

2、容器实例内部被限制,只能读取不能读写

docker run -it -v /wll/myregistry/:/tmp/redistry/:ro --privileged=true ubuntu

特别注意:只限制容器,并没有限制宿主机

容器卷的继承和共享

新建u1容器,并新建u1容器的数据文件,并能够同步到宿主机

[root@localhost ~]# docker run -it -v /tmp/host_v_dir:/tmp/u1_contain_dir:rw --privileged=true --name u1 ubuntu
root@76d01b7fc7d2:/# cd /tmp/u1_contain_dir/
root@76d01b7fc7d2:/tmp/u1_contain_dir# ls
root@76d01b7fc7d2:/tmp/u1_contain_dir# touch u1_data.txt
root@76d01b7fc7d2:/tmp/u1_contain_dir# ls
u1_data.txt
root@76d01b7fc7d2:/tmp/u1_contain_dir#
[root@localhost host_v_dir]# pwd
/tmp/host_v_dir
[root@localhost host_v_dir]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS         PORTS     NAMES
76d01b7fc7d2   ubuntu    "bash"    2 minutes ago   Up 2 minutes             u1
[root@localhost host_v_dir]#
[root@localhost host_v_dir]# touch host_data.txt
[root@localhost host_v_dir]# ls
host_data.txt  u1_data.txt
[root@localhost host_v_dir]# 

新建u2容器,并继承u1容器规则,u2能够看到u1和宿主机内容

[root@localhost ~]# docker run -it --privileged=true --volumes-from u1 --name u2  ubuntu
root@38ed2f64e621:/# cd /tmp/u1_contain_dir/
root@38ed2f64e621:/tmp/u1_contain_dir# ls
host_data.txt  u1_data.txt
root@38ed2f64e621:/tmp/u1_contain_dir# touch u2_data.txt
root@38ed2f64e621:/tmp/u1_contain_dir# ls
host_data.txt  u1_data.txt  u2_data.txt
root@38ed2f64e621:/tmp/u1_contain_dir#

u1和宿主机也能看到继承后的u2的内容

root@76d01b7fc7d2:/tmp/u1_contain_dir# pwd
/tmp/u1_contain_dir
root@76d01b7fc7d2:/tmp/u1_contain_dir# ls
host_data.txt  u1_data.txt  u2_data.txt
root@76d01b7fc7d2:/tmp/u1_contain_dir#
[root@localhost host_v_dir]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS          PORTS     NAMES
38ed2f64e621   ubuntu    "bash"    2 minutes ago    Up 2 minutes              u2
76d01b7fc7d2   ubuntu    "bash"    11 minutes ago   Up 11 minutes             u1
[root@localhost host_v_dir]# pwd
/tmp/host_v_dir
[root@localhost host_v_dir]# ls
host_data.txt  u1_data.txt  u2_data.txt
[root@localhost host_v_dir]#

特别注意:如果u1容器挂掉,u2和主机仍旧能够正常工作;因为u2只能继承了挂载路径的规则,容器是相互独立的。后续如果u1恢复后,同样能够看到新增的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

haowll

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

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

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

打赏作者

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

抵扣说明:

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

余额充值