Docker
文章目录
6. 容器数据卷(老师:狂神)
6.1 什么是容器数据卷
6.1.1 docker的理念
将应用和运行的环境打包形成容器运行,运行可以伴随着容器,但是对于数据的要求,我们希望能够持久化。
所以希望容器之间有可能可以共享数据,Docker容器产生的数据,如果不通过docker commit 生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。
为了能保存数据在Docker中就可以使用卷,让数据挂载到本地!这样数据就不会因为容器删除而丢失了。
6.1.2 作用
卷就是目录或者文件,存在一个或者多个容器中,由docker挂载到容器,但不属于联合文件系统,因此
能够绕过 Union File System , 提供一些用于持续存储或共享数据的特性。
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂
载的数据卷。
6.1.3 特点
- 数据卷可在容器之间共享或重用数据
- 卷中的更改可以直接生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
总结:容器数据卷就是容器的持久化以及容器间的继承和数据共享。
6.2 使用数据卷
6.2.1 容器中直接使用命令来添加
# 命令
docker run -it -v 宿主机绝对路径目录:容器内目录 镜像名
查看数据卷是否挂载成功
docker inspect 容器id
测试容器与宿主机之间数据共享
容器中
宿主机中
【容器停止退出后,主机修改数据后依然会同步】
6.2.2 使用docker安装mysql
启动mysql容器
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
使用本机Navicat连接
【进行凡是涉及端口的操作时,一定得先设置服务器的防火墙】
6.2.3 通过Docker File添加数据卷
DockerFile 是用来构建Docker镜像的构建文件,是由一些列命令和参数构成的脚本。
1、在宿主机 /home 目录下新建一个 docker-test-volume文件夹
2、编写DockerFile文件
3、build后生成镜像,获得一个新镜像 dingjiaxiong/centos
4、启动容器
5、在数据卷中新建一个文件
6、查看下这个容器的信息
docker inspect 容器id
7、这个卷在主机对应的默认位置
6.3 匿名和具名挂载
6.3.1 匿名挂载
-v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx
# 匿名挂载的缺点,就是不好维护,通常使用命令 docker volume维护
docker volume ls
6.3.2 具名挂载
-v 卷名:/容器内路径
docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx nginx
# 查看挂载路径
docker volume inspect nginxconfig
【如何判断挂载的是卷名而不是本机目录名】
不是/开始就是卷名,是/开始就是目录名
6.3.3 改变文件的读取权限
# ro: readonly
# rw: readwrite
# 指定容器对我们挂载出来的内容的读写权限
docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx:rw nginx
6.4 数据卷容器
命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。
【容器间传递共享】
1、先启动一个父容器docker01,然后在dataVolumeContainer2新增文件
退出不停止:Ctrl + P + Q
创建docker02,docker03 让他们继承docker01
--volumes-from
3、回到docker01发现可以看到 02 和 03 添加的共享文件
4、删除docker01,docker02 修改后docker03还能不能访问
5、删除docker02 ,docker03还能不能访问
6、新建docker04继承docker03,然后再删除docker03,看下是否可以访问
【结论】
容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。
cker02 ,docker03还能不能访问