目录
1.什么是容器数据卷
2.数据卷的使用
3.实战MySQL同步数据
4.卷 常用命令
5.匿名挂载与具名挂载
5.1 匿名挂载
5.2 具名挂载
6.数据卷容器
Docker将运用与运行的环境打包形成容器运行, Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来, 那么当容器删除后,数据自然也就没有了。 为了能保存数据在Docker中我们使用卷。|
卷就是目录或文件,存在于一个或多个容器中,由Docker挂载到容器,但卷不属于联合文件系统(Union FileSystem),因此能够绕过联合文件系统提供一些用于持续存储或共享数据的特性:。
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
Docker容器卷的工作就是将docker容器数据通过映射进行备份+持久化到本地的主机目录
方法一:直接使用命令来挂载 -v
docker run -it -v 主机目录:容器目录
我们测试一下
Source:来源 Destination:目的地 挂载就是主机往容器挂的,源是主机,挂载就是将宿主机的一部分空间共享给容器一起用(因此数据卷也可以用来做扩容!!)宿主机和容器都可以数据共享
即使容器被停止,在宿主机操作的挂载目录下的文件,容器内还是会映射去的。
注意:它们类似共享文件占用一块存储,不会存两份
好处:我们以后修改只需要在本地修改即可,容器内会自动同步!
在Linux下的MySQL默认的数据文档存储目录为/var/lib/mysql,默认的配置文件的位置/etc/mysql/conf.d,为了确保MySQL镜像或容器删除后,造成的数据丢失,下面建立数据卷保存MySQL的数据和文件。
docker run -d -p 6603:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
-d 后台运行
-p 端口映射
-v 卷挂载
-e 配置环境,设置了密码
--name 取名
在连接中新建了个数据库,在服务器中的文件夹下依然可以找到,挂载成功!
0.创建数据卷 (没什么用
docker volume create #VOLUME NAME
1.查看所有的数据卷
docker volume ls
2.查看指定数据卷的信息
docker volume inspect #VOLUME NAME
3.删除数据卷
docker volume rm ...
docker volume rm #VOLUME NAME
无法删除正在被使用的,容器存在的。
4.删除容器之时删除相关的卷
docker rm -v ...
数据卷是被设计用来持久化数据的,它的生命周期独立于容器,Docker 不会在容器被删除后自动删除数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷 。如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用 docker rm -v 这个命令。
无主的数据卷可能会占据很多空间,要清理请使用以下命令
docker volume prune
我们之前挂载 docker run -it -v 主机目录:容器目录 这种方式是指定路径挂载的,但是我们也可以不定义主机目录路径。有两种方式挂载。
Docker所有的数据卷默认挂载在宿主机 /var/lib/docker/volumes/ 目录下
匿名挂载就是在指定数据卷的时候,不指定容器路径对应的主机路径,这样对应映射的主机路径就是默认的路径/var/lib/docker/volumes/中自动生成一个随机命名的文件夹
如下运行并匿名挂载Nginx容器:
docker run -d -P --name nginx01 -v /etc/nginx nginx
具名挂载,就是指定文件夹名称,区别于指定路径挂载,这里的指定文件夹名称是在Docker指定的默认数据卷路径下的。通过docker volume ls
命令可以查看当前数据卷的目录情况。
有了挂载名,我们就可以更好的操作,所以这也是比较常用的。
可以查看一下volume的信息
匿名挂载,具名挂载,指定路径挂载的命令区别如下:
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径:容器内路径 #指定路径挂载
扩展:
#通过 -v 容器内路径: ro rw 改变读写权限
ro readonly #只读
rw readwrite #可读可写
#一旦这个了设置了容器权限,容器对我们挂载出来的内容就有限定了!
docker run -d -p --name nginx02 -v juming-nginx : /etc/nginx:ro nginxdocker run -d -p --name nginx02 -v juming-nginx : /etc/nginx:rw nginx
# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作!
容器数据卷是指建立数据卷,来同步多个容器间的数据,实现容器间的数据同步。
创建docker01:因为我本机是最新版
docker run -it --name docker01 wjc/centos:latest
查看容器docekr01内容
ls
bin home lost+found opt run sys var
dev lib media proc sbin tmp volume01
etc lib64 mnt root srv usr volume02
不关闭该容器退出
CTRL + Q + P
创建docker02: 并且让docker02 继承 docker01
docker run -it --name docker02 --volumes-from docker01 wjc/centos:latest
查看容器docker02内容
ls
bin home lost+found opt run sys var
dev lib media proc sbin tmp volume01
etc lib64 mnt root srv usr volume02
首先在容器2中的volume01中添加文件
[root@7f90d4147511 /]# cd volume01
[root@7f90d4147511 volume01]# touch test.java
[root@7f90d4147511 volume01]# ls
test.java
然后就可以看到容器1的文件也会添加上了
docker run -it --name docker03 --volumes-from docker01 wjc/centos:latest
cd volume01 #进入volume01 查看是否也同步docker01的数据ls
docker01.txt
# 测试:可以删除docker01,查看一下docker02和docker03是否可以访问这个文件
# 测试发现:数据依旧保留在docker02和docker03中没有被删除
下面同步两个MySQL的数据库和配置文件,与上面的操作相同,首先建立数据卷,然后给另一个MySQL容器建立容器数据卷挂载
$ 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:5.7
$ docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
# 这个时候,可以实现两个容器数据同步。