目录
Dcoker容器数据卷
介绍
总结一句话:容器的持久化和同步操作!容器之间也是可以数据共享的
方式一:本地挂载 使用命令的方式来挂载 -v
容器停止,此时Linux修改文件,docker 容器在启动的时候,会更新过去
举例:
测试:(本地能否链接成功)
好处:我们修改只需在本地修改即可,容器内会自动同步!
假设我们将容器删除
发现,我们挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能!
具名挂载和匿名挂载
具名挂载:
匿名挂载(推荐):
docker volume ls 查看挂载名列表
docker volume inspect 挂载名 查看挂载情
docker目录 /var/lib/docker/
我们通过具名挂载可以方便的找到我们的一个卷,大多数情况下使用 具名挂载
区分三种挂载方式
拓展:
查看卷挂载的路径 docekr inspect
数据卷容器 --volumes-from
测试:
多个mysql实现数据共享
结论:
介绍
我们会有这么一种需求,我们需要容器中的一些目录可以同步到本地,这个做的目的有两个:
第一:对于一些容器我们我往往需要经常的修改配置文件,频繁的进入容器显得们麻烦。
第二:对于容器(mysql)中的数据,我们希望可以持久化到本地,作为一种备份。
针对上面的两个需求,docker给我提供了一种数据卷的技术,我们可以通过数据卷将docker容器中的目录与本地的Linux的目录进行挂载(双向绑定)。除了上述的本机与容器之间的数据挂载,容器与容器之间也是可以进行挂载的。
数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化
MySQL,容器删了,删库跑路!需求:MySQL数据可以存储在本地!
容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!
这就是卷技术!目录的挂载,将我们容器内的目录,挂载到Linux上面!
方式一:本地挂载 使用命令的方式来挂载 -v
docker run -it -v 主机目录:容器目录
#测试
[root@master ~]# doceke run -it -v /home/ceshi:/home centos bin/bash
#启动起来时候我们可以通过 docker inspect 容器id 来查看详细信息
MySQL的数据持久化问题(需要数据持久化的需要思考
) data
下面我们将mysql中的/etc/mysql/conf.d
和/var/lib/mysql
目录挂载到本地的/home/mysql/config
和/home/mysql/data
目录下。
# 1、启动(挂载) #安装mysql时需要配置密码 需要注意
[root@gh ~]# docker run --name mysql-test01 -itd -p 3306:3306 -v /home/mysql/config:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
cac43dce9d011ee0cda595361e9915cc1b64ac2a5d5aab57fa9db3327a23e03a
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名字
查看挂载是否成功 docker inspect 去查看容器的详细信息
[root@gh ~]# docker inspect cac43dce9d01
# 未挂载前
[root@gh home]# cd /home
[root@gh home]# ls
gh www
# 挂载 后
[root@gh home]# ls
gh mysql www
[root@gh home]# cd mysql
# 发现多出两个目录 config data
[root@gh mysql]# ls
config data
[root@gh mysql]# cd config
[root@gh config]# ls
[root@gh config]# cd ..
# 发现data目录下 的文件确实是/var/lib/mysql目录下的东西
[root@gh mysql]# cd data/
[root@gh data]# ls
auto.cnf ca.pem client-key.pem ibdata1 ib_logfile1 mysql private_key.pem server-cert.pem sys
ca-key.pem client-cert.pem ib_buffer_pool ib_logfile0 ibtmp1 performance_schema public_key.pem server-key.pem
[root@gh data]#
具名挂载和匿名挂载
我们上述讲的挂载方式为指定路径挂载(我们是指定了宿主机的挂载路径)。我们也可以通过具名和匿名两种方式进行挂载。具名和匿名挂载我们都不需要指定宿主机的挂载路径。
docker run -d -P --name nginx01 -v /etc/nginx nginx
# 匿名挂载
-v 容器内路径!
$ docker run -d -P --name nginx01 -v /etc/nginx nginx
# 查看所有的volume(卷)的情况
$ docker volume ls
DRIVER VOLUME NAME # 容器内的卷名(匿名卷挂载)
local 264e5fc71bbad5a329b28300f35713f4882546d95b91740a89cc882819843aa3
local 867bf5dfd84b154d0cb262b69c8284b7c88cd43bf6bc0d0f05bd35f6d0f07fd0
local d355f4d2c1d8ff7d0baeb9147552e5d730b8201993e7dee5805c71b7b25ab6ec
local e6aa6b909e1139822136e5232ee1ba0932bc308afaa6cbcac6458966cb80be15
# 这里发现,这种就是匿名挂载,我们在 -v只写了容器内的路径,没有写容器外的路径!
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
-v juming-nginx:/etc/nginx 命了一个名字 不是一个目录
-v / juming-nginx:/etc/nginx 加了/ 绝对目录开头 没有加 / 就是普通的配置
# 具名挂载 -P:表示随机映射端口
$ docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
9663cfcb1e5a9a1548867481bfddab9fd7824a6dc4c778bf438a040fe891f0ee
# 查看所有的volume(卷)的情况
$ docker volume ls
DRIVER VOLUME NAME
local 264e5fc71bbad5a329b28300f35713f4882546d95b91740a89cc882819843aa3
local 867bf5dfd84b154d0cb262b69c8284b7c88cd43bf6bc0d0f05bd35f6d0f07fd0
local d355f4d2c1d8ff7d0baeb9147552e5d730b8201993e7dee5805c71b7b25ab6ec
local e6aa6b909e1139822136e5232ee1ba0932bc308afaa6cbcac6458966cb80be15
local juming-nginx #多了一个名字
# 通过 -v 卷名:查看容器内路径
# 查看一下这个卷
$ docker volume inspect juming-nginx
[
{
"CreatedAt": "2022-03-23T13:55:34+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data", #默认目录
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
docker volume ls
查看挂载名列表docker volume inspect 挂载名
查看挂载情所有docker容器内的卷,没有制定目录的情况下的都在 /var/lib/docker/volumes/xxx_data中
# docekr 目录 /var/lib/docker
[root@gh ~]# cd /var/lib/docker/
[root@gh docker]# ls
buildkit containers image network overlay2 plugins runtimes swarm tmp trust volumes
[root@gh docker]# cd volumes/
[root@gh volumes]# ls
264e5fc71bbad5a329b28300f35713f4882546d95b91740a89cc882819843aa3 d355f4d2c1d8ff7d0baeb9147552e5d730b8201993e7dee5805c71b7b25ab6ec
867bf5dfd84b154d0cb262b69c8284b7c88cd43bf6bc0d0f05bd35f6d0f07fd0 e6aa6b909e1139822136e5232ee1ba0932bc308afaa6cbcac6458966cb80be15
backingFsBlockDev metadata.db
[root@gh volumes]#
#区分三种挂载方式
# 三种挂载: 匿名挂载、具名挂载、指定路径挂载
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径:容器内路径 #指定路径挂载 docker volume ls 是查看不到的
# 通过 -v 容器内路径: ro rw 改变读写权限
ro #readonly 只读
rw #readwrite 可读可写
#一旦这个设置了容器权限,容器对我们挂载出来的内容就有了限定了
docker run -d -P --name nginx05 -v juming:/etc/nginx:ro nginx
docker run -d -P --name nginx05 -v juming:/etc/nginx:rw nginx
# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作!
多个容器之间同步数据
# 启动docker 01
[root@gh ~]# docker run -it --name docker01 cacef2eba361 /bin/bash
[root@f90a7cb23452 /]# ls -l
total 56
lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x 5 root root 360 Mar 21 04:01 dev
drwxr-xr-x 1 root root 4096 Mar 21 04:01 etc
drwxr-xr-x 2 root root 4096 Nov 3 2020 home
lrwxrwxrwx 1 root root 7 Nov 3 2020 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
drwx------ 2 root root 4096 Sep 15 2021 lost+found
drwxr-xr-x 2 root root 4096 Nov 3 2020 media
drwxr-xr-x 2 root root 4096 Nov 3 2020 mnt
drwxr-xr-x 2 root root 4096 Nov 3 2020 opt
dr-xr-xr-x 108 root root 0 Mar 21 04:01 proc
dr-xr-x--- 2 root root 4096 Sep 15 2021 root
drwxr-xr-x 11 root root 4096 Sep 15 2021 run
lrwxrwxrwx 1 root root 8 Nov 3 2020 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Nov 3 2020 srv
dr-xr-xr-x 13 root root 0 Mar 21 04:01 sys
drwxrwxrwt 7 root root 4096 Sep 15 2021 tmp
drwxr-xr-x 12 root root 4096 Sep 15 2021 usr
drwxr-xr-x 20 root root 4096 Sep 15 2021 var
drwxr-xr-x 2 root root 4096 Mar 21 04:01 volume01
drwxr-xr-x 2 root root 4096 Mar 21 04:01 volume02
# 挂载上 docker02 volumes-form
[root@gh ~]# docker run -it --name docker02 --volumes-from docker01 cacef2eba361 /bin/bash
[root@173c46baf306 /]# ls -l
total 56
lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x 5 root root 360 Mar 21 04:02 dev
drwxr-xr-x 1 root root 4096 Mar 21 04:02 etc
drwxr-xr-x 2 root root 4096 Nov 3 2020 home
lrwxrwxrwx 1 root root 7 Nov 3 2020 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
drwx------ 2 root root 4096 Sep 15 2021 lost+found
drwxr-xr-x 2 root root 4096 Nov 3 2020 media
drwxr-xr-x 2 root root 4096 Nov 3 2020 mnt
drwxr-xr-x 2 root root 4096 Nov 3 2020 opt
dr-xr-xr-x 110 root root 0 Mar 21 04:02 proc
dr-xr-x--- 2 root root 4096 Sep 15 2021 root
drwxr-xr-x 11 root root 4096 Sep 15 2021 run
lrwxrwxrwx 1 root root 8 Nov 3 2020 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Nov 3 2020 srv
dr-xr-xr-x 13 root root 0 Mar 21 04:02 sys
drwxrwxrwt 7 root root 4096 Sep 15 2021 tmp
drwxr-xr-x 12 root root 4096 Sep 15 2021 usr
drwxr-xr-x 20 root root 4096 Sep 15 2021 var
drwxr-xr-x 2 root root 4096 Mar 21 04:01 volume01
drwxr-xr-x 2 root root 4096 Mar 21 04:01 volume02
# 进入docker 01 attacth
[root@gh /]# docker attach f90a7cb23452
[root@f90a7cb23452 /]#
# 在docker01 的 volume01 中创建一个文件 docker01-test
[root@173c46baf306 /]# cd volume01
[root@173c46baf306 volume01]# touch docker01-test
# 在docker 02 的容器中查看 vilume01 发现有 docker01 创建的文件
[root@f90a7cb23452 volume01]# ls
docker01-test
docker 01 创建的数据同步到了docker02上面
测试:可以删除docekr01,查看一下docker02和docker03是否还可以访问这个文件
测试依旧可以访问
[root@gh~]# docker run -d -p 3310:3306 -v/etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
[root@gh~]# docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02
--volumes-from mysql01 mysql:5.7
#这个时候,可以实现连个容器数据同步
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!