香港云主机最佳企业级服务商!

ADSL拨号VPS包含了中国大陆(联通,移动,电信,)

中国香港,国外拨号VPS。

当前位置:云主机 > 服务器资讯 >

电信ADSL拨号VPS
联通ADSL拨号VPS
移动ADSL拨号VPS

Docker容器数据卷原理及使用方法解析


时间:2020-10-27 10:57 作者:admin


什么是容器数据卷

如果数据都在容器中,一旦容器删除,数据就会丢失!

eg : mysql/' target='_blank'>mysql容器删了,就是我们常说的删库跑路。 需求:数据可以持久化,即时删掉容器,我们的数据还在
容器直接可以有一个数据共享的技术!Docker容器产生的数据,同步到本地!

这就是卷技术!目录的挂载,将我们容器的目录挂载到linux上面!

总结:卷技术就是为了实现数据的持久化和同步操作,容器间也是可以数据共享的

使用数据卷

方式一:直接使用命令来挂载 -v

# 命令docker run -it -v 主机的目录:容器内目录 -p 主机端口:容器端口# 测试# 主机home目录下为空[root@bogon home]# ls# 启动contes镜像 将主机的home与容器的home进行绑定[root@bogon home]# docker run -v /home:/home/ -it centos [root@8dc073caf39c /]# cd home/# 容器home目录下为空[root@8dc073caf39c home]# ls# 在容器目录下创建test.java文件[root@8dc073caf39c home]# touch test.java[root@8dc073caf39c home]# lstest.java# 切换到主机home目录后发现 出现了test.java文件 [root@8dc073caf39c home]# [root@bogon home]# lstest.java# 在主机home目录下创建test2.java文件[root@bogon home]# touch test2.java[root@bogon home]# lstest2.java test.java[root@bogon home]# docker psCONTAINER ID   IMAGE     COMMAND       CREATED       STATUS       PORTS        NAMES8dc073caf39c   centos    "/bin/bash"     3 minutes ago    Up 3 minutes              focused_nobel# 进入正在运行的容器 [root@bogon home]# docker exec -it 8dc073caf39c /bin/bash# 进入容器home目录[root@8dc073caf39c /]# cd home/# 发现存在test2.java文件[root@8dc073caf39c home]# lstest.java test2.java# 通过 inspect 命令查看容器信息[root@bogon home]# docker inspect 8dc073caf39c    "Mounts": [      {        "Type": "bind",        "Source": "/home",# 主机目录        "Destination": "/home",# 容器目录        "Mode": "",        "RW": true,        "Propagation": "rprivate"      }    ],## 结论:如果我们使用 -v 做了数据绑定  # 1、容器停止,主机对数据做出修改 容器启动后 数据也会同步过来  # 2、删除容器,主机该目录下数据还存在  ## 好处:在使用了数据卷后,我们以后修改配置文件时,只需要在本地修改,容器内会自动同步

安装MySQL

mysql的数据持久化问题

   # -e MYSQL_ROOT_PASSWORD=my-secret-pw 设置初始密码为my-secret-pw# 官方命令:docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag# 测试# 解读# -d后台运行# -p 3306:3306绑定端口  # -v /home/mysql/conf:/etc/mysql/conf.d 数据卷挂载技术绑定mysql配置文件  # -v /home/mysql/data:/var/lib/mysql数据卷挂载技术绑定mysql数据  # -e MYSQL_ROOT_PASSWORD=123456环境配置---》设置mysql初始密码为123456  # --name mysql0给容器起名为mysql01[root@bogon home]# 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 mysql6d75b6312f725de2c71709116af5755604ea60cd073f1daf3755c578c1e64f57

具名和匿名挂载

# 匿名挂载-v 容器内路径!docker run -d -P --name nginx01 -v /etc/nginx nginx # 具名挂载-v 卷名:容器内路径docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx# 测试匿名挂载[root@localhost test]# docker run -d -P --name nginx01 -v /etc/nginx nginx214dab398d9997a730b970b6e3bb08fa7e39bbb0ca91ad59f6b3f235d8f1b9bc# 查看所有 volume 的情况[root@localhost test]# docker volume lsDRIVER       VOLUME NAMElocal        2c22e1c50ff7330b815b692f8f71a1fca878209223846c95626f7efd9dc2a83b# 匿名挂载# 测试具名挂载# 通过 -v 卷名:容器内路径[root@localhost test]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginxa678d79886565601bf466ff41734cb5334bdaf9e881b9cbf11edb84e9d790251# 查看所有 volume 的情况[root@localhost test]# docker volume lsDRIVER       VOLUME NAMElocal        2c22e1c50ff7330b815b692f8f71a1fca878209223846c95626f7efd9dc2a83b# 匿名挂载local        juming-nginx# 具名挂载# 查看某个数据卷的信息# 命令docker volume inspect 卷名# 所有docker容器内的卷 在没有指定目录的情况下都在 /var/lib/docker/volumes/XXX/_data[root@localhost test]# docker volume inspect juming-nginx[  {    "CreatedAt": "2020-08-13T09:18:34+08:00",    "Driver": "local",    "Labels": null,    "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",    "Name": "juming-nginx",    "Options": null,    "Scope": "local"  }]# 我们通过具名挂载可以方便的找到我们的一个卷,大多数情况在使用的----具名挂载# 如何确定是具名挂载还是匿名挂载 还是指定路径挂载!# -v 容器内路径 # 匿名挂载# -v 卷名:容器内路径# 具名挂载# -v 主机路径:容器内路径  # 指定路径挂载

拓展

# 通过 -v 卷名:容器内路径:ro rw 改变读写权限# ro--->read only只读# rw--->read write读写docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx:ro nginxdocker run -d -P --name nginx01 -v juming-nginx:/etc/nginx:ro nginx

初识DockerFile

DockerFile就是用来构建 docker 镜像的构建文件!命令脚本! 先体验一下!

[root@localhost docker-test-volume]# cat dockerfile FORM centosVOLUME ["volume01", "volume02"]CMD echo "-----end-----"CMD /bin/bash# 构建# 命令docker build -f shell脚本文件 -t 镜像名:版本号[root@localhost docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile1 -t centos:1.0 .Sending build context to Docker daemon 2.048kBStep 1/4 : FROM centos ---> 0d120b6ccaa8Step 2/4 : VOLUME ["volume01", "volume02"] ---> Running in 4e6de7bc2f15Removing intermediate container 4e6de7bc2f15 ---> f9e48207902bStep 3/4 : CMD echo "-----end-----" ---> Running in b22adea363e5Removing intermediate container b22adea363e5 ---> a7518e2e1c72Step 4/4 : CMD /bin/bash ---> Running in ae1b746bef6bRemoving intermediate container ae1b746bef6b ---> d840628c30a9Successfully built d840628c30a9Successfully tagged centos:1.0# 查看镜像[root@localhost overlay2]# docker imagesREPOSITORY      TAG         IMAGE ID      CREATED       SIZEcentos        1.0         d840628c30a9    12 minutes ago   215MB# 我们自己生成的镜像centos        latest       0d120b6ccaa8    2 days ago     215MB# 启动我们生成的镜像[root@1af673cf9c88 /]# docker run -it d840628c30a9 /bin/bash[root@1af673cf9c88 /]# ls -ltotal 0lrwxrwxrwx.  1 root root  7 May 11 2019 bin -> usr/bindrwxr-xr-x.  5 root root 360 Aug 13 02:18 devdrwxr-xr-x.  1 root root 66 Aug 13 02:18 etcdrwxr-xr-x.  2 root root  6 May 11 2019 homelrwxrwxrwx.  1 root root  7 May 11 2019 lib -> usr/liblrwxrwxrwx.  1 root root  9 May 11 2019 lib64 -> usr/lib64drwx------.  2 root root  6 Aug 9 21:40 lost+founddrwxr-xr-x.  2 root root  6 May 11 2019 mediadrwxr-xr-x.  2 root root  6 May 11 2019 mntdrwxr-xr-x.  2 root root  6 May 11 2019 optdr-xr-xr-x. 117 root root  0 Aug 13 02:18 procdr-xr-x---.  2 root root 162 Aug 9 21:40 rootdrwxr-xr-x. 11 root root 163 Aug 9 21:40 runlrwxrwxrwx.  1 root root  8 May 11 2019 sbin -> usr/sbindrwxr-xr-x.  2 root root  6 May 11 2019 srvdr-xr-xr-x. 13 root root  0 Aug 11 09:58 sysdrwxrwxrwt.  7 root root 145 Aug 9 21:40 tmpdrwxr-xr-x. 12 root root 144 Aug 9 21:40 usrdrwxr-xr-x. 20 root root 262 Aug 9 21:40 vardrwxr-xr-x.  2 root root  6 Aug 13 02:18 volume01# 这是我们生成镜像的时候自动挂载的数据卷目录drwxr-xr-x.  2 root root  6 Aug 13 02:18 volume02# 这个卷和外部一定有一个同步的目录!我们来找一下# 1、 根据容器id查询该容器的信息--》数据卷信息# docker inspect 1af673cf9c88# 2、 根据数据卷信息找到 volume01 对应的数据卷名称# docker volume inspect 8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3# 3、 根据数据卷名称 查询数据卷的信息--》找到linux中对应的目录# docker volume inspect 8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3# 在容器内部创建一个文件在数据卷 volume01 中创建了test.java文件[root@1af673cf9c88 volume01]# touch test.java[root@1af673cf9c88 volume01]# lstest.java# 退出容器[root@1af673cf9c88 volume01]# exitexit# 查看该容器的信息[root@localhost overlay2]# docker inspect 1af673cf9c88# 找到挂载卷 volume01 对应的的名字, 即:8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3    "Mounts": [      {        "Type": "volume",        "Name": "8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3",        "Source": "/var/lib/docker/volumes/8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3/_data",        "Destination": "volume01",        "Driver": "local",        "Mode": "",        "RW": true,        "Propagation": ""      },      {        "Type": "volume",        "Name": "046d0baa3cc0bc3540c5e7248808358371641bfba4e0bbd139c99fe851751da2",        "Source": "/var/lib/docker/volumes/046d0baa3cc0bc3540c5e7248808358371641bfba4e0bbd139c99fe851751da2/_data",        "Destination": "volume02",        "Driver": "local",        "Mode": "",        "RW": true,        "Propagation": ""      }    ],# 根据数据卷名字 8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3 找到该卷在 linux 所在位置[root@localhost overlay2]# docker volume inspect 8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3[  {    "CreatedAt": "2020-08-13T10:27:12+08:00",    "Driver": "local",    "Labels": null,    "Mountpoint": "/var/lib/docker/volumes/8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3/_data",    "Name": "8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3",    "Options": null,    "Scope": "local"  }]# 在/var/lib/docker/volumes/8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3/_data/目录下找到我们的test.java文件[root@localhost volumes]# cd /var/lib/docker/volumes/8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3/_data/[root@localhost _data]# lstest.java

数据卷容器

多个mysql数据同步!

# 通过 --volumes-from 容器名 实现容器间的数据共享# 启动一个镜像 名字是docker01[root@localhost _data]# docker run -it --name docker01 centos:1.0 /bin/bash[root@a85fbed0ebc9 /]# lsbin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume01volume02# 启动同一个镜像 名字是docker02关联docker01 此时,docker01被称为数据卷容器[root@localhost _data]# docker run -it --name docker02 --volumes-from docker01 centos:1.0[root@a89fb82eeeb5 /]# lsbin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume01volume02# 在容器 docker02 的 volume01 目录下创建 test.txt [root@a89fb82eeeb5 /]# cd volume01/[root@a89fb82eeeb5 volume01]# ls[root@a89fb82eeeb5 volume01]# touch test.txt [root@a89fb82eeeb5 volume01]# lstest.txt# 查看容器信息[root@a89fb82eeeb5 volume01]# [root@localhost _data]# docker psCONTAINER ID  IMAGE      COMMAND         CREATED       STATUS       PORTS        NAMESa89fb82eeeb5  centos:1.0  "/bin/sh -c /bin/bash"  About a minute ago  Up About a minute            docker02a85fbed0ebc9  centos:1.0  "/bin/bash"       4 minutes ago    Up 4 minutes              docker01# 进入容器名为 docker01 的容器[root@localhost _data]# docker exec -it a85fbed0ebc9 /bin/bash[root@a85fbed0ebc9 /]# lsbin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume01volume02# 进入该容器的 volume01 目录下[root@a85fbed0ebc9 /]# cd volume01/# 发现test.txt文件[root@a85fbed0ebc9 volume01]# lstest.txt# 创建 test01.txt[root@a85fbed0ebc9 volume01]# touch test01.txt[root@a85fbed0ebc9 volume01]# lstest.txt test01.txt# 进入容器名为 docker02 的容器[root@localhost _data]# docker exec -it a89fb82eeeb5 /bin/bash[root@a89fb82eeeb5 /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume01volume02[root@a89fb82eeeb5 /]# cd volume01/# 发现test01.txt文件[root@a89fb82eeeb5 volume01]# lstest.txt test01.txt# 启动同一个镜像 名字是docker03关联docker01[root@localhost _data]# docker run -it --name docker03 --volumes-from docker01 centos:1.0# 进入volume01目录下 发现 test.txt test01.txt 文件[root@11d93f9bcd89 /]# cd volume01/[root@11d93f9bcd89 volume01]# lstest.txt test01.txt#测试过程: 1、运行centos:1.0镜像 容器名为docker01#2、运行centos:1.0镜像 容器名为docker02 通过 --volumes-from docker01 与其进行数据共享#3、运行centos:1.0镜像 容器名为docker03 通过 --volumes-from docker01 与其进行数据共享#4、运行centos:1.0镜像 容器名为docker04 通过 --volumes-from docker03 与其进行数据共享#5、运行centos镜像 容器名为docker05 通过 --volumes-from docker03 与其进行数据共享# 经过测试 发现:#1、在任何一个容器的volume01目录中添加文件,其他四个容器中的该目录都会出现添加的这个文件,进行数据共享#2、停止并删除 容器名为docker01的容器,其他四个容器中volume01目录下的文件还存在#3、停止并删除 容器名为docker01的容器,向其他四个容器任意一个容器的volume01目录下添加文件,其余三个容器也会做数据共享#4、各个容器中的数据卷名称不同,但是对应同一个linux系统中数据目录;即各个容器中的数据卷目录都指向linux系统中同一个数据目录[root@localhost _data]# docker psCONTAINER ID   IMAGE      COMMAND         CREATED       STATUS      PORTS     NAMES78cd51a35c41   centos     "/bin/bash"       17 minutes ago   Up 17 minutes          trusting_tharpe6e0988c50cd   centos     "/bin/bash"       17 minutes ago   Up 17 minutes          docker05c5ebc03e6819   centos:1.0   "/bin/sh -c /bin/bash"  19 minutes ago   Up 19 minutes          docker0411d93f9bcd89   centos:1.0   "/bin/sh -c /bin/bash"  22 minutes ago   Up 22 minutes          docker03a89fb82eeeb5   centos:1.0   "/bin/sh -c /bin/bash"  31 minutes ago   Up 31 minutes          docker02[root@localhost _data]# docker inspect e6e0988c50cd    "Mounts": [      {        "Type": "volume",        "Name": "fc54c991eea888057575be45a03fe22a32303a6b1239a0a4099dd201b0b41a62",        "Source": "/var/lib/docker/volumes/fc54c991eea888057575be45a03fe22a32303a6b1239a0a4099dd201b0b41a62/_data",        "Destination": "volume01",        "Driver": "local",        "Mode": "",        "RW": true,        "Propagation": ""      },][root@localhost _data]# docker inspect c5ebc03e6819    "Mounts": [      {        "Type": "volume",        "Name": "fc54c991eea888057575be45a03fe22a32303a6b1239a0a4099dd201b0b41a62",        "Source": "/var/lib/docker/volumes/fc54c991eea888057575be45a03fe22a32303a6b1239a0a4099dd201b0b41a62/_data",        "Destination": "volume01",        "Driver": "local",        "Mode": "",        "RW": true,        "Propagation": ""      },][root@localhost _data]# docker inspect 11d93f9bcd89    "Mounts": [      {        "Type": "volume",        "Name": "fc54c991eea888057575be45a03fe22a32303a6b1239a0a4099dd201b0b41a62",        "Source": "/var/lib/docker/volumes/fc54c991eea888057575be45a03fe22a32303a6b1239a0a4099dd201b0b41a62/_data",        "Destination": "volume01",        "Driver": "local",        "Mode": "",        "RW": true,        "Propagation": ""      },]

多个mysql实现数据共享

docker run -d -p 3306:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql

结论:

容器之间配置信息传递,数据卷容器的生命周期一直持续到没有容器使用位置。

但是一旦持久化到本地,这个时候,本地的数据不会删除。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

(责任编辑:admin)






帮助中心
会员注册
找回密码
新闻中心
快捷通道
域名登录面板
虚机登录面板
云主机登录面板
关于我们
关于我们
联系我们
联系方式

售前咨询:17830004266(重庆移动)

企业QQ:383546523

《中华人民共和国工业和信息化部》 编号:ICP备00012341号

Copyright © 2002 -2018 香港云主机 版权所有
声明:香港云主机品牌标志、品牌吉祥物均已注册商标,版权所有,窃用必究

云官方微信

在线客服

  • 企业QQ: 点击这里给我发消息
  • 技术支持:383546523

  • 公司总台电话:17830004266(重庆移动)
  • 售前咨询热线:17830004266(重庆移动)