什么是容器数据卷
docker的理念回顾

使用数据卷
方式一:直接用命令挂载 -v
docker run -v 主机目录:容器目录#测试docker run -it -v /home/ceshi:/home centos /bin/bash#查看容器挂载情况docker inspect b5d89da9ec01

测试数据是否同步
容器退出后,修改主机的同步目录下的东西,一样可以同步到容器中
实战:安装MySQL
#获取镜像docker pull mysql:5.7#运行容器,需要数据挂载!#安装启动mysql,需要配置密码的,这是注意点#官方测试 docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag#启动并挂载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工具连接数据库#在本地连接的数据库上创建数据库和表,测试主机挂载的目录数据是否挂载成功
具名挂载和匿名挂载
#匿名挂载[root@wise ~]# docker run -d -P --name nginx01 -v /etc/nginx nginx #匿名挂载nginx01容器的/etc/nginx目录到本地8be0810dda8d944fd0824464540dbbe97e735016bef164017803e3988a56193a[root@wise ~]# docker volume ls #查看卷的信息(得到匿名卷名)DRIVER VOLUME NAMElocal 154a0daea7f7a93c7ebffe21e1213f892af8fa0eb1d870905eafa55e1c39a6aa#具名挂载[root@wise ~]# docker run -d -P --name nginx03 -v nginx03:/etc/nginx nginx #具名挂载nginx03容器/etc/nginx目录到本地(卷名nginx03)31fa291f376305dd950c10b34ed9689f4e2d1b989517a47f3face404eadaada0[root@wise ~]# docker volume ls #查看卷的信息(得到具名卷名)DRIVER VOLUME NAMElocal 5ff0c8f210b4e99fc60f6e74c8e11dd776de37cb3cb2e39011a675d4993bcda9local 154a0daea7f7a93c7ebffe21e1213f892af8fa0eb1d870905eafa55e1c39a6aalocal 515f03843e5682d8fef890885324596eecbe7c21f737fcdc936e19cc2469da01local nginx03 #具名卷名#通过 -v 卷名:容器内路径#查看卷挂载情况
所有docker容器的卷,没有指定主机路径的情况下,所有容器目录挂载在/var/lib/docker/volumes/xxx下
通过具名挂载方便找到我们的一个卷,大多数情况使用具名挂载
#匿名挂载 具名挂载 指定路径挂载-v 容器内路径 #匿名挂载-v 容器名:容器内路径 #具名挂载-v /宿主机路径:容器内路径 #指定路径挂载
拓展:
#通过 -v 容器内路径 ro rw 改变读写权限#ro read only 只读#rw readwrite 可读写#一旦设置了容器权限,容器对我们挂载出来的内容就有了限定!(对容器内容来说)docker run -d -P --name nginx03 -v nginx03:/etc/nginx:ro nginxdocker run -d -P --name nginx03 -v nginx03:/etc/nginx:rw nginx#ro 即容器内部不能对这个路径进行写操作,这个路径只能在宿主机上操作
初识Dockerfile
Dockerfile就是用来构建docker镜像的构建文件!命令脚本!
通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个命令,每个命令就是一层!
#[root@wise home]# lsceshi mysql wise[root@wise home]# mkdir docker-teat-volume #创建测试目录[root@wise home]# cd docker-teat-volume/[root@wise docker-teat-volume]# vim dockerfile #在测试目录下编辑dockerfile(镜像创建脚本)[root@wise docker-teat-volume]# cat dockerfileFROM centosVOLUME ["volume01","volume02"]CMD echo "-----end-------"CMD /bin/bash#docker build -f [docerfile文件目录] -t [生成的镜像名] . #最后的.注意[root@wise docker-teat-volume]# docker build -f dockerfile -t wise/centos . #利用镜像创建脚本创建镜像Sending build context to Docker daemon 2.048kBStep 1/4 : FROM centos---> 0d120b6ccaa8Step 2/4 : VOLUME ["volume01","volume02"]---> Running in 097824ceba71Removing intermediate container 097824ceba71---> 32fbbb6db1a7Step 3/4 : CMD echo "-----end-------"---> Running in 47ca999b5d93Removing intermediate container 47ca999b5d93---> d17fa7b9605cStep 4/4 : CMD /bin/bash---> Running in b9758e5f26e2Removing intermediate container b9758e5f26e2---> f3b2157173aeSuccessfully built f3b2157173aeSuccessfully tagged wise/centos:latest[root@wise docker-teat-volume]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEwise/centos latest f3b2157173ae 11 seconds ago 215MB #自己创建的镜像tomcat latest f796d3d2c195 30 hours ago 647MBnginx latest 7e4d58f0e5f3 6 days ago 133MBmysql 5.7 ef08065b0a30 6 days ago 448MBcentos latest 0d120b6ccaa8 5 weeks ago 215MB
#启动自己创建的镜像docker run -it f3b2157173ae /bin/bash

这个卷的目录和外部一定有个同步的目录
[root@wise ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES01fd9626dc99 f3b2157173ae "/bin/bash" 3 minutes ago Up 3 minutes priceless_pasteur[root@wise ~]# docker inspect 01fd9626dc99 #查看容器的挂载情况

测试一下刚才的文件是否同步出去
这种方式我们未来使用的十分多,因为我们通常会自己构建镜像!
假设构建镜像的时候没有挂载卷,要手动镜像挂载 -v 卷名:容器名
数据卷容器

多个mysql同步数据
#启动3个容器,通过我们自己刚才写的镜像启动#启动容器1并进入run -it --name docker01 wise/centos#启动容器2并用--volumes-from和容器1数据卷实现同步docker run -it --name docker02 --volumes-from docker01 wise/centos#启动容器2并用--volumes-from和容器1数据卷实现同步docker run -it --name docker03 --volumes-from docker01 wise/centos
测试:
#docker02和docker03都挂载了docker01的数据卷,所有如何删除容器docker01#测试发现docker02和docker03和宿主机直接的数据卷目录数据依然能正常双向绑定

我所理解的容器间的数据卷同步
注意
如果需要同步的目录时,容器中这个目录本来以后存在文件,则需要把这些文件先拷贝到宿主机对应的同步目录下,再使用挂载,否则容器内此目录的所有文件会被清空
