容器数据卷
docker 容器中会有一个小型的文件系统,数据会存储在容器内部,但是如果容器被删除,数据就会被丢失。因此如果需要数据持久化,应该存储在宿主机的文件系统中。所以产生了容器卷技术
容器的持久化和同步操作!容器间也可以共享数据
使用数据卷
方式一:直接使用命令来挂载 -v
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| docker run -v 主机位置:容器位置 docker run -it -v /home/test:/home 容器id /bin/bash
docker inspect 容器id # 可以看到 mounts 的信息 "Mounts": [ { "Type": "bind", "Source": "/home/test", "Destination": "/home", "Mode": "", "RW": true, "Propagation": "rprivate" } ],
|
容器退出,修改宿主机的本地文件,重新启动容器之后,容器依然可以同步到。
mysql 实战
1 2 3 4 5 6 7 8 9
| docker pull mysql:5.7 docker run -d -p 3310:3306 -v /home/mysql: # 官方测试: docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:tag
docker run -d -p 3310:3306 -v /tmp/mysql/conf:/etc/mysql/conf.d -v /tmp/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7 # -e 环境配置 # --name 容器名字
mysql -h127.0.0.1 -P3310 -uroot -p123456
|
具名和匿名挂载
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| # 匿名挂载 -P 随机映射端口 -v 容器内路径 docker run -d -P --name nginx01 -v /etc/nginx 容器id
# 查看所有的 volume 卷的情况 docker volume ls # 这就是匿名挂载,我们在 -v 只写了容器内的路径,没有写容器外的路径
# 具名挂载 # -v 卷名:容器内路径 docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx 容器id # 查看所有卷(包括具名和匿名) docker volume ls # 查看某个卷 docker volume inspect 卷名
root@9-134-239-95:tmp# docker volume ls DRIVER VOLUME NAME local a6b5c7a05b0a714a1cb78c1c9bad703b51d81b4ef4b3f87925ee9bb220af6a33 local f1d577850ac892a3f9b3d0685c58d5e3fcc4a0717ce3fb4712538233300e4de9 local fe7053b29a9abfae3f9d24c6ce3e05c3a16bb9870333fafa8a7733ada2932f8e local jumping-nginx root@9-134-239-95:tmp# docker volume inspect jumping-nginx [ { "CreatedAt": "2021-11-20T11:23:23+08:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/jumping-nginx/_data", "Name": "jumping-nginx", "Options": null, "Scope": "local" } ]
|
所有docker 容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/xxxx/_data
我们通过具名挂载可以方便的找到我们的一个卷,大多数情况是使用 具名挂载
1 2 3 4
| # 如何确定是具名挂载还是匿名挂载,还是指定路径挂载 -v 容器内路径 # 匿名挂载 -v 卷名:容器内路径 # 具名挂载 -v /宿主机路径:容器内路径 # 指定路径挂载
|
扩展
1 2 3 4 5 6 7 8 9
| # 通过 -v 容器内了路径,ro rw 改变读写权限 ro readonly # 只读 rw readwrite # 可读可写
# 一旦这个设置了容器权限,容器对我们挂载出来的内容就有限定了 docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx:ro nginx docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx:rw nginx
# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部无法操作
|