Docker容器运行时产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来, 那么当容器删除后,数据自然也就没有了。例如:容器中部署了MYSQL数据库,如果有一天将部署MySQL数据库的容器删除了,存放的数据也就丢失。为了能保存数据在Docker中我们使用卷来实现容器内数据与我们指定的目录文件同步,当某一方数据发生修改时,另一方也随之改变。
因此,容器的持久化和同步操作!容器间数据也是可以共享的!
方式一:使用命令进行挂载数据 -v
docker run -it -v 主机目录:容器内目录
测试一下:
将主机/home/ceshi
与容器中的/home
目录进行绑定
查看当前容器的详细信息:docker inspect 容器ID
① 在容器内创建了一个test.java文件
,自动同步到了主机内:
② 在主机内创建了一个haha.java
然后自动同步到容器内:
③ 退出容器,此时容器停止运行
修改主机上的test.java
文件,添加如下内容
重新启动容器
查看容器中的test.java
文件,发现数据依然同步成功!
这时就实现了主机与容器数据的同步和共享!!
① 拉取MySQL镜像到本地
② 运行容器挂载数据
docker run -d -p 3306: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
③ 启动成功,使用数据库连接工具进行连接
连接成功
④ 查看本地主机,数据挂载成功
⑤ 使用数据库连接工具创建数据库
主机数据同步成功
⑥ 测试删除容器,数据是否存在
数据依旧存在:
MySQL数据本地持久化测试成功!!
匿名挂载
-v 容器内路径 (不指定主机名,只指定容器内路径)
docker run -d -P --name nginxtest -v /etc/nginx nginx
查看所有 volume 信息
docker volume ls
在之前只指定容器内路径,没有写容器外路径,这就是匿名数据卷,类似于上图的格式。
具名挂载
-v 卷名:容器内路径
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
查看数据卷具体的位置
docker volume inspect 名称
Docker中所有的数据卷,如果没有指定目录的情况下,都在/var/lib/docker/volumes/
目录下。
如何确定是具名挂载、匿名挂载、指定路径挂载
-v 容器内路径 匿名挂载 -v 卷名:容器内路径 具名挂载 -v /主机路径:容器内路径 指定路径挂载
拓展
通过 -v 容器内路径:ro ( rw ) 改变读写权限 ro readonly 只读 rw readwrite 可读可写 一旦设置容器权限,容器对挂载出的内容就有限定
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
方式二:Dockerfile挂载数据卷
Dockerfile就是用来构建docke镜像的构建文件,是一段命令脚本,通过脚本可以生成镜像,镜像是一层一层的,脚本是一行一行的命令,每个命令都是一层!!
① 编写dockerfile
脚本 (指令都是大写)
FROM centos
VOLUME ["volume1","volume2"]
CMD echo "-----end-----"
CMD /bin/bash
② 构建镜像
docker build -f dockerfile全路径 -t 镜像名称 .
构建成功,生成镜像
③ 启动容器
docker run -it 8eb8e022a7af /bin/bash
生成的数据卷与外部一定有一个同步的目录。
在容器中创建一个文件`container.txt
查看数据卷挂载的路径:
查看在容器中创建的 文件是否同步到主机
发现数据同步成功!!
容器和容器之间的数据进行同步!
① 启动3个容器 启动docker01
启动docker02
② 在docker01中volume1目录下创建docker01文件
③ 查看docker02中volume1目录下是否存在docker01文件
docker01中的数据挂载到了docker02上,实现数据同步,docker01叫做数据卷容器!
④ 启动docker03容器挂载docker01
⑤ 在docker03中创建数据,在docker01中查看也是存在的。
⑥ 删除docker01容器,数据依旧可以访问!
⑦ 多个mysql实现数据共享
docker run -d -p 3306:3306 -v /etc/mysql/conf.d
-v /var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456
--name mysql01 mysql:5.7
docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d
-v /home/mysql/data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456
--name mysql02 --volumes-from mysql01 mysql:5.7
-v
命令。2.使用Dockerfile构建镜像,自动挂载数据。3.使用--volumes-from
实现容器之间的数据共享,数据同步