容器数据卷
什么是容器数据卷
docker的理念回顾
将应用和环境打包成一个镜像。
如果数据都在容器中,那么容器删除,数据就会丢失!需求:数据可以长久化,MySQL,容器删了,删库跑路。=需求:MySQL数据可以存储在本地=
容器之间可以有一个数据共享技术!Docker容器中产生的数据,同步到本地。这就是卷技术,目前的挂载,将我们容器内的目录,挂载到Linux上面。
总结:容器的持久化和同步操作,容器间也可以数据共享。
使用数据卷
# 方式一:直接使用命令挂载 -v
docker run -it -v 主机目录:容器内目录
# 测试
root@liuxiaoweideAir ~ # docker run -it -v /Users/liuxiaowei/ceshi:/home centos /bin/bash #主机目录:/Users/liuxiaowei/ceshi 容器目录:/home
# 启动之后,通过docker inspect 容器id 检验卷如何挂载
root@liuxiaoweideAir liuxiaowei # docker inspect 3af3cfc435c3
"Mounts": [
{
"Type": "bind",
"Source": "/Users/liuxiaowei/ceshi", # 主机内地址
"Destination": "/home", # docker 容器内的地址
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
]
测试文件的同步效果如图:
逆向测试
1、退出容器
2、然后在宿主机目录下进行操作
3、再启动容器
4、查看容器内目录文件同步变化
优点:以后修改只需在本地修改即可,容器内会自动同步。
实战:安装MySQL
思考:MySQL的数据持久化的问题
# 获取镜像
root@liuxiaoweideAir ~ # docker pull mysql:5.7
# 运行容器,需要做数据挂载, 安装启动mysql,需要配置密码的,这需要注意。去https://hub.docker.com/搜索mysql
# Start a mysql server instance
# Starting a MySQL instance is simple:
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
# 启动容器
-d 后台运行
-p 端口映射
-v 卷挂载 (两个-v 挂载两个目录)
-e 环境配置
--name 容器名字
root@liuxiaoweideAir ~ # docker run -d -p 3310:3306 -v /Users/liuxiaowei/mysql/conf:/etc/mysql/conf.d -v /Users/liuxiaowei/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
42053d1fb7043624bb199b7f5d876ccd2299d5047230cee847a4dcabb5657ddf
# 启动成功之后,利用Navicat或者SQL PRO连接测试,连接到服务器的3310 --- 3310和容器内的3306映射。如下图
# 在本地测试创建一个数据库,查看一下我们映射的路径是否同步。
本例:root@liuxiaoweideAir data # ls
auto.cnf ib_logfile1 server-cert.pem
ca-key.pem ibdata1 server-key.pem
ca.pem ibtmp1 sys
client-cert.pem mysql test # 在mysql容器里建立的数据库
client-key.pem performance_schema test1 # 在mysql容器里建立的数据库
ib_buffer_pool private_key.pem
ib_logfile0 public_key.pem
root@liuxiaoweideAir data # pwd
/Users/liuxiaowei/mysql/data
假设我们将容器删除
root@liuxiaoweideAir data # docker rm -f mysql01
mysql01
root@liuxiaoweideAir data # docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
root@liuxiaoweideAir data # ls
auto.cnf ib_logfile0 public_key.pem
ca-key.pem ib_logfile1 server-cert.pem
ca.pem ibdata1 server-key.pem
client-cert.pem mysql sys
client-key.pem performance_schema test
ib_buffer_pool private_key.pem test1
发现,我们挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能!
具名和匿名挂载
匿名挂载
- v 容器内路径
- P 随机映射端口
docker run -d -P --name nginx01 -v /etc/nginx nginx
# 查看所有的卷的信息
root@liuxiaoweideAir liuxiaowei # docker volume ls
DRIVER VOLUME NAME
local 3e8ab2696b7005a359de2bdaf5fc70a01881652fc0a789b3dcbac3d12b42a841 # 匿名
# 具名挂载nginx "juming-nginx"
root@liuxiaoweideAir liuxiaowei # docker run -d -P --name nginx02 -v juming-nginx:/ect/nginx nginx
df397dd0401dc1f2904671efaeca9749c7813fca846ba097f890666785094327
root@liuxiaoweideAir liuxiaowei # docker volume ls
DRIVER VOLUME NAME
local f40d828c9c069666740ff54f90c35e6061071cf684198ca5c2e9caab7871fdf0
local juming-nginx # 具名
local vsCodeServerVolume-liuxiaowei-recursing_leakey
# 查看一下这个具名卷
root@liuxiaoweideAir liuxiaowei # docker volume inspect juming-nginx
[
{
"CreatedAt": "2022-01-08T14:24:41Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data", # 挂载点
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
所有的docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/xxxx/_data
我们通过具名挂载可以方便的找到我们的一个卷,大多数情况下使用具名挂载
# 如何确定是具名挂载或者匿名挂载,还是指定路径挂载
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /宿主机路径:容器内路径 # 指定路径挂载
拓展:
# 通过 -v 容器内路径:ro rw 改变读写权限
ro --- readonly # 只读
rw --- readwrite # 可读可写
# 一旦设置了容器权限,容器对我们挂载出来的内容就有限定
docker run -d -p --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -p --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
# ro 说明这个路径只能通过宿主机来操作,容器内部无法操作