可以前往我的指引页面,里面有更多docker的笔记:https://blog.csdn.net/qq_41672878/article/details/110430104
目录
是什么?
先来看看docker的理念
- 将运用与运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对数据的要求希望是持久化的
- 容器之间希望有可能共享数据
为什么呢,docker容器产生的数据,如果不通过doker commit生成新的镜像,使得数据做为镜像得一部分保存下来,那么当容器删除后,数据自然也就没有了,为了能够保存数据在docker中我们使用卷
能干嘛?
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过union file system提供一些用于持续存储或共享数据得特性
卷的设计目的就是数据持久化,完全独立于容器的生存周期,因此doker不会在容器删除时候删除其挂载的数据卷
特点
- 数据卷可在容器之间共享或者重用数据
- 卷中的更改可以直接生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
实例操作 : 命令行
1 添加
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
容器中
在宿主机中执行,宿主机和容器中都会生成对应的文件
[root@VM-0-12-centos /]# docker run -it -v /myDataVolume:/dataVolumeContainer centos
[root@a45330a279b5 /]# ll
bash: ll: command not found
[root@a45330a279b5 /]# ls
bin dataVolumeContainer dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@a45330a279b5 /]#
宿主机中
[root@VM-0-12-centos /]# ls
bin boot data dev etc home lib lib64 lost+found media mnt myDataVolume opt proc root run sbin srv sys tmp usr var
2 查看数据卷是否挂载成功
docker inspect 容器ID
3 容器和宿主机之间数据共享
宿主机中新建一个文件
容器中
4 容器停止退出后,主机修改后数据是否同步
会有同步的
5 命令(带权限)
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro镜像名
实例操作 : DockerFile 添加
1 宿主机的根目录下新建mydocker 文件夹并且进入
2 可在dockerFile中使用volume指令给镜像添加一个或者多个数据卷
3 file构建
[root@VM-0-12-centos myDataVolume]# pwd
/myDataVolume
[root@VM-0-12-centos myDataVolume]# vim Dockerfile
内容
# volume test
FROM centos
VOLUME ["/dataVolumeContainer1", "dataVolumeContainer2"]
CMD echo "finished,------success1"
CMD /bin/bash
4 build后生成镜像
参数说明:
f :指定要使用的Dockerfile路径;
--tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
. 当前目录
[root@VM-0-12-centos myDataVolume]# docker build -f /myDataVolume/Dockerfile -t twj/centos .
Sending build context to Docker daemon 2.56 kB
Step 1/4 : FROM centos
---> 0d120b6ccaa8
Step 2/4 : VOLUME /dataVolumeContainer1 dataVolumeContainer2
---> Running in 329acb3cbadb
---> 85ca3eeadbd9
Removing intermediate container 329acb3cbadb
Step 3/4 : CMD echo "finished,------success1"
---> Running in c1df9c6d0b60
---> fa44def09d27
Removing intermediate container c1df9c6d0b60
Step 4/4 : CMD /bin/bash
---> Running in 3830aa282fc4
---> 3712230f01cc
Removing intermediate container 3830aa282fc4
Successfully built 3712230f01cc
5 run 容器
ps:容器内的文件地址已经知道了,那么主机的文件地址在哪呢?
docker inspect 容器ID 通过这个命令查看
没指定的话就是默认,如下图
遇到的问题:
如果docker挂载主机目录 docker访问出现 cannot open directory permission denied
解决:在挂载目录后多加一个 --privileged=true参数就可
docker run -it -v /myDataVolume:/dataVolumeContainer centos --privileged=true
数据卷容器:实际就是容器间传递共享
容器之间传递共享(--volumes-from)
步骤
1 先启动一个父容器 dc01
[root@VM-0-12-centos ~]# docker run -it --name doc01 twj/centos
[root@312fc585776e /]# ls
bin dataVolumeContainer1 dataVolumeContainer2 dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@312fc585776e /]# cd dataVolumeContainer2/
[root@312fc585776e dataVolumeContainer2]# pwd
/dataVolumeContainer2
[root@312fc585776e dataVolumeContainer2]# touch dc01_add.txt
[root@312fc585776e dataVolumeContainer2]# ls
dc01_add.txt
2 dc02/dc03继承dc01
参数: --volumes-from
docker run -it --name dc02 --volumes-from dc01 twj/centos
[root@VM-0-12-centos ~]# docker run -it --name dc02 --volumes-from dc01 twj/centos
[root@77bdcc00c66d /]# ls
bin dataVolumeContainer1 dataVolumeContainer2 dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@77bdcc00c66d /]# cd dataVolumeContainer2/
[root@77bdcc00c66d dataVolumeContainer2]# ls
dc01_add.txt
[root@77bdcc00c66d dataVolumeContainer2]# touch dc02_add.txt
[root@77bdcc00c66d dataVolumeContainer2]# [root@VM-0-12-centos ~]#
[root@VM-0-12-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
77bdcc00c66d twj/centos "/bin/sh -c /bin/bash" About a minute ago Up About a minute dc02
86c67733c59d twj/centos "/bin/sh -c /bin/bash" About a minute ago Up About a minute dc01
[root@VM-0-12-centos ~]#
[root@VM-0-12-centos ~]# docker run -it --name dc03 --volumes-from dc01 twj/centos
[root@c2241097aa7e /]# cd dataVolumeContainer2/
[root@c2241097aa7e dataVolumeContainer2]# ls
dc01_add.txt dc02_add.txt
[root@c2241097aa7e dataVolumeContainer2]# touch dc03_add.txt
[root@VM-0-12-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c2241097aa7e twj/centos "/bin/sh -c /bin/bash" 29 seconds ago Up 29 seconds dc03
77bdcc00c66d twj/centos "/bin/sh -c /bin/bash" 2 minutes ago Up 2 minutes dc02
86c67733c59d twj/centos "/bin/sh -c /bin/bash" 3 minutes ago Up 3 minutes dc01
[root@VM-0-12-centos ~]#
这时候,我们进入到dc01,就可以看到,达到了数据共享的目的,有了dc02 和dc03
[root@VM-0-12-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c2241097aa7e twj/centos "/bin/sh -c /bin/bash" 29 seconds ago Up 29 seconds dc03
77bdcc00c66d twj/centos "/bin/sh -c /bin/bash" 2 minutes ago Up 2 minutes dc02
86c67733c59d twj/centos "/bin/sh -c /bin/bash" 3 minutes ago Up 3 minutes dc01
[root@VM-0-12-centos ~]# docker attach dc01
[root@86c67733c59d dataVolumeContainer2]# ls
dc01_add.txt dc02_add.txt dc03_add.txt
3 删除dc01,dc02修改后dc03可否访问? 结论: 删除 dc01后,dc02和dc03都不会受影响
[root@VM-0-12-centos ~]# docker rm -f dc01
dc01
[root@VM-0-12-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c2241097aa7e twj/centos "/bin/sh -c /bin/bash" 4 minutes ago Up 4 minutes dc03
77bdcc00c66d twj/centos "/bin/sh -c /bin/bash" 6 minutes ago Up 6 minutes dc02
[root@VM-0-12-centos ~]# docker acctch dc02
docker: 'acctch' is not a docker command.
See 'docker --help'
[root@VM-0-12-centos ~]# docker attach dc02
[root@77bdcc00c66d dataVolumeContainer2]# ls
dc01_add.txt dc02_add.txt dc03_add.txt
结论:修改了dc02,dc03也一样会同步
[root@77bdcc00c66d dataVolumeContainer2]# ls
dc01_add.txt dc02_add.txt dc03_add.txt
[root@77bdcc00c66d dataVolumeContainer2]# touch dc02_update.txt
[root@77bdcc00c66d dataVolumeContainer2]# ls
dc01_add.txt dc02_add.txt dc02_update.txt dc03_add.txt
[root@77bdcc00c66d dataVolumeContainer2]#
[root@77bdcc00c66d dataVolumeContainer2]# [root@VM-0-12-centos ~]# docker attach dc03
[root@c2241097aa7e dataVolumeContainer2]# ls
dc01_add.txt dc02_add.txt dc02_update.txt dc03_add.txt
[root@c2241097aa7e dataVolumeContainer2]#