Docker进阶容器数据卷

Docker容器数据卷可以实现本机的本地文件和Dokcer容器里的文件夹或文件进行双向绑定,从而达到文件同步的效果,这样就不需要每次修改Docker容器配置文件就要进入容器,十分的方便快捷

1、基础概念

什么是容器数据卷?

程序运行是需要数据的,如果数据都在容器中,那么我们容器被删除了,数据就丢失了,例如,使用容器安装MySQL,容器删了,MySQL数据就没了

容器数据卷:容器之间可以有一个数据共享的技术,Docker可以将容器中产生的数据,同步到本地

为什么要用容器数据卷?

容器的持久化和同步操作,容器之间也是可以进行数据共享的

使用数据卷

使用centos镜像生成容器并实现数据卷挂载到本地

docker run -it -v E:/Docker/test:/home centos /bin/bash
​
# 查看是否挂载成功
docker ps
docker inspect dea61ecc553c
"Mounts": [
            {
                "Type": "bind",
                "Source": "E:/Docker/test",
                "Destination": "/home",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
        
# 容器内新建文件测试
touch test.java
ls
​
# 本地查看文件是否存在,结果是存在test.java的

这两个文件进行双向绑定,无论是在容器内修改,还是在本机修改,另外一个文件都会发生变化

2、实战:MySQL同步数据

# 启动mysql镜像
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名称
docker run -d -p 3310:3306 -v E:/Docker/MySQL/conf/:/etc/conf/conf.d -v E:/Docker/MySQL/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql
​
docker ps

注意:此时由于是本机启动的docker启动的MySQL镜像,连接MySQL服务时,需要使用本机IP地址进行连接

假设将容器彻底删除,本地的数据文件依旧还存在,不会因为容器的删除而丢失数据。

3、具名挂载和匿名挂载

# 匿名挂载
docker run -d -P --name nginx02 -v /etc/nginx nginx
​
docker volume --help
# 参数
  create      Create a volume
  inspect     Display detailed information on one or more volumes
  ls          List volumes
  prune       Remove all unused local volumes
  rm          Remove one or more volumes
# 查看本地所有 volume 情况
docker volume ls
# 结果
DRIVER    VOLUME NAME
local     5a9949ed0f54f12a8f49c89c689a0a29ea814f4e38989376398dde2c1004bba8
local     8ffd4a5aedeacc54d8473748dbed1d6fa90ef929df40e7b9e84ed83b34d1dc7d
local     b54f08994daf37d3db852aaa8f14ec97b07f125daf24524f2d2bfb9fc3163744
# 查看本地 volume的具体情况
docker volume inspect [VOLUME NAME]
# 结果
[
    {
        "CreatedAt": "2022-03-17T01:28:53Z",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/8ffd4a5aedeacc54d8473748dbed1d6fa90ef929df40e7b9e84ed83b34d1dc7d/_data",
        "Name": "8ffd4a5aedeacc54d8473748dbed1d6fa90ef929df40e7b9e84ed83b34d1dc7d",
        "Options": null,
        "Scope": "local"
    }
]
​
# 具名挂载
docker run -d -P --name nginx03 -v nginx03:/etc/nginx nginx
所有未指定目录的docker容器卷,都会放在 /var/lib/docker/volumes/xxx/_data 目录下

-v 容器内路径
​
-v 卷名:容器内路径
​
-v 主机路径:容器内路径
-v E:/Docker/MySQL/data:/var/lib/mysql
-v /e/Docker/MySQL/data:/var/lib/mysql
​
-v 主机路径:容器内路径:ro        # 容器内只读
-v 主机路径:容器内路径:rw        # 容器内可读可写

4、初识DockerFile

DockerFile就是用来构建Docker镜像的构建文件

DockerFile文件如下所示

# 创建一段脚本文件dockerfile01
# 这里的每个命令都是镜像的一层
FROM centos
​
VOLUME {"volume01","volume02"}
​
CMD echo "-----end-----"
​
CMD /bin/bash
​
# 运行生成镜像
docker build -f /home/docker-test/dockerfile01 -t huzeyo/centos:1.0 .

使用数据卷甚至可以让多个MySQL同步数据

5、数据卷容器

docker run -d -v E:/Docker/centos/data/:/home --name docker01 centos
​
docker run -d --name docker02 --volumes-from docker01 centos
​
docker run -d --name docker03 --volumes-from docker01 centos

这里的docker01叫做数据卷容器

如果将docker01停止并删除,docker02和docker03文件依旧存在

# 两个MySQL共享同步数据
docker run -d -p 3310:3306 -v E:/Docker/MySQL/conf/:/etc/conf/conf.d -v E:/Docker/MySQL/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql
​
docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只嘻嘻嘻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值