网站 关键词库,上海建设网站哪家好,炫酷特效网站,mvc做的网站如何发布访问文章目录 一、Docker的数据管理1、概述2、主要的技术#xff08;三种数据挂载方式#xff09;2.1、数据卷#xff08;Volumes#xff09;2.2、绑定挂载#xff08;Bind mounts#xff09;2.3、tmpfs挂载#xff08;Tmpfs mounts#xff09;2.4、之间的关系#xff08;… 文章目录 一、Docker的数据管理1、概述2、主要的技术三种数据挂载方式2.1、数据卷Volumes2.2、绑定挂载Bind mounts2.3、tmpfs挂载Tmpfs mounts2.4、之间的关系数据在Docker主机上的存储位置 二、数据卷示例1、创建一个命名的数据卷2、修改数据卷内文件内容3、启动两个容器并验证数据共享4、宿主机与容器间的实时同步4.1、进入容器内部修改数据测试同步4.2、宿主机修改数据测试同步 5、删除容器验证数据持久性6、只读挂载 三、数据卷案例5.6版本MySQL数据迁移到MySQL5.7版本1、创建一个命名的数据卷2、Docker安装MySQL5.6版本3、进入容器创建数据4、删除mysql-5.6容器5、Docker安装MySQL5.7版本6、进入容器进行验证 四、数据卷容器1、概述2、创建数据卷3、查看所有的数据卷4、修改数据卷内文件内容5、启动一个挂载数据卷的容器6、启动两个客户端容器7、访问测试8、停止了卷容器创建新容器也可以引用他9、删除卷容器后无法依据卷容器创建新容器 一、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、创建一个命名的数据卷
[rootlocalhost ~]# docker volume create web_data
web_data2、修改数据卷内文件内容
[rootlocalhost ~]# docker volume inspect web_data
[{CreatedAt: 2024-05-29T19:04:3608:00,Driver: local,Labels: null,Mountpoint: /var/lib/docker/volumes/web_data/_data,Name: web_data,Options: null,Scope: local}
]
#这里的/var/lib/docker/volumes/web_data/_data就是数据卷在宿主机上的路径。[rootlocalhost ~]# echo nginx test /var/lib/docker/volumes/web_data/_data/index.html
#直接在宿主机上通过找到的路径修改数据卷内的文件。3、启动两个容器并验证数据共享
[rootlocalhost ~]# docker run -itd --name nginx_v1 -v web_data:/usr/share/nginx/html -p 8085:80 nginx
73a584b4345b6bb05f99e153f5a92e1aaaf14b183ffb2173cd4238e1bd4edf60
[rootlocalhost ~]# docker run -itd --name nginx_v2 -v web_data:/usr/share/nginx/html -p 8086:80 nginx
5ce93af52b15d0f905fb749c483138f7e3247995186b9696709b3bd166bc10f6
[rootlocalhost ~]# curl -s 192.168.112.60:8085
nginx test
[rootlocalhost ~]# curl -s 192.168.112.60:8086
nginx test挂载在了相同宿主机目录到容器内的/usr/share/nginx/html路径同时映射了不同的端口以区分访问。 可以看到数据内容是可以共享的都显示nginx test 4、宿主机与容器间的实时同步
4.1、进入容器内部修改数据测试同步
[rootlocalhost ~]# docker exec -it nginx_v1 /bin/bash
root73a584b4345b:/# echo nginx test write ! /usr/share/nginx/html/index.html
root73a584b4345b:/# exit
exit
[rootlocalhost ~]# curl -s 192.168.112.60:8085
nginx test write !
[rootlocalhost ~]# curl -s 192.168.112.60:8086
nginx test write !4.2、宿主机修改数据测试同步
[rootlocalhost ~]# echo nginx test write twice /var/lib/docker/volumes/web_data/_data/index.html
[rootlocalhost ~]# curl -s 192.168.112.60:8085 nginx test write twice
[rootlocalhost ~]# curl -s 192.168.112.60:8086 nginx test write twice5、删除容器验证数据持久性
[rootlocalhost ~]# docker rm -fv docker ps -qa
5ce93af52b15
73a584b4345b
#这是删除所有容器的命令针对删除nginx_v1以及nginx_v2的命令如下
docker rm -fv nginx_v1
docker rm -fv nginx_v2[rootlocalhost ~]# cat /var/lib/docker/volumes/web_data/_data/index.html
nginx test write twice可以看到即使所有使用该数据卷的容器都被删除数据卷本身及其数据依然会被保留 直到显式执行 docker volume rm 命令来删除它。 6、只读挂载
[rootlocalhost ~]# docker run -itd --name nginx_v3 -v web_data:/usr/share/nginx/html/:ro -p 8087:80 nginx
64737fc7e6fc60e6d4f6203735afb464bc3cdbacbacb92372e3112d35a3d1be8
[rootlocalhost ~]# docker run -itd --name nginx_v4 -v web_data:/usr/share/nginx/html/:ro -p 8088:80 nginx
fbb5c0dc949b2fca4d9e39b392d535233dfa57b48f348c028d1518cebd7a3560
[rootlocalhost ~]# docker exec -it nginx_v3 /bin/bash
root64737fc7e6fc:/# echo test readonly /usr/share/nginx/html/index.html
bash: /usr/share/nginx/html/index.html: Read-only file system通过只读方式挂载以后在容器内部是不允许修改数据的 三、数据卷案例5.6版本MySQL数据迁移到MySQL5.7版本
1、创建一个命名的数据卷
[rootlocalhost ~]# docker volume create mysql_data
mysql_data2、Docker安装MySQL5.6版本
[rootlocalhost ~]# docker run -d --name mysql-5.6 -p 3306:6606 -v mysql_data:/var/lib/mysql/ -e MYSQL_ROOT_PASSWORD123 mysql:5.6
[rootlocalhost ~]# cd /var/lib/docker/volumes/mysql_data/_data/
[rootlocalhost _data]# ls
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_PASSWORD123: 设置环境变量这里设置了MySQL的root用户的密码为123。mysql:5.6: 这是Docker镜像的名称和标签表示使用mysql镜像的5.6版本来创建容器。
3、进入容器创建数据
[rootlocalhost _data]# docker exec -it mysql-5.6 /bin/bash
root7ef4b48ecbcf:/# cd /var/lib/mysql
root7ef4b48ecbcf:/var/lib/mysql# ls
auto.cnf ib_logfile0 ib_logfile1 ibdata1 mysql performance_schema
root7ef4b48ecbcf:/var/lib/mysql# mysql -uroot -p123mysql create database test;
mysql use test;
mysql create table stu (id int(5),name varchar(20),age int(5));
mysql insert into stu values(1,zhangsan,18);创建了个stu表插入了一条数据 4、删除mysql-5.6容器
docker rm -f mysql-5.65、Docker安装MySQL5.7版本
[rootlocalhost ~]# docker run -d --privilegedtrue --name mysql-5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD123 -v mysql_data:/var/lib/mysql/ mysql:5.76、进入容器进行验证
[rootlocalhost ~]# docker exec -it mysql-5.7 /bin/bash
bash-4.2# mysql -uroot -p123mysql show databases;
--------------------
| Database |
--------------------
| information_schema |
| mysql |
| performance_schema |
| test |
--------------------
4 rows in set (0.00 sec)mysql use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
mysql show tables;
----------------
| Tables_in_test |
----------------
| stu |
----------------
1 row in set (0.00 sec)mysql select * from stu;
----------------------
| id | name | age |
----------------------
| 1 | zhangsan | 18 |
----------------------
1 row in set (0.00 sec)可以看到之前mysql-5.6创建的数据还在 四、数据卷容器
1、概述
数据卷容器是Docker中管理数据卷的一种高级用法它允许用户创建一个专门用于数据存储的容器并将其数据卷挂载到其他容器中。
这种方式使得数据可以跨容器共享同时保持数据的持久性和可移植性。
数据卷容器主要用于数据的持久化存储和跨容器共享它本身并不运行任何实际的应用服务而是作为一个存储媒介存在。
2、创建数据卷
[rootlocalhost ~]# docker volume create my_volume
my_volume3、查看所有的数据卷
[rootlocalhost ~]# docker volume ls
DRIVER VOLUME NAME
local my_volume
local mysql_data
local web_data4、修改数据卷内文件内容
[rootlocalhost ~]# echo my_volume_test /var/lib/docker/volumes/my_volume/_data/index.html5、启动一个挂载数据卷的容器
[rootlocalhost ~]# docker run -itd --name volume_v1 -v my_volume:/usr/share/nginx/html:ro -p 8089:80 nginx
c9cff2a314fef930aa570680068e40c280a53d0921613b60d926c9ffd185200b6、启动两个客户端容器
[rootlocalhost ~]# docker run -itd --name web1 -p 8090:80 --volumes-from volume_v1 nginx
c036bb587750c2232e7e1efe11b4b421e2c0be275a0aec6da953e670ba6d47b0
[rootlocalhost ~]# docker run -itd --name web2 -p 8091:80 --volumes-from volume_v1 nginx
9bff8f66a04d701b46f6e94d39664758e22fa4ab6140dd48a1ce0212bb59b9417、访问测试
[rootlocalhost ~]# curl -s 192.168.112.60:8089
my_volume_test
[rootlocalhost ~]# curl -s 192.168.112.60:8090
my_volume_test
[rootlocalhost ~]# curl -s 192.168.112.60:8091
my_volume_test8、停止了卷容器创建新容器也可以引用他
[rootlocalhost ~]# docker stop volume_v1
volume_v1
[rootlocalhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9bff8f66a04d nginx /docker-entrypoint.… 5 minutes ago Up 5 minutes 0.0.0.0:8091-80/tcp, :::8091-80/tcp web2
c036bb587750 nginx /docker-entrypoint.… 5 minutes ago Up 5 minutes 0.0.0.0:8090-80/tcp, :::8090-80/tcp web1
c9cff2a314fe nginx /docker-entrypoint.… 8 minutes ago Exited (0) 4 seconds ago volume_v1
#停止卷容器volume_v1[rootlocalhost ~]# docker run -itd --name web3 -p 8092:80 --volumes-from volume_v1 nginx
7e8a3e82e6aacf32e5194d4a47d827f718685e0811ffc478b09a6e1748fd997f
[rootlocalhost ~]# curl -s 192.168.112.60:8092
my_volume_test
#可以获取my_volume数据卷的内容9、删除卷容器后无法依据卷容器创建新容器
[rootlocalhost ~]# docker rm -f volume_v1
volume_v1
[rootlocalhost ~]# docker run -itd --name web4 -p 8093:80 --volumes-from volume_v1 nginx
docker: Error response from daemon: No such container: volume_v1.
See docker run --help.[rootlocalhost ~]# curl 192.168.112.60:8089
curl: (7) Failed connect to 192.168.112.60:8089; 拒绝连接
[rootlocalhost ~]# curl 192.168.112.60:8090
my_volume_test
[rootlocalhost ~]# curl 192.168.112.60:8091
my_volume_test
[rootlocalhost ~]# curl 192.168.112.60:8092
my_volume_test
#之前创建好的容器不会有任何影响