如果数据都在容器中,一旦容器删除,数据就会丢失!
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