这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战
Docker深入学习
1, 什么是容器数据卷?
Docker的理念就是将应用和环境打包成一个镜像,但是如果数据都在容器中,一旦将容器删除,所有的数据也都会被删除,那怎么才能让数据持久化。
就比如:mySql,如果容器删除了,数据库也会被删除,那怎么才能让数据可以存储在本地,容器之间可以有一个数据共享的技术。Docker容器中产生的数据同步到本地。,这就是卷技术,目录的挂载, 就是将容器内的目录挂载到Linux上面。
总结: 容器的持久化和同步操作,容器间也是可以数据共享的。
2, 使用数据卷?
方式一: 直接使用命令来挂载 -v
docker run -it -v 主机目录: 容器内目录
docker run -it -v /root/ceshi:/root centos /bin/bash
然后新开窗口执行下面的命令,查看详细的内容
# docker inspect 容器ID
docker inspect 69ac47116170
3,测试数据是否能同步
在容器的 /root目录下面新增一个文件,同时在主机内也会同步出现这个文件
注意:可理解双向绑定原理
下图是: 在容器中新增一个test.java文件,可以在主机内查看到该文件。
注意: 也可以反向操作。在主机的目录下修改文件内容,然后会主动同步到容器的目录下面
# 首先查看之前运行的容器
docker ps -a
# 然后运行指定的容器
docker start 上面的容器ID
# 进入刚才运行的容器里面
docker attach 上面的容器ID
# 进入容器后输出文件内容
cat test.java
总结:
1,停止容器
2,宿主机上修改文件
3,启动容器
4,容器内的数据依旧是同步的
挂载的好处:
以后修改只需要在本地修改即可,容器内会自动同步
4, 实战MySql挂载
目的:MySql的数据持久化问题
# 查找mySql
docker search mysql
# 获取mysql镜像
docker pull mysql:5.7
# 查看现有的镜像
docker images
# 启动镜像,并暴露端口号
# 注意:mysql要配置密码
# 官方:docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pd-d mysql:tag
-d:是后台运行
-p: 端口映射
-v: 数据卷挂载
-e: 环境配置
--name: 容器名字
[root@VM-0-7-centos home]# docker run -d -p 3310:3306 -v /root/mysql/conf:/etc/mysql/conf.d -v
/root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql001 mysql:5.7
9d369f3b4189dd8da8787a3c636352f660ece9d72b40c883592152eb7da2884e
# 启动成功之后,在本地使用navicat来测试一下
服务器的3310:映射容器的3306
1, 下载MySql完成
2, 启动不挂载
3, 本地通过navicat测试
总结: 假设我们删除了容器,可以发现挂载到本地的数据卷依旧没有丢失。这就实现了容器数据持久化功能。
5, 具名和匿名挂载
#1 匿名挂载
-v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx
[root@VM-0-7-centos mysql]# docker run -d -P --name nginx02 -v /etc/nginx nginx
ac5891eb1c0badc9d79fbe45ae78912cc25611f1a15c4f9898c68ffbac71c5d3
# 查看所有的volume的情况
docker volume ls
[root@VM-0-7-centos mysql]# docker volume ls
DRIVER VOLUME NAME
local 3b7e44aa46407ac1605d87751f71bf02c2de919ef1a830cb919c7a6a83b04d56
local a37fb05f90347ef7cc9c83e005f0e8eb0ba9a2a869b5c878f9a70191b76f7ea2
[root@VM-0-7-centos mysql]#
#2 具名挂载
docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx nginx
# 通过 -v 卷名:容器内路径
# 查看这个卷
docker volume inspect 具名
匿名挂载:
具名挂载:
查看指定具名:
注意:所有的docker容器内的卷,在没有指定目录的情况下都是在: /var/lib/docker/volumes/xxx/_data
如何确定是具名挂载还是匿名挂载,还是指定路径挂载
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径::容器内路径 #指定路径挂载
拓展:
# 通过 -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