什么是容器数据卷

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

eg : 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]# ls

test.java

# 切换到主机home目录后发现 出现了test.java文件

[root@8dc073caf39c home]# [root@bogon home]# ls

test.java

# 在主机home目录下创建test2.java文件

[root@bogon home]# touch test2.java

[root@bogon home]# ls

test2.java test.java

[root@bogon home]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

8dc073caf39c 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]# ls

test.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 mysql

6d75b6312f725de2c71709116af5755604ea60cd073f1daf3755c578c1e64f57

具名和匿名挂载

# 匿名挂载

-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 nginx

214dab398d9997a730b970b6e3bb08fa7e39bbb0ca91ad59f6b3f235d8f1b9bc

# 查看所有 volume 的情况

[root@localhost test]# docker volume ls

DRIVER VOLUME NAME

local 2c22e1c50ff7330b815b692f8f71a1fca878209223846c95626f7efd9dc2a83b# 匿名挂载

# 测试具名挂载

# 通过 -v 卷名:容器内路径

[root@localhost test]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx

a678d79886565601bf466ff41734cb5334bdaf9e881b9cbf11edb84e9d790251

# 查看所有 volume 的情况

[root@localhost test]# docker volume ls

DRIVER VOLUME NAME

local 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 nginx

docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx:ro nginx

初识DockerFile

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

[root@localhost docker-test-volume]# cat dockerfile

FORM centos

VOLUME ["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.048kB

Step 1/4 : FROM centos

---> 0d120b6ccaa8

Step 2/4 : VOLUME ["volume01", "volume02"]

---> Running in 4e6de7bc2f15

Removing intermediate container 4e6de7bc2f15

---> f9e48207902b

Step 3/4 : CMD echo "-----end-----"

---> Running in b22adea363e5

Removing intermediate container b22adea363e5

---> a7518e2e1c72

Step 4/4 : CMD /bin/bash

---> Running in ae1b746bef6b

Removing intermediate container ae1b746bef6b

---> d840628c30a9

Successfully built d840628c30a9

Successfully tagged centos:1.0

# 查看镜像

[root@localhost overlay2]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

centos 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 -l

total 0

lrwxrwxrwx. 1 root root 7 May 11 2019 bin -> usr/bin

drwxr-xr-x. 5 root root 360 Aug 13 02:18 dev

drwxr-xr-x. 1 root root 66 Aug 13 02:18 etc

drwxr-xr-x. 2 root root 6 May 11 2019 home

lrwxrwxrwx. 1 root root 7 May 11 2019 lib -> usr/lib

lrwxrwxrwx. 1 root root 9 May 11 2019 lib64 -> usr/lib64

drwx------. 2 root root 6 Aug 9 21:40 lost+found

drwxr-xr-x. 2 root root 6 May 11 2019 media

drwxr-xr-x. 2 root root 6 May 11 2019 mnt

drwxr-xr-x. 2 root root 6 May 11 2019 opt

dr-xr-xr-x. 117 root root 0 Aug 13 02:18 proc

dr-xr-x---. 2 root root 162 Aug 9 21:40 root

drwxr-xr-x. 11 root root 163 Aug 9 21:40 run

lrwxrwxrwx. 1 root root 8 May 11 2019 sbin -> usr/sbin

drwxr-xr-x. 2 root root 6 May 11 2019 srv

dr-xr-xr-x. 13 root root 0 Aug 11 09:58 sys

drwxrwxrwt. 7 root root 145 Aug 9 21:40 tmp

drwxr-xr-x. 12 root root 144 Aug 9 21:40 usr

drwxr-xr-x. 20 root root 262 Aug 9 21:40 var

drwxr-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]# ls

test.java

# 退出容器

[root@1af673cf9c88 volume01]# exit

exit

# 查看该容器的信息

[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]# ls

test.java

数据卷容器

多个mysql数据同步!

# 通过 --volumes-from 容器名 实现容器间的数据共享

# 启动一个镜像 名字是docker01

[root@localhost _data]# docker run -it --name docker01 centos:1.0 /bin/bash

[root@a85fbed0ebc9 /]# ls

bin 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 /]# ls

bin 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]# ls

test.txt

# 查看容器信息

[root@a89fb82eeeb5 volume01]# [root@localhost _data]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

a89fb82eeeb5 centos:1.0 "/bin/sh -c /bin/bash" About a minute ago Up About a minute docker02

a85fbed0ebc9 centos:1.0 "/bin/bash" 4 minutes ago Up 4 minutes docker01

# 进入容器名为 docker01 的容器

[root@localhost _data]# docker exec -it a85fbed0ebc9 /bin/bash

[root@a85fbed0ebc9 /]# ls

bin 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]# ls

test.txt

# 创建 test01.txt

[root@a85fbed0ebc9 volume01]# touch test01.txt

[root@a85fbed0ebc9 volume01]# ls

test.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]# ls

test.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]# ls

test.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 ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

78cd51a35c41 centos "/bin/bash" 17 minutes ago Up 17 minutes trusting_tharp

e6e0988c50cd centos "/bin/bash" 17 minutes ago Up 17 minutes docker05

c5ebc03e6819 centos:1.0 "/bin/sh -c /bin/bash" 19 minutes ago Up 19 minutes docker04

11d93f9bcd89 centos:1.0 "/bin/sh -c /bin/bash" 22 minutes ago Up 22 minutes docker03

a89fb82eeeb5 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

结论:

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

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

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

docker 数据卷 mysql_Docker容器数据卷原理及使用方法解析相关推荐

  1. docker数据卷容器卷_如何删除Docker映像,容器和卷

    docker数据卷容器卷 Docker备忘单 (A Docker Cheat Sheet) 介绍 (Introduction) Docker makes it easy to wrap your ap ...

  2. php函数unset,PHP unset函数 PHP unset函数原理及使用方法解析

    想了解PHP unset函数原理及使用方法解析的相关内容吗,小猿笔记在本文为您仔细讲解PHP unset函数的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:PHP,unset函数,下面大家 ...

  3. docker es持久化_使用docker数据卷对容器数据持久化

    volume是用于对Docker容器生成和使用的数据持久化的首选机制.如果您的容器生成非持久状态数据,请考虑使用 tmpfs挂载以避免将数据永久存储在任何地方,并通过避免写入容器的可写层来提高容器的性 ...

  4. Docker (八)容器数据卷使用

    什么是容器数据卷! docker的理念回顾 将应用和环境打包成一个镜像 如果数据都在容器中,那么我们容器删除,数据就会丢失! 容器删了,等同于MySQL删库跑路! 需求:数据可以持久 MySQL数据可 ...

  5. 【Docker 那些事儿】容器数据卷的妙手

    文章目录

  6. Docker镜像提交命令commit的工作原理和使用方法

    在本地创建一个容器后,可以依据这个容器创建本地镜像,并可把这个镜像推送到Docker hub中,以便在网络上下载使用. 下面我们来动手实践. docker pull nginx:1.15.3 用命令行 ...

  7. python语言入门m-Python -m参数原理及使用方法解析

    python -m xxx.py 作用是:把xxx.py文件当做模块启动 但是我一直不明白当做模块启动到底有什么用.python xxx.py和python -m xxx.py有什么区别! 自问自答: ...

  8. python m什么意思_Python -m参数原理及使用方法解析

    作用是:把xxx.py文件当做模块启动 但是我一直不明白当做模块启动到底有什么用.python xxx.py和python -m xxx.py有什么区别! 自问自答:python xxx.py pyt ...

  9. php中unset函数是在哪一章_PHP unset函数原理及使用方法解析

    unset―释放给定的变量 说明 unset(mixed$var[,mixed$...] ) :void unset()销毁指定的变量. unset()在函数中的行为会依赖于想要销毁的变量的类型而有所 ...

最新文章

  1. 今天没有浪费时间,我努力了
  2. sysname数据类型是什么
  3. 【安全漏洞】CVE-2021-32682 elFinder RCE 简单分析
  4. Java导入sql失败_java – 在hibernate中导入import.sql失败
  5. 实践证明,SQL Server 2000 + 2005 + 2008,完全可以共存
  6. python读取xml文件内容_python读取xml文件
  7. VS提示error C2011: “timespec”:“struct”类型重定义
  8. xu2w显示屏软件下载_LED显示屏控制软件
  9. 史上最详细的Maven安装教程以及Maven和eclipse集成
  10. 5G的落地现状与未来变局
  11. 题目 1039: 宏定义之闰年判断
  12. linux 32位浏览器下载,Chrome 浏览器32位、64位下载地址大全
  13. win10 jdk环境变量配置
  14. UVA818解题报告
  15. 苹果三代耳机_P130 【AirPods 3代】绝对性的福利!“地表最强真无线耳机” 苹果第三代AirPods Pro蓝牙耳机、妙不可言!...
  16. 英语作文考前必背10大类万能句型
  17. 【Unity3D】单个按键控制两个摄像机画面之间切换
  18. 基于JavaWeb的酒店客房预定管理系统
  19. Mysql 使用企业级MEB进行数据库物理备份与恢复
  20. 在传统公司干IT是一种什么体验(一)

热门文章

  1. 四、Input框改placeholder中字体的颜色
  2. Ubuntu SVN安装使用命令
  3. traceroute/tracert--获取网络路由路径
  4. SHELL-命令解释程序
  5. eclipse中运行c++控制台没输出
  6. linux 文件查找及定位
  7. python生成一段时间
  8. ise iMPACT bit生成MCS
  9. python list 删除元素_Python的list循环遍历中,删除数据的正确方法
  10. 如何根据原理图画封装_生物水处理专用消泡剂是如何根据生物水处理工艺原理进行消泡的?...