小知识:Docker容器数据卷原理及使用方法解析

什么是容器数据卷

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

eg : mysql容器删了,就是我们常说的删库跑路。 需求:数据可以持久化,即时删掉容器,我们的数据还在

容器直接可以有一个数据共享的技术!docker容器产生的数据,同步到本地!

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

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

使用数据卷

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# 命令
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的数据持久化问题

?
1
2
3
4
5
6
7
8
9
10
11
12
13
# -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

具名和匿名挂载

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# 匿名挂载
-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 主机路径:容器内路径   # 指定路径挂载

拓展

?
1
2
3
4
5
6
# 通过 -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 镜像的构建文件!命令脚本! 先体验一下!

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
[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数据同步!

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# 通过 –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 volume01 volume02
# 启动同一个镜像 名字是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 volume01 volume02
# 在容器 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 volume01 volume02
# 进入该容器的 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 volume01 volume02
[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

结论:

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

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

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

原文链接:https://www.cnblogs.com/yinxd/p/13512671.html

声明: 猿站网有关资源均来自网络搜集与网友提供,任何涉及商业盈利目的的均不得使用,否则产生的一切后果将由您自己承担! 本平台资源仅供个人学习交流、测试使用 所有内容请在下载后24小时内删除,制止非法恶意传播,不对任何下载或转载者造成的危害负任何法律责任!也请大家支持、购置正版! 。本站一律禁止以任何方式发布或转载任何违法的相关信息访客发现请向站长举报,会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。本网站的资源部分来源于网络,如有侵权烦请发送邮件至:2697268773@qq.com进行处理。
建站知识

小知识:如何基于Dockerfile构建tomcat镜像

2023-3-27 19:05:05

建站知识

小知识:Docker简单入门使用教程

2023-3-27 19:19:39

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索