容器数据卷
使用数据卷
方式一: 直接使用命令挂载 -v
docker run -it -v 主机目录:容器内目录
#测试
[root@Graht home]# docker run -it -v /home/ceshi:/home centos /bin/bash
#启动起来之后可以通过 docker inspect 容器id 查看详细信息 [里面有挂载信息] :
"Mounts": [
{
"Type": "bind",
"Source": "/home/ceshi", 主机内地址
"Destination": "/home", 容器内地址
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
]
#可以在容器中创建一个文件到主机地址看看是否存在 【双向绑定】
#好处 以后修改某些容器中的配置文件就可以在服务器上完成不需要进入容器
#测试MySQL数据同步
[root@Graht home]# docker pull mysql:5.7 下载MySQL5.7镜像
#在运行容器的时候需要做数据挂载
-d 后台运行
-p 端口映射
-v 数据卷挂载 可以挂载多个
-e 环境配置
--name 容器名字
[root@Graht home]# docker run -d -p 3310: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
#启动成功之后 我们在本地使用DataGrip远程连接服务器的3310
#3310和服务器的3306映射 就可以连接上了
##测试 可以在DataGrip创建数据库 然后在服务器中的/home/data 就会生成一个新的文件
###假设我们将容器删除 在本地的数据卷依旧没有丢失 这就实现了容器数据持久化功能
具名和匿名挂载
#匿名挂载
[root@Graht data]# docker run -d --name nginx01 -P -v /etc/mginx nginx
5923a22702c76769f019b36bd59abf47f5251c86c4ae8eaf69d51d727a71b025
[root@Graht data]# docker volume ls
DRIVER VOLUME NAME
local 8038cded2858aab7c251a966f17fd0d4c9e7181d3f6907f575f9e830bfb05ca8
#在-v 之后我们不给出容器外路径 就是匿名挂载
#具名挂载
[root@Graht data]# docker run -d --name nginx02 -P -v juming-nginx:/etc/nginx nginx
401e8a005dc767ca36b7fdb2b1e15240cf37983e6ed2d2ed938ffe4fd7481191
[root@Graht data]# docker volume ls
DRIVER VOLUME NAME
local juming-nginx
#通过 -v 卷名:容器内路径
#查看卷
[root@Graht data]# docker volume inspect juming-nginx
[
{
"CreatedAt": "2022-03-12T13:57:11+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
#这个目录是没有指定目录情况下所有卷路径 /var/lib/docker/volumes/
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
#通过具名挂载可以找到一个卷 大多数情况都是使用具名挂载
拓展:
#通过 -v 容器内路径:ro rw 改变读写权限
ro read only #只读
rw read write #可读可写
#一旦设置了容器权限 容器对挂载出来的内容就有限定了
# ro :说明这个路径只能通过宿主机来操作,容器内部是无法操作的
数据卷容器
#先使用刚刚建立好的镜像创建三个容器
#第一个当作主容器
[root@Graht /]# docker run -it --name docker01 graht/centos
#第二个 --volumes-from 和哪个容器共享就写哪个容器名字 很显然docker01
[root@Graht /]# docker run -it --name docker02 --volumes-from docker01 graht/centos
#第三个 --volumes-from 和哪个容器共享就写哪个容器名字 很显然docker01
[root@Graht /]# docker run -it --name docker02 --volumes-from docker01 graht/centos
#在第一个容器中新建内容 在第二第三个容器中能看到 相反也行
##当删除了docker01这个容器 docker02 docker03都可以访问数据
说明了在数据卷容器中他们之间是一个拷贝的概念