容器数据卷
docker的理念是应用和环境包打包城镜像.
那么如果数据在容器中,容器被删除跑路,就嗝屁了,所以数据可以持久化的存储在容器外部
容器数据卷就可以让容器之间有一个数据共享技术.把docker容器产生的数据同步到本地.
注意这个本地是的是操作系统linux不是docker.这是个目录挂载技术,把我们容器内的目录挂载到linux上
使用数据卷,就会把mysql容器内下的/user/mysql数据同步到linux下的/home/mysql中
实现容器之间数据共享以及同步操作
-
方式1 使用命令挂载 -v
docker run -it -v 主机目录:容器内目录
docker run -it --name centos01 -v /home/ceshi:/home centos /bin/bash
此时我们随意在容器内部增删文件夹和文件,在外部镜像的/home/ceshi中就可以看到响应的变动
当容器关闭的时候,我们在主机内对文件进行数据写入,容器在重启后一样会更新,双向更新
-
安装实战 mysql
运行mysql,需要配置root的账号密码(查看dockerhub的官方文档)
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
我们配置挂载
docker run -d -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql03 mysql:5.7
用navicat什么的可以尝试连接下端口并创建一个数据库看是否有同步挂载
具名挂载和匿名挂载
匿名挂载
-v 容器内路径
不指定主机路径,让他随机生成
docker run -d -P --name tomcat01 -v /ect/nginx nginx
查看所有的volume
$ docker volume --help
Usage: docker volume COMMAND
Manage volumes
Commands:
create Create a volume
inspect Display detailed information on one or more volumes
ls List volumes
prune Remove all unused local volumes
rm Remove one or more volumes
匿名挂载格式如下
具名挂载
可以看到匿名会随机生成一大串字符串,不利于后期查找和识别
我们可以给匿名挂载生成的匿名挂载自定义名字,这里注意 /zidingyi:/ect/nginx 如果是/zidingyi 代表的是路径,没有反斜杠代表起别名.
docker run -d -P --name tomcat02 -v zidingyi:/ect/nginx nginx
用docker volume inspect命令查看这个自定义的卷名路径在哪里
例:docker volume inspect zidingyi
挂载语法格式一共有4种匿名挂载 -v 容器内路径
具名挂载 -v 具名/容器内路径
在上述三种路径后面加:rw或者:ro 例:具名挂载 -v 具名/容器内路径:ro ,ro是read only,rw是read write,指定权限
指定路径挂载 -v /本机路径:/容器内路径
-
方式2 使用dockerfile命令方式挂载
- 首先随便创建一个文件夹和名字,这里我们在创建一个/home/myvolume/dockerfile1 建议文件名用dockerfile
脚本命令如下: 指令都是大写
FROM mysql #填写基于哪个镜像
VOLUME ["/volume01","/volume02"] #同-v 容器内路径 ,是一种匿名挂载方式
CMD echo"---end----" #输出end
CMD /bin/bash #切回交互界面 - docker build 命令用来创建生成dock file
docker build -f dockerfile的文件路径 -t 镜像名字:tag
docker build -f /home/myvolume/dockfile1 -t sxf/mysql:1.0 . 最后一点要加个空格和点
- 启动下自己的容器镜像
镜像进去后 ls -l 查看当前目录文件,发现下面2个挂载目录,这2个目录一定和本地有对应的同步目录
我们在这2个目录下分别创建111,222文件夹,然后去本地用docker inspect 容器id
查找是否有同步更新的文件夹位置
注意这里查找的是镜像ID 不是容器ID
容器数据卷2
容器数据卷上面讲的是容器内和本地系统数据共享.这里举得例子是容器和容器之间的数据共享.
容器1 --volumes-from 容器2 这里容器2是父容器, 容器1是子容器,继承关系.容器之间数据共享,只要有一个容器在使用共享数据,其他容器停止或者删除都不会对正在使用共享数据的容器产生影响.
每个容器的共享数据是相互拷贝的概念,而不是单独存在某一个容器中的.
首先拿下载的centos镜像为例,我们先创建一个容器docker run --name centos01 -v /home/pc_data:/home/container_data -it centos:7.6.1810 /bin/bash
创建了一个镜像和本机的数据卷.接下来我们再开一个镜像,命名为centos02docker run -it --name docker02 --volumes-from centos01 centos:7.6.1810
这里因为centos01已经创建了,我们只是用--volumes-from 完全拷贝他而已,所以-v的那些数据卷路径不用重复
语法格式 docker run -it --name docker02 --volumes-from 父容器id 镜像名:tag
例2: 我们现在创建一个多个数据库共享数据的案例
第一台mysql创建docker run --name mysql01 -e MYSQL_ROOT_PASSWORD=root -d mysql:tag -p 8080:3306 -v /etc/mysql:/home/mysql_data mysql:5.7
第二胎mysql创建docker run --name mysql02 -e MYSQL_ROOT_PASSWORD=root -d -p 8080:3307 --volumes-from mysql01 mysql:5.7
docker file
docker file 就是通过命令,脚本用来构建docker镜像的构建文件