1、什么是容器数据卷?
docker的理念回顾
-
将应用和环境打包成一个镜像!
- 如果数据都在容器中,那么容器删除,数据就会丢失!需求:数据可以持久化。如:MySQL,容器删除了,MySQL数据可以存储在本地!
-
容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!这就是卷技术!目录的挂载,将容器内的目录,挂载到Linux上面!
卷的作用:
- 容器数据的持久化和同步操作!
- 容器间数据共享!
2、使用数据卷
方式一 :直接使用命令挂载
-v 宿主机目录:容器内目录
-v, --volume list Bind mount a volume
docker run -it -v 主机目录:容器内目录 -p 主机端口:容器内端口
# 把容器内的home目录,挂载(映射)到宿主机的/home/test目录
docker run -it -v /home/test:/home centos /bin/bash
- 查看挂载情况
# 该命令在宿主机环境下;容器内没有这个命令
docker inspect 容器id
测试
- 容器中修改文件,宿主机下查看
- 宿主机中修改文件,容器下查看
- 删除容器,查看宿主机下文件
3、测试安装 MySql
目的:需要将 MySql 中的配置信息和数据文件,同步到容器外部;如果 MySql 容器被删除时,数据依然存在
- 搜索下载 mysql
# 搜索 mysql
docker search mysql
# 下载 mysql 镜像;此处仅为测试;建议下载5.7,高版本mysql会有密码的加密规则
docker pull mysql:5.7
-
启动 mysql
- 数据挂载:
-v 宿主机目录:mysql容器内文件或目录
,可以有多个挂载-v
- 配置密码:
-e MYSQL_ROOT_PASSWORD=密码
- 数据挂载:
# 运行容器
# 需要做数据挂载
# 安装启动 mysql,需要配置密码
# 参考官网hub
# docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
# 启动
# -d 后台运行
# -p 端口映射
# -v 卷挂载
# -e 环境配置
# -- name 容器名字
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
- 查看挂载目录
-
外部连接测试
在虚拟机之外用 Navicat 连接
- 删除 MySql 容器,查看挂载点数据
4、具名挂载和匿名挂载
1)匿名挂载
# 匿名挂载:不推荐
# -v 只有容器内路径!不指定宿主机目录;会生成随机的宿主机挂载目录
docker run -d -P --name 容器名称 -v 容器内路径
# 查看所有的 volume 的情况
docker volume ls
2)具名挂载
# 具名挂载:推荐
# 指明挂载点的文件名(卷名),不是路径
docker run -d -P --name nginx02 -v nginx02:/etc/nginx nginx
- 查看特定的卷
docker volume inspect 卷名
所有的 docker 容器内的卷,没有指定目录的情况下都是在宿主机/var/lib/docker/volumes/xxxx/_data
下,如果指定了目录,docker volume ls
是查看不到的
3)三种挂载区分
区别 | 挂载命令 | 查看特定的卷 | 卷名 | 卷在宿主机中位置 |
---|---|---|---|---|
匿名 | -v 只指定容器内路径 |
docker volume inspect 卷名 | 随机 | /var/lib/docker/volumes/xxxx/_data |
具名 [推荐] |
-v 卷名:容器内路径 |
docker volume inspect 卷名 | 指定 | /var/lib/docker/volumes/xxxx/_data |
指定路径 | -v 宿主机指定路径:容器内路径 |
– | – | 按指定路径 |
4)读写权限
在容器内路径后面加
:ro
或:rw
ro
readonly 只读;容器内无法修改,只能在宿主机的挂载点操作rw
readwrite 可读可写
docker run -d -P --name nginx05 -v juming:/etc/nginx:ro nginx
5、初识DockerFile
方式二:使用DockerFile生成卷挂载
- DockerFile 就是用来
构建docker镜像
的构建文件!- 这种方式使用的十分多,因为项目开发后会构建自己的镜像!
- 通过脚本生成镜像
# 创建一个dockerfile文件,名字可以随便 建议Dockerfile
# 文件中的内容 指令(大写) 参数
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
#这里的每个命令,就是镜像的一层!
- 生成镜像
# -f : file缩写;指的是dockerfile文件路径,下面例子为dockerfile1文件的所在目录下
# -t : target缩写;指的是生成镜像的名称,不是路径,前面不要加 /
# . : 生成在当前目录下
docker build -f dockerfile1 -t tuwer/centos .
- 启动镜像
docker run -it tuwer/centos /bin/bash
- 查看卷挂载
- 同步测试
6、数据卷容器
不同容器间的挂载,可以实现数据同步
--volumes-from 被挂载容器
- 启动被挂载容器
# 指定容器名称为 centos01
docker run -it --name centos01 tuwer/centos
- 启动挂载容器
# 指定容器名称为 centos02
# --volumes-from centos01 挂载到容器 centos01 上
docker run -it --name centos02 --volumes-from centos01 tuwer/centos
- 测试容器间数据同步
- 在容器centos01下,进入volume01挂载目录,创建文件 test.txt
- 在容器centos02下,进入对应的挂载目录volume01查看,发现目录内也有 test.txt,文件实现了同步
- 启动第三个容器,挂载第二个容器
- 容器3中创建文件,容器1和容器2中查看
- 删除容器1,查看容器2和容器3
结论:
- 容器间挂载后,数据的传递,不是简单的共享(不像windows中的快捷方式),而是复制(备份),有多少个挂载容器,就会存在多少份数据,当一个容器中的挂载数据变化后,会同步到其它容器;当删除任意一个容器后,其它容器中的数据不受影响;所以数据卷容器的生命周期一直持续到没有容器使用为止,只要有一个挂载容器存在,数据就不会丢失。
- 如果数据挂载到外部宿主机,那么即使所有容器删除,宿主机中的对应数据也是不会删除的!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/70431.html