目录
重点,勿忘:
--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恢复后,同样能够看到新增的数据。