Docker容器数据卷
容器数据卷
数据卷介绍
Docker将运用与运行的环境打包形成容器运行, Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来, 那么当容器删除后,数据自然也就没有了。 为了能保存数据在Docker中我们使用卷。
比如:Mysql容器,删除容器后,数据就不见了。为了使数据保存下来,容器之间有一个数据共享的技术!Docker容器中产生的数据,同步到本地!这就是卷技术! 类似目录的挂载,将我们的容器内的目录,挂载在Linux上面!
卷就是目录或文件,存在于一个或多个容器中,由Docker挂载到容器,但卷不属于联合文件系统(Union FileSystem),因此能够绕过联合文件系统提供一些用于持续存储或共享数据的特性:。
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
总结:数据卷就是容器的持久化和同步操作,容器间也可以数据共享。
使用数据卷
- 方式一:直接使用命令进行挂载 -v
# 命令 -v
docker run -it -v
# 测试
docker run -it -v /home/ceshi:/home centos /bin/bash
# 查看元数据 是否挂载成功
docker inspect ec7929b6f99c
The path /home/ceshi is not shared from the host and is not known to Docker.
sudo su root # 切换root用户
挂载成功后,容器和主机的文件会自动同步
具名和匿名挂载
- 匿名挂载
-v 容器内的路径!
# -P : 随机映射端口
docker run -d -P --name nginx03 -v /etc/nginx nginx
# 查看所有的卷的情况
docker volume ls
如下图:没有具体的名字对应
- 具名挂载
docker run -d -P --name nginx04 -v juming-nginx:/etc/nginx nginx
docker volume inspect juming-nginx
所有的docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxx/_data
中!
我们通过具名挂载可以方便的找到我们的一个卷,大多数情况是用的是具名挂载
。
如何确定是具名挂载还是匿名挂载,还是指定路径挂载
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主主机路径::容器内路径 #指定路径挂载
常用命令
# 创建数据卷
docker volume create my-vol
# 查看所有的数据卷
docker volume ls
# 查看指定数据卷的信息
docker volume inspect my-vol
# 删除数据卷
docker volume rm my-vol
# 删除容器之时删除相关的卷
docker rm -v ...
# 无主的数据卷可能会占据很多空间,要清理请使用以下命令
docker volume prune
拓展
通过 -v 容器内路径:ro rw 改变读写权限
ro readonly #只读
rw readerite #可读可写
#一旦设置了容器的权限,容器就对我们挂载出来的内容就有了限定!
docker run -d -P --name nginx04 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx04 -v juming-nginx:/etc/nginx:rw nginx
#ro 只要看到了ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作的
实战:Mysql数据持久化
# Docker Hub上没有适用于arm64架构的mysql镜像。
# M1芯片是arm64架构,也称作aarch64架构,只能运行arm64/aarch64架构的程序。
docker pull mysql:5.7
docker pull mysql/mysql-server
docker run -d -p 3310:3306 -v /tmp/docker/mysql/conf:/etc/mysql/conf.d -v /tmp/docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql/mysql-server
启动我们的mysql
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器的名字