【Docker 系列】docker 学习 五,我们来看看容器数据卷到底是个啥

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 【Docker 系列】docker 学习 五,我们来看看容器数据卷到底是个啥

【Docker 系列】docker 学习 五,容器数据卷

什么是容器数据卷

思考一个问题,我们为什么要使用 Docker?

主要是为了可以将应用和环境进行打包成镜像,一键部署。

再思考一个问题,容器之间是相互隔离的,如果我们在容器中部署类似 mysql 这样的组件,如果把该容器删除掉,那么 mysql 的数据也会被删掉了,数据丢失了,咱们删库跑路真刺激

事实上,我们可不能让这么有风险的事情存在,因此有了卷技术

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

例如咱们将 Docker mysql 容器中的 /usr/mysql 目录挂载到宿主机的/home/mysql 目录

image.png

使用卷技术,我们就可以让数据得以持久化

实际上操作起来就是挂载目录,将 Docker 容器里面的目录,挂载到宿主机上的某个目录,这就可以将数据持久化和同步了, Docker 容器间的数据共享仍然是这样做的

咱们如何使用数据卷?

启动容器的时候,直接使用 -v命令就可以进行数据卷的挂载


docker run -it -v 宿主机目录:容器目录 镜像名

我们来尝试启动一个 nginx,并将宿主机的 /home/test 目录和 nginx 的/home目录挂载起来


#docker run -d -v /home/test:/home nginx

此时我们在宿主机的/home/test目录下建一个 test.txt 并且写入一些字符串,再查看容器的 /home 目录 是否有 test.txt


# 宿主机
root@iZuf66y3tuzn4wp3h02t7pZ:/home/test# echo xiaomotong >> test.txt
# 容器
root@c8405d03a9a1:/home# ls
test.txt
root@c8405d03a9a1:/home# cat test.txt
xiaomotong

我们在容器的/home 目录下创建一个test2.txt 文件,同样写入一些字符串,再查看 宿主机的 /home/test 目录是否有 test2.txt

# 容器
root@c8405d03a9a1:/home# echo xiaozhu >> test2.txt
# 宿主机
root@iZuf66y3tuzn4wp3h02t7pZ:/home/test# ls
test2.txt  test.txt
root@iZuf66y3tuzn4wp3h02t7pZ:/home/test# cat test2.txt
xiaozhu

查看上述效果,果然是挂载 ok,数据确实同步了,哪怕是我们把 docker 容器删除掉,数据也不会丢失

docker inspect 容器ID ,查看一下我们创建的容器的挂载情况

# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                  NAMES
c8405d03a9a1   nginx     "/docker-entrypoint.…"   9 minutes ago   Up 9 minutes   80/tcp                 nginx2
# docker inspect c8405d03a9a1
[
  ...
  "Mounts": [
            {
                "Type": "bind",
                "Source": "/home/test",
                "Destination": "/home",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
  ...
]

使用容器数据卷的便利之处:

以后我们只需要修改宿主机里面的目录和文件,即可和容器中的指定目录保持同步

mysql 实战一波

咱们再来一个实战,我们一起来看看数据卷如何使用

下载 5.7 版本的 mysql docker 镜像,也可以下载其他版本,这个没有关系

# docker pull mysql:5.7
5.7: Pulling from library/mysql   # 5.7版本
33847f680f63: Already exists    # 本层级已经之前已经下载过了
5cb67864e624: Pull complete
1a2b594783f5: Pull complete
b30e406dd925: Pull complete
48901e306e4c: Pull complete
603d2b7147fd: Pull complete
802aa684c1c4: Pull complete
5b5a19178915: Pull complete
f9ce7411c6e4: Pull complete
f51f6977d9b2: Pull complete
aeb6b16ce012: Pull complete
Digest: sha256:be70d18aedc37927293e7947c8de41ae6490ecd4c79df1db40d1b5b5af7d9596
Status: Downloaded newer image for mysql:5.7  
docker.io/library/mysql:5.7     # 真实的mysql 镜像地址

启动镜像,直接使用 -v 来挂载目录

使用方式


docker run -it -v 主机目录:容器的目录

开始启动镜像

咱们可以参考 dockerhub 上的文档


image.png

image.png

# docker run  -d -p 8888:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql1 mysql:5.7
23c31b285804cd95130e36ad40d3c07239fe744845ca464b9c80e42c84848bfb
# 解释一下上述命令
-d 后台运行
-p 宿主机端口:容器端口  端口映射
-v 宿主机目录:容器目录  挂载卷
-e 设置环境变量
--name 设置启动容器的名字

咱们可以通过window 的 workbench 来远程连接一下 mysql

我的是云服务器,因此输入云服务器的地址,端口填入 8888 端口

默认用户名是 root , 密码是 123456

image.png

测试连接 ok ,我们可以来进入数据库

image.png

咱们在 workbench 中新建一个数据库

看看这个数据库是否会在我们的宿主机上面有同步

image.png

查看我们挂载宿主机的目录 /home/mysql/data

root@iZuf66y3tuzn4wp3h02t7pZ:/home/mysql/data#ls
auto.cnf    ca.pem           client-key.pem  ibdata1      ib_logfile1  mysql               private_key.pem  server-cert.pem  sys
ca-key.pem  client-cert.pem  ib_buffer_pool  ib_logfile0  ibtmp1       performance_schema  public_key.pem   server-key.pem   test


image.png

果然是有的,再次 nice,这就达到了数据持久化的效果,这就是咱们从认识数据卷到使用数据卷的一个简单流程,咱们可以慢慢的深入下去

具名挂载和匿名挂载

以启动一个 nginx 为例子:

具名挂载:


# docker run -d  --name nginx3 -v JM:/etc/nginx:rw nginx

匿名挂载:


# docker run -d  --name nginx3 -v /etc/nginx:rw nginx

上述的 rw也可以写成ro

  • rw

可读可写

  • ro

只读,只能宿主机才能写

查看数据挂载卷


root@iZuf66y3tuzn4wp3h02t7pZ:/home/mysql# docker volume ls
DRIVER    VOLUME NAME
local     JM    # 具名挂载 ,下面的为匿名挂载
local     bd2b9ea00eb7d95bb69bdd39a63769ce906a0bb17fae2e29b726f9b92cbcb008
local         d67ba49109dfd654173b8d05f8602b99751066483a357c654b63ba46ec72d5c0

查看挂载具体目录


l# docker volume inspect JM
[
    {
        "CreatedAt": "2021-08-04T23:48:05+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/JM/_data",
        "Name": "JM",
        "Options": null,
        "Scope": "local"
    }
]

查看该目录下的挂载文件,是否是和 nginx 容器中的 /etc/nginx目录下内容一致


root@iZuf66y3tuzn4wp3h02t7pZ:/var/lib/docker/volumes/JM/_data# ll
total 36
drwxr-xr-x 3 root root 4096 Aug  4 23:48 ./
drwx-----x 3 root root 4096 Aug  4 23:48 ../
drwxr-xr-x 2 root root 4096 Aug  4 23:48 conf.d/
-rw-r--r-- 1 root root 1007 Jul  6 22:59 fastcgi_params
-rw-r--r-- 1 root root 5290 Jul  6 22:59 mime.types
lrwxrwxrwx 1 root root   22 Jul  6 23:11 modules -> /usr/lib/nginx/modules
-rw-r--r-- 1 root root  648 Jul  6 23:11 nginx.conf
-rw-r--r-- 1 root root  636 Jul  6 22:59 scgi_params
-rw-r--r-- 1 root root  664 Jul  6 22:59 uwsgi_params

果然一毛一样,nice

再来看看 docker 默认的挂载目录 /var/lib/docker/volumes,我们可以看到每一个匿名挂载,和具名挂载的目录和数据都存放于此


root@iZuf66y3tuzn4wp3h02t7pZ:/var/lib/docker/volumes# ll
total 44
drwx-----x  5 root root   4096 Aug  4 23:48 ./
drwx--x--x 13 root root   4096 Aug  3 22:58 ../
brw-------  1 root root 252, 1 Aug  3 22:58 backingFsBlockDev
drwx-----x  3 root root   4096 Aug  1 21:36 bd2b9ea00eb7d95bb69bdd39a63769ce906a0bb17fae2e29b726f9b92cbcb008/
drwx-----x  3 root root   4096 Aug  3 23:32 d67ba49109dfd654173b8d05f8602b99751066483a357c654b63ba46ec72d5c0/
drwx-----x  3 root root   4096 Aug  4 23:48 JM/
-rw-------  1 root root  32768 Aug  4 23:48 metadata.db

我们来小结一下

  • 指定挂载

-v  宿主机的绝对路径:容器路径

  • 具名挂载

-v 卷名:容器路径

  • 匿名挂载

-v 容器路径

参考资料:

docker docs

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

image.png

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
28 2
|
4天前
|
运维 Cloud Native 虚拟化
一文吃透云原生 Docker 容器,建议收藏!
本文深入解析云原生Docker容器技术,涵盖容器与Docker的概念、优势、架构设计及应用场景等,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
一文吃透云原生 Docker 容器,建议收藏!
|
12天前
|
关系型数据库 MySQL API
|
8天前
|
运维 持续交付 Docker
深入理解Docker容器化技术
深入理解Docker容器化技术
|
18天前
|
SQL 关系型数据库 数据库
国产数据实战之docker部署MyWebSQL数据库管理工具
【10月更文挑战第23天】国产数据实战之docker部署MyWebSQL数据库管理工具
58 4
国产数据实战之docker部署MyWebSQL数据库管理工具
|
5天前
|
缓存 监控 开发者
掌握Docker容器化技术:提升开发效率的利器
在现代软件开发中,Docker容器化技术成为提升开发效率和应用部署灵活性的重要工具。本文介绍Docker的基本概念,并分享Dockerfile最佳实践、容器网络配置、环境变量和秘密管理、容器监控与日志管理、Docker Compose以及CI/CD集成等技巧,帮助开发者更高效地利用Docker。
|
6天前
|
监控 持续交付 Docker
Docker 容器化部署在微服务架构中的应用有哪些?
Docker 容器化部署在微服务架构中的应用有哪些?
|
6天前
|
监控 持续交付 Docker
Docker容器化部署在微服务架构中的应用
Docker容器化部署在微服务架构中的应用
|
6天前
|
安全 持续交付 Docker
微服务架构和 Docker 容器化部署的优点是什么?
微服务架构和 Docker 容器化部署的优点是什么?
|
8天前
|
关系型数据库 数据管理 应用服务中间件
【赵渝强老师】Docker的数据持久化
在生产环境中使用Docker时,为了实现数据的持久化和共享,可以通过数据卷(Data Volumes)和数据卷容器(Data Volume Containers)两种方式来管理数据。数据卷是一个独立于容器的挂载目录,可以跨多个容器共享和重用。数据卷容器则是一种特殊容器,用于维护数据卷,便于数据迁移和共享。本文通过示例详细介绍了这两种方法的使用步骤。