容器数据卷
什么是容器数据卷
如果数据都在容器中,容器被删除数据就会丢失!数据如何持久化?
当我们在使用Docker容器的时候,会产生一系列的数据文件,这些文件在我们关闭或删除Docker容器时是会消失的,但是其中产生的部分内容我们是希望能够把它给保存起来另做用途的,Docker将应用与运行环境打包成镜像发布,我们希望在运行过程中产生的部分数据是可以持久化的,而且容器之间我们希望能够实现数据共享。
通俗的讲,Docker容器数据卷可以看成是我们日常使用的U盘,它存在于一个或多个容器中,由Docker挂载到容器,大部属于联合文件系统,Docker不会在容器删除时删除其挂载的数据卷。
特点
- 数据卷可以再容器之间共享或重用数据
- 数据卷中的更改可以直接生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没用容器使用它为止
总结一句话:容器的持久化和同步操作!容器间数据共享
使用数据卷
方式一:直接使用命令来挂载 -v
# docker run -it -v -v 主机目录:容器目录
# 例子
# 此时宿主机home目录下是没有文件的
root@lsMusKVEqm:/home# pwd
/home
root@lsMusKVEqm:/home# ls
root@lsMusKVEqm:/home#
# 启动一个ubuntu,挂载到宿主机的home下
root@lsMusKVEqm:/home# docker run -it -v /home/ceshi:/home ubuntu /bin/bash
root@6c388f27c6f6:/#
# 此时再查看宿主机的home 已经存在这个测试目录了
root@lsMusKVEqm:/home# pwd
/home
root@lsMusKVEqm:/home# ls
ceshi
root@lsMusKVEqm:/home#
# 自己也可以在容器下新建文件试试
可以通过docker inspect 容器id 命令查看挂载情况
-
双向绑定!!!
-
好处:我们以后修改只需要在本地修改即可容器内会自动同步!
实战:安装MySQL
下载获取镜像
docker pull mysql
启动运行mysql
# -d 后台运行
# -p 端口映射
# -v 数据卷挂载
# -e 环境配置
# --name 容器名字
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=123456a --name=mysql001 mysql
root@lsMusKVEqm:~# 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=123456a --name=mysql001 mysql
67207483ad2cd651e1c4255d4bdf82593c0b7b6f43a315ad367eb89e455ba2be
root@lsMusKVEqm:~#
- 用Navicat 链接测试
- 查看数据挂载情况
- 在本地新建数据库test001
- 在服务器端查看
具名挂载和匿名挂载
匿名挂载
不用写主机内路径,会自动生成 -v 容器内路径
具名挂载
-v 卷名:容器内路径
通过创建Dockerfile挂载数据卷
编写自己的Dockerfile
FROM ubuntu
VOLUME ["volume01", "volume02"]
CMD /bin/bash
通过docker build生成自己的镜像
# 命令
docker build -f dockerfile01 -t ubuntu_gyj:1.0.0 .
# -f dockerfile01 表示:dockerfile文件路径
# -t ubuntu_gyj:1.0.0 表示:生成对象的名字:版本号
# . 表示:生成的路径
启动容器
会发现此时多了两个挂载的目录
查看具体挂载信息
docker inspect 2e19ec2cba75
数据卷容器同步
关键词
--volumes-from
启动三个ubuntu
root@lsMusKVEqm:/home/docker-test-volume# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu_gyj 1.0.0 34b8c8654510 53 minutes ago 72.8MB
tomcat_gyj 1.0.0 8ee67166756f 3 days ago 680MB
tomcat latest fb5657adc892 11 days ago 680MB
nginx latest f6987c8d6ed5 13 days ago 141MB
mysql latest 3218b38490ce 13 days ago 516MB
ubuntu latest ba6acccedd29 2 months ago 72.8MB
root@lsMusKVEqm:/home/docker-test-volume# docker run -d -it --name ubuntu01 34b8c8654510
a934a097cfe1ca91f6cb88177ff310c2a7d298ae36e4c2f9306e6c09b3bbc625
root@lsMusKVEqm:/home/docker-test-volume#
root@lsMusKVEqm:/home/docker-test-volume#
root@lsMusKVEqm:/home/docker-test-volume# docker run -d -it --name ubuntu02 --volumes-from ubuntu01 34b8c8654510
15dde987905310523491c07f2cfb4b26bc97804844abddcd3acc2cc37a117b55
root@lsMusKVEqm:/home/docker-test-volume# docker run -d -it --name ubuntu03 --volumes-from ubuntu01 34b8c8654510
68ed7f895e5ab784a699ddace75f7a4b39306e90fdb0694b7fe0cdc789fc4a79
root@lsMusKVEqm:/home/docker-test-volume# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
68ed7f895e5a 34b8c8654510 "/bin/sh -c /bin/bash" 4 seconds ago Up 3 seconds ubuntu03
15dde9879053 34b8c8654510 "/bin/sh -c /bin/bash" 16 seconds ago Up 14 seconds ubuntu02
a934a097cfe1 34b8c8654510 "/bin/sh -c /bin/bash" About a minute ago Up About a minute ubuntu01
root@lsMusKVEqm:/home/docker-test-volume#
测试
# 进入ubuntu01
root@lsMusKVEqm:/home/docker-test-volume# docker exec -it a934a097cfe1 /bin/bash
root@9f5a85b196b5:/# ls
bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var volume01 volume02
root@9f5a85b196b5:/#
# 创建一个测试文件
root@a934a097cfe1:/# cd volume01
root@a934a097cfe1:/volume01# ls
root@a934a097cfe1:/volume01# touch test001.txt
root@a934a097cfe1:/volume01# ls
test001.txt
root@a934a097cfe1:/volume01#
# 进入ubuntu02 进行查看
root@lsMusKVEqm:/home/docker-test-volume# docker exec -it 15dde9879053 /bin/bash
root@15dde9879053:/# cd volume01
root@15dde9879053:/volume01# ls
test001.txt
root@15dde9879053:/volume01#
# 同样存在改文件,ubuntu03也类似,此时三个容器之间就能进行数据同步了
root@lsMusKVEqm:/home/docker-test-volume# docker exec -it 68ed7f895e5a /bin/bash
root@68ed7f895e5a:/# cd volume01
root@68ed7f895e5a:/volume01# ls
test001.txt
root@68ed7f895e5a:/volume01#