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 ls2)具名挂载
# 具名挂载:推荐 # 指明挂载点的文件名(卷名),不是路径 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 只指定容器内路径 |
| 具名挂载 | -v 卷名:容器内路径 |
| 指定路径挂载 | -v 宿主机指定路径:容器内路径 |
在容器内路径后面加 :ro 或 :rw
ro readonly 只读;容器内无法修改,只能在宿主机的挂载点操作rw readwrite 可读可写
docker run -d -P --name nginx05 -v juming:/etc/nginx:ro nginx5、初识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中的快捷方式),而是复制(备份),有多少个挂载容器,就会存在多少份数据,当一个容器中的挂载数据变化后,会同步到其它容器;当删除任意一个容器后,其它容器中的数据不受影响;所以数据卷容器的生命周期一直持续到没有容器使用为止,只要有一个挂载容器存在,数据就不会丢失。如果数据挂载到外部宿主机,那么即使所有容器删除,宿主机中的对应数据也是不会删除的!



