什么是容器数据卷?
docker理念回顾:将应用和环境打包成一个镜像!
数据问题:如果数据都在容器中,容器删除,数据会丢失
需求:数据可以持久化,例如mysql的数据可以存在本地
容器与本地之间可以有一个数据共享的技术,Docker容器中的数据,同步到本地
这就是卷技术!我们将容器内的目录挂载到Linux上面
总结:容器的持久化和同步操作,容器间也是可以数据共享的
使用数据卷
方式1:直接使用命令挂载(-v)
命令:docker run -it -v /宿主机目录:/容器目录
[root@server ~]# docker run -it -v /home/mount_centOS_home:/home centos /bin/bash
[root@c784218bd2eb /]# cd /home
[root@c784218bd2eb home]# ls
[root@c784218bd2eb home]# //此时容器内的centos的home文件夹是空的
打开Linux内终端查看挂载状态:
[root@server home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f50570b4b258 centos "/bin/bash" 43 seconds ago Up 42 seconds fervent_johnson
[root@server home]# docker inspect f50570b4b258 //查看容器详细信息
数据由容器到Linux同步成功
数据由Linux到容器同步成功
实战测试:安装MySQL
#获取mysql:5.7镜像
[root@server ~]# docker pull mysql:5.7
#运行容器,并做数据挂载:启动mysql需要配置密码!!!!
-d:后台运行
-p:端口映射
-v:数据卷挂载(可以多个)
-e:环境配置
--name:设置容器名字
docker run -p 3310:3306 -v /home/mount_mysql/config:/etc/mysql/conf.d -v /home/mount_mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
#启动成功后,使用本地的Navicat连接测试一下
#在本地的navicat上创建一个数据库,然后查看Linux上我们映射的路径是否ok
#此时删除mysql容器,我们挂载到本地的数据卷并没有丢失,这就实现了我们的数据持久化功能
具名挂载和匿名挂载
#匿名挂载:
[root@server /]# docker run -d -P --name naginx_02 -v /etc/nginx nginx
52c6d73a9ecfa0322dbd83eb20e6d20acca788756e1d6d3175aa0df6b860b14d
#查看所有卷的挂载情况
[root@server /]# docker volume ls
DRIVER VOLUME NAME
local a6514dbbf47e2cc515aa8b0c2e79c769e092da267df468d0cc0c1b6085de5890
#此时在启动一个具名挂载的nginx 通过 -v 卷名:容器内路径
[root@server /]# docker run -d -P --name nginx_03 -v nginx_03:/etc/nginx nginx
03159dc81a099b4b4971480f1e9c12dc95fff6322237438c4e9a255d521016c2
#再查看所有卷的挂载情况
[root@server /]# docker volume ls
DRIVER VOLUME NAME
local a6514dbbf47e2cc515aa8b0c2e79c769e092da267df468d0cc0c1b6085de5890
local nginx_03
`区别`
#这种一长串的就是匿名挂载,我们在-v 只写了容器内的路径,没有写当前宿主机的路径
#查看一下具名挂载卷
[root@server /]# docker volume inspect nginx_03
[
{
"CreatedAt": "2020-05-25T16:41:52+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/nginx_03/_data",
"Name": "nginx_03",
"Options": null,
"Scope": "local"
}
]
#所有的docker容器内的卷,在没有指定本地目录的情况下都是在 ”/var/lib/docker/volumes/卷名/_data“
[root@server /]# cd /var/lib/docker
[root@server docker]# ls
builder containers network plugins swarm trust
buildkit image overlay2 runtimes tmp volumes
[root@server docker]# cd volumes/
[root@server volumes]# ls
a6514dbbf47e2cc515aa8b0c2e79c769e092da267df468d0cc0c1b6085de5890
nginx_03
metadata.db
[root@server volumes]# cd nginx_03/
[root@server nginx_03]# ls
_data
[root@server nginx_03]# cd _data/
[root@server _data]# ls
conf.d koi-utf mime.types nginx.conf uwsgi_params
fastcgi_params koi-win modules scgi_params win-utf
#我们通过具名挂载可以方便的找到我们挂载到宿主机的一个卷,也是实际业务中大多数会使用的方法
#如何确定是具名挂载还是匿名挂载,还是指定路径挂载???
-v 容器内的地址 #匿名挂载
-v 卷名:容器内地址 #具名挂载
-v /宿主机路径:容器内路径 #指定目录挂载
拓展:
#通过 -v 容器内路径:ro或者rw 改变读写权限
ro:readonly #只读(挂载的目录只能通过宿主机来改变,容器内部无法操作)
rw:readwrite #可读可写(默认)
[root@server _data]# docker run -d -P --name nginx_03 -v nginx_03:/etc/nginx:ro nginx
[root@server _data]# docker run -d -P --name nginx_03 -v nginx_03:/etc/nginx:rw nginx