Docker数据管理(数据卷+数据卷容器)

打印 上一主题 下一主题

主题 578|帖子 578|积分 1734

目录

一、Docker的数据管理

1、概述

Docker的数据管理是指在Docker容器中对数据进行存储、共享、备份和恒久化的方法和技术。它允许用户在保持容器轻量级的同时,确保容器产生的数据能够安全、高效地存储和管理。
2、主要的技术(三种数据挂载方式)

2.1、数据卷(Volumes)


  • 数据卷是Docker管理的、独立于容器的存储区域,提供了数据恒久化和容器间共享的本事。
  • 数据卷存储在Docker主机上的特定目录,默认是 /var/lib/docker/volumes/(Linux系统),并且可以在容器间共享而不依靠于任何单一容器的生命周期。
  • 纵然容器被删除,数据依然存在。
2.2、绑定挂载(Bind mounts)


  • 绑定挂载是将宿主机上的文件系统路径直接挂载到容器内的过程。
  • 这种方式允许直接利用宿主机的文件系统资源,但可能带来数据管理上的复杂性和安全性考量。
  • 绑定挂载的存储位置和数据格式完全由宿主机控制,不受到Docker的直接受理。
2.3、tmpfs挂载(Tmpfs mounts)


  • Tmpfs挂载是将数据存储在宿主机的内存中而不是磁盘上,适用于临时文件或对速度有高要求的场景。
  • 这种范例的存储不会恒久化,容器停止或宿主机重启后数据将会丢失。
  • 适合存储敏感信息或缓存数据,因其不会写入磁盘,可以增长安全性。
2.4、之间的关系(数据在Docker主机上的存储位置)


这篇我们主要学习数据卷
二、数据卷示例

1、创建一个定名的数据卷
  1. [root@localhost ~]# docker volume create web_data
  2. web_data
复制代码
2、修改数据卷内文件内容
  1. [root@localhost ~]# docker volume inspect web_data
  2. [
  3.     {
  4.         "CreatedAt": "2024-05-29T19:04:36+08:00",
  5.         "Driver": "local",
  6.         "Labels": null,
  7.         "Mountpoint": "/var/lib/docker/volumes/web_data/_data",
  8.         "Name": "web_data",
  9.         "Options": null,
  10.         "Scope": "local"
  11.     }
  12. ]
  13. #这里的/var/lib/docker/volumes/web_data/_data就是数据卷在宿主机上的路径。
  14. [root@localhost ~]# echo "nginx test" > /var/lib/docker/volumes/web_data/_data/index.html
  15. #直接在宿主机上通过找到的路径修改数据卷内的文件。
复制代码
3、启动两个容器并验证数据共享
  1. [root@localhost ~]# docker run -itd --name nginx_v1 -v web_data:/usr/share/nginx/html -p 8085:80 nginx
  2. 73a584b4345b6bb05f99e153f5a92e1aaaf14b183ffb2173cd4238e1bd4edf60
  3. [root@localhost ~]# docker run -itd --name nginx_v2 -v web_data:/usr/share/nginx/html -p 8086:80 nginx
  4. 5ce93af52b15d0f905fb749c483138f7e3247995186b9696709b3bd166bc10f6
  5. [root@localhost ~]# curl -s 192.168.112.60:8085
  6. nginx test
  7. [root@localhost ~]# curl -s 192.168.112.60:8086
  8. nginx test
复制代码

挂载在了相同宿主机目录到容器内的/usr/share/nginx/html路径,同时映射了不同的端口以区分访问。
可以看到数据内容是可以共享的,都体现nginx test
4、宿主机与容器间的及时同步

4.1、进入容器内部修改数据测试同步
  1. [root@localhost ~]# docker exec -it nginx_v1 /bin/bash
  2. root@73a584b4345b:/# echo "nginx test write !" > /usr/share/nginx/html/index.html
  3. root@73a584b4345b:/# exit
  4. exit
  5. [root@localhost ~]# curl -s 192.168.112.60:8085
  6. nginx test write !
  7. [root@localhost ~]# curl -s 192.168.112.60:8086
  8. nginx test write !
复制代码

4.2、宿主机修改数据测试同步
  1. [root@localhost ~]# echo "nginx test write twice" > /var/lib/docker/volumes/web_data/_data/index.html
  2. [root@localhost ~]# curl -s 192.168.112.60:8085                                                             nginx test write twice
  3. [root@localhost ~]# curl -s 192.168.112.60:8086                                                           nginx test write twice
复制代码

5、删除容器验证数据恒久性
  1. [root@localhost ~]# docker rm -fv  `docker ps -qa`
  2. 5ce93af52b15
  3. 73a584b4345b
  4. #这是删除所有容器的命令针对删除nginx_v1以及nginx_v2的命令如下:
  5. docker rm -fv nginx_v1
  6. docker rm -fv nginx_v2
  7. [root@localhost ~]# cat /var/lib/docker/volumes/web_data/_data/index.html
  8. nginx test write twice
复制代码
可以看到纵然所有使用该数据卷的容器都被删除,数据卷本身及其数据依然会被保留
直到显式执行 docker volume rm 命令来删除它。
6、只读挂载
  1. [root@localhost ~]# docker run -itd --name nginx_v3 -v web_data:/usr/share/nginx/html/:ro -p 8087:80 nginx
  2. 64737fc7e6fc60e6d4f6203735afb464bc3cdbacbacb92372e3112d35a3d1be8
  3. [root@localhost ~]# docker run -itd --name nginx_v4 -v web_data:/usr/share/nginx/html/:ro -p 8088:80 nginx
  4. fbb5c0dc949b2fca4d9e39b392d535233dfa57b48f348c028d1518cebd7a3560
  5. [root@localhost ~]# docker exec -it nginx_v3 /bin/bash
  6. root@64737fc7e6fc:/# echo "test readonly" > /usr/share/nginx/html/index.html
  7. bash: /usr/share/nginx/html/index.html: Read-only file system
复制代码
通过只读方式挂载以后,在容器内部是不允许修改数据的
三、数据卷案例:5.6版本MySQL数据迁移到MySQL5.7版本

1、创建一个定名的数据卷
  1. [root@localhost ~]# docker volume create mysql_data
  2. mysql_data
复制代码
2、Docker安装MySQL5.6版本
  1. [root@localhost ~]# docker run -d --name mysql-5.6 -p 3306:6606 -v mysql_data:/var/lib/mysql/ -e MYSQL_ROOT_PASSWORD=123 mysql:5.6
  2. [root@localhost ~]# cd /var/lib/docker/volumes/mysql_data/_data/
  3. [root@localhost _data]# ls
  4. auto.cnf  ibdata1  ib_logfile0  ib_logfile1  mysql  performance_schema
复制代码

  • -d: 表示后台运行容器(detached模式),即容器会在后台运行而不是与当前终端交互。
  • --name mysql-5.6: 为容器指定一个名字,这里是mysql-5.6,便于后续管理和识别。
  • -p 3306:3306: 端口映射配置,将宿主机的3306端口映射到容器内的3306端口。
  • -v mysql_data:/var/lib/mysql/: 数据卷挂载,mysql_data是数据卷的名称(假如没有事先创建,Docker会自动创建一个匿名数据卷),这个数据卷挂载到容器内的/var/lib/mysql/目录。
  • -e MYSQL_ROOT_PASSWORD=123: 设置环境变量,这里设置了MySQL的root用户的密码为123。
  • mysql:5.6: 这是Docker镜像的名称和标签,表示使用mysql镜像的5.6版本来创建容器。
3、进入容器创建数据
  1. [root@localhost _data]# docker exec -it mysql-5.6 /bin/bash
  2. root@7ef4b48ecbcf:/# cd /var/lib/mysql
  3. root@7ef4b48ecbcf:/var/lib/mysql# ls
  4. auto.cnf  ib_logfile0  ib_logfile1  ibdata1  mysql  performance_schema
  5. root@7ef4b48ecbcf:/var/lib/mysql# mysql -uroot -p123
复制代码
  1. mysql> create database test;
  2. mysql> use test;
  3. mysql> create table stu (id int(5),name varchar(20),age int(5));
  4. mysql> insert into stu values(1,"zhangsan",18);
复制代码
创建了个stu表插入了一条数据
4、删除mysql-5.6容器
  1. docker rm -f mysql-5.6
复制代码
5、Docker安装MySQL5.7版本
  1. [root@localhost ~]# docker run -d --privileged=true --name mysql-5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123 -v mysql_data:/var/lib/mysql/ mysql:5.7
复制代码
6、进入容器进行验证
  1. [root@localhost ~]# docker exec -it mysql-5.7 /bin/bash
  2. bash-4.2# mysql -uroot -p123
复制代码
  1. mysql> show databases;
  2. +--------------------+
  3. | Database           |
  4. +--------------------+
  5. | information_schema |
  6. | mysql              |
  7. | performance_schema |
  8. | test               |
  9. +--------------------+
  10. 4 rows in set (0.00 sec)
  11. mysql> use test;
  12. Reading table information for completion of table and column names
  13. You can turn off this feature to get a quicker startup with -A
  14. Database changed
  15. mysql> show tables;
  16. +----------------+
  17. | Tables_in_test |
  18. +----------------+
  19. | stu            |
  20. +----------------+
  21. 1 row in set (0.00 sec)
  22. mysql> select * from stu;
  23. +------+----------+------+
  24. | id   | name     | age  |
  25. +------+----------+------+
  26. |    1 | zhangsan |   18 |
  27. +------+----------+------+
  28. 1 row in set (0.00 sec)
复制代码
可以看到之前mysql-5.6创建的数据还在
四、数据卷容器

1、概述

数据卷容器是Docker中管理数据卷的一种高级用法,它允许用户创建一个专门用于数据存储的容器,并将其数据卷挂载到其他容器中。
这种方式使得数据可以跨容器共享,同时保持数据的恒久性和可移植性。
数据卷容器主要用于数据的恒久化存储和跨容器共享,它本身并不运行任何实际的应用服务,而是作为一个存储前言存在。
2、创建数据卷
  1. [root@localhost ~]# docker volume create my_volume
  2. my_volume
复制代码
3、查看所有的数据卷
  1. [root@localhost ~]# docker volume ls
  2. DRIVER    VOLUME NAME
  3. local     my_volume
  4. local     mysql_data
  5. local     web_data
复制代码
4、修改数据卷内文件内容
  1. [root@localhost ~]# echo "my_volume_test" > /var/lib/docker/volumes/my_volume/_data/index.html
复制代码
5、启动一个挂载数据卷的容器
  1. [root@localhost ~]# docker run -itd --name volume_v1 -v my_volume:/usr/share/nginx/html:ro -p 8089:80 nginx
  2. c9cff2a314fef930aa570680068e40c280a53d0921613b60d926c9ffd185200b
复制代码
6、启动两个客户端容器
  1. [root@localhost ~]# docker run -itd --name web1 -p 8090:80 --volumes-from volume_v1 nginx
  2. c036bb587750c2232e7e1efe11b4b421e2c0be275a0aec6da953e670ba6d47b0
  3. [root@localhost ~]# docker run -itd --name web2 -p 8091:80 --volumes-from volume_v1 nginx
  4. 9bff8f66a04d701b46f6e94d39664758e22fa4ab6140dd48a1ce0212bb59b941
复制代码
7、访问测试
  1. [root@localhost ~]# curl -s 192.168.112.60:8089
  2. my_volume_test
  3. [root@localhost ~]# curl -s 192.168.112.60:8090
  4. my_volume_test
  5. [root@localhost ~]# curl -s 192.168.112.60:8091
  6. my_volume_test
复制代码

8、停止了卷容器创建新容器也可以引用他
  1. [root@localhost ~]# docker stop volume_v1
  2. volume_v1
  3. [root@localhost ~]# docker ps -a
  4. CONTAINER ID   IMAGE     COMMAND                   CREATED         STATUS                     PORTS                                   NAMES
  5. 9bff8f66a04d   nginx     "/docker-entrypoint.…"   5 minutes ago   Up 5 minutes               0.0.0.0:8091->80/tcp, :::8091->80/tcp   web2
  6. c036bb587750   nginx     "/docker-entrypoint.…"   5 minutes ago   Up 5 minutes               0.0.0.0:8090->80/tcp, :::8090->80/tcp   web1
  7. c9cff2a314fe   nginx     "/docker-entrypoint.…"   8 minutes ago   Exited (0) 4 seconds ago                                           volume_v1
  8. #停止卷容器volume_v1
  9. [root@localhost ~]# docker run -itd --name web3 -p 8092:80 --volumes-from volume_v1 nginx
  10. 7e8a3e82e6aacf32e5194d4a47d827f718685e0811ffc478b09a6e1748fd997f
  11. [root@localhost ~]# curl -s 192.168.112.60:8092
  12. my_volume_test
  13. #可以获取my_volume数据卷的内容
复制代码
9、删除卷容器后无法依据卷容器创建新容器
  1. [root@localhost ~]# docker rm -f volume_v1
  2. volume_v1
  3. [root@localhost ~]# docker run -itd --name web4 -p 8093:80 --volumes-from volume_v1 nginx
  4. docker: Error response from daemon: No such container: volume_v1.
  5. See 'docker run --help'.
  6. [root@localhost ~]# curl 192.168.112.60:8089
  7. curl: (7) Failed connect to 192.168.112.60:8089; 拒绝连接
  8. [root@localhost ~]# curl 192.168.112.60:8090
  9. my_volume_test
  10. [root@localhost ~]# curl 192.168.112.60:8091
  11. my_volume_test
  12. [root@localhost ~]# curl 192.168.112.60:8092
  13. my_volume_test
  14. #之前创建好的容器不会有任何影响
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

勿忘初心做自己

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表