【Docker】七、Docker容器数据卷

197 阅读5分钟

容器数据卷

什么是容器数据卷

如果数据都在容器中,容器被删除数据就会丢失!数据如何持久化?

当我们在使用Docker容器的时候,会产生一系列的数据文件,这些文件在我们关闭或删除Docker容器时是会消失的,但是其中产生的部分内容我们是希望能够把它给保存起来另做用途的,Docker将应用与运行环境打包成镜像发布,我们希望在运行过程中产生的部分数据是可以持久化的,而且容器之间我们希望能够实现数据共享。

通俗的讲,Docker容器数据卷可以看成是我们日常使用的U盘,它存在于一个或多个容器中,由Docker挂载到容器,大部属于联合文件系统,Docker不会在容器删除时删除其挂载的数据卷。

特点

  1. 数据卷可以再容器之间共享或重用数据
  2. 数据卷中的更改可以直接生效
  3. 数据卷中的更改不会包含在镜像的更新中
  4. 数据卷的生命周期一直持续到没用容器使用它为止

总结一句话:容器的持久化和同步操作!容器间数据共享

使用数据卷

方式一:直接使用命令来挂载 -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# 

# 自己也可以在容器下新建文件试试

image.png

image.png

可以通过docker inspect 容器id 命令查看挂载情况

image.png

image.png

  • 双向绑定!!!

  • 好处:我们以后修改只需要在本地修改即可容器内会自动同步!

实战:安装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 链接测试

image.png

  • 查看数据挂载情况

image.png

  • 在本地新建数据库test001

image.png

  • 在服务器端查看

image.png

具名挂载和匿名挂载

匿名挂载

不用写主机内路径,会自动生成 -v 容器内路径

具名挂载

-v 卷名:容器内路径

通过创建Dockerfile挂载数据卷

编写自己的Dockerfile

FROM ubuntu

VOLUME ["volume01", "volume02"]

CMD /bin/bash

image.png

通过docker build生成自己的镜像

# 命令
docker build -f dockerfile01 -t ubuntu_gyj:1.0.0 .

# -f dockerfile01      表示:dockerfile文件路径
# -t ubuntu_gyj:1.0.0  表示:生成对象的名字:版本号
# .                    表示:生成的路径

image.png

启动容器

image.png 会发现此时多了两个挂载的目录

查看具体挂载信息

docker inspect 2e19ec2cba75

image.png

数据卷容器同步

关键词--volumes-from

image.png

启动三个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#