陈奇网络工作室

Docker数据持久性和容器与容器数据共享

云计算

一.前言

使用docker创建mysql容器时,数据将存储在容器中。

如果有一天不小心运行了dockerrm$(dockerps-AQ )并删除了所有的container .Mysql中的数据也会被删除。 这不安全。

必须将数据永久化并保存在容器外部。 删除容器不会删除原始数据。

二.容器缺陷

容器中的数据可以存储在容器层中。 但是,在容器层中存储数据存在以下问题。

1 .数据不是永久化的。 意思是容器被删除后,这些数据也将消失

2 .主机上的其他进程无权访问这些数据

3 .到这些数据的I/O通过存储驱动器到达主机,并引入间接层,导致性能下降

三、data volume有两种挂载方式。

1 ) bind mount (用户管理)将主机计算机上的某个目录或文件(不能是未格式化的磁盘文件)装载到容器上。 默认情况下,在容器中对该目录具有读写权限。 如果您不想仅通过向容器中添加文件来复盖目录,则需要注意源文件必须存在。 如果不存在,则作为目录被绑定mount。

2 ) dockermanagervolume(docker自动管理) :无需指定源文件,只需指定挂载点。 我本地映射了容器中的目录。

这种方式与bind mount相比有缺点,就是不能限制对容器内的目录和文件的权限。

在第二种装载方法中,如果在-v装载期间不指定源文件的位置,则缺省装载路径为:

[root@sqm-docker01 _data]# pwd

/var/lib/docker/volumes/DD 173640 edd 5b 0205 bb 02f 3c 4139647 be 12528 b 38289 B9 f 93 f 18123 a 6b 1266 A8/_ data

如果有#目录挂载,缺省情况下将在/var/lib/docker/volumes/下生成一组散列值。 hash值下是_data目录,容器中映射的文件位于此路径下。

四.存储驱动程序

数据存储方式

Centos7版本的docker、Storage Driver (数据存储方法)是overlay2、Backing Filesystem (备份文件系统)文件系统类型) xfs

您可以使用“文档输入容器名称”来查看如何存储数据

五. Data Volume

( Bind mount )

永久存储—本质上是DockerHost文件系统中的目录或文件,可以直接装载到容器的文件系统中。 运行容器时,可以用-v实现。

特点:

**1. Data Volume是一个目录或文件,不能是未格式化的磁盘(块设备)。

容器可以读写volume的数据。

即使正在使用的容器已被销毁,也可以永久保存Volume数据。 **

小实验:

运行nginx服务并进行数据永久化

1 )数据卷是一个目录或文件,不能是未格式化的盘(块设备)。

[root@docker01 ~]# mkdir html

//创建测试目录

[root@docker01 ~]# cd html/

[ root @ docker 01 html ] # echothisisatestfileindockerhost.index.html

//创建测试页

[ root @ docker 01~~ ] # docker run-itd-- name testweb-v/root/html/:/usr/share/nginx/html nginx:latest

运行nginx容器并挂载目录

[ root @ docker 01~] # dockerinspecttestweb

[ root @ docker 01~] # curl 172.17.0.3

注:必须在dockerhost上装载的源文件或目录必须已经存在。 如果不存在,则会作为目录挂载在容器上。

)2)容器可以读写volume的数据。

[ root @ docker 01~] # docker exec-it testweb/bin/bash

root @ e F12 d 312 a 94e://# CD/usr/share/nginx/html /

root @ e F12 d 312 a 94e:/usr/share/nginx/html # echoupdateindex.html

//容器中更西部数码代理商页面

root @ e F12 d 312 a 94e:/usr/share/nginx/html # exit

[ root @ docker 01~] # cathtml/index.html

//可以看到主机目录的安装目录也被更新了

)3) Volume数据可以永久保存,即使使用它的容器被销毁,也可以通过重新启动主机目录中悬挂的名为容器装载的目录进行访问。

[ root @ docker 01~] # docker PS-a-q|xargsdockerrm-f

//删除所有容器

[ root @ docker 01~] # cathtml/index.html

//删除容器后,还有宿主机测试页

[ root @ docker 01~~ ] # docker run-itd-- name t1-p-v/root/html/:/usr/share/nginx/html nginx:latest

//根据测试页制作集装箱

[root@docker01 ~]# docker ps

[ root @ docker 01~] # curl 127.0.0.1:32768

//访问看看

[ root @ docker 01~] # echo update-newhtml/index.html

//再次刷新测试页

[ root @ docker 01~] # curl 127.0.0.1:32768

//在旅馆的主机上更新测试页,也更新刚制作的集装箱的测试页

)5)默认装载在容器中的文件对容器具有读写权限。 可以通过在执行容器为-v后加上“: ro”来限制容器的写入权限

[ root @ docker 01~~ ] # docker run-itd-- name T2-p-v/root/html/:/usr/share/nginx/html:ro nginx:latest

//创建容器并设置读取权限

[ root @ docker 01~] # docker exec-it T2/bin/bash

//进入容器

root @ 4739 c0f5d 970://# CD/usr/share/nginx/html

root @ 4739 c0f5d 970:/usr/share/nginx/html # echo 1234 index.html

//修改测试页(由于是只读而失败) ) )。

[ root @ docker 01~] # echo 654321 html/index.html

//宿主机可以更改

[ root @ docker 01~] # curl 127.0.0.1:32768

)6)也可以将单个文件装载到容器内部。 一般来说,如果他的使用场景只希望添加某个文件,而不是覆盖整个目录,则可以装载单个文件。

1测试1

[ root @ docker 01~~ ] # docker run-itd-- name V6-p-v/root/html/index.html:/usr/share/nginx/html/ind

[root@docker01 ~]# docker ps

[ root @ docker 01~] # curl 127.0.0.1:32770

1测试2

[ root @ docker 01~] # echo test test.html

[ root @ docker 01~~ ] # docker run-itd-- Nam et8-p-v/root/test.html:/usr/share/nginx/html/test.html

[ root @ docker 01~] # curl 127.0.0.1:32772/test.html

六.文档管理器卷

由于目录是自动在宿主机上生成的,因此装载目录时只写入容器中的目录。

特性与上面的bind mount基本相同

[ root @ docker 01~~ ] # docker run-itd-- name t1-p-v/usr/share/nginx/html nginx:latest

[root@docker01 ~]# docker ps

[ root @ docker 01~] # dockerinspectt 1

[ root @ docker 01 _ data ] # CD/var/lib/docker/volumes/17c 50 a 065 a 6b 10 CCD 01 ca 1ce 8091 fdf 6282 DC9DC b77 a 0f 69590067 ECC 0067

[ root @ docker 01 _ data ] # echothisisatestfileindex.html

[root@docker01 _data]# docker ps

[ root @ docker 01 _ data ] # curl 127.0.0.1:32777

[ root @ docker 01 _ data ] # dockervolumels

[ root @ docker 01 _ data ] # docker rmt1- f

[ root @ docker 01 _ data ] # cat index.html

1 .删除容器操作在默认情况下不会对dockerhost上的源文件执行。 如果删除容器时还希望删除源文件,则可以在删除容器时添加-v选项。 (一般不推荐使用此方法,因为其他容器可能会使用该文件。 )

[ root @ docker 01 _ data ] # docker run-itd-- name T2-p-v/usr/share/nginx/html nginx:latest

[ root @ docker 01~] # dockerinspectt 2

[ root @ docker 01~] # CD/var/lib/docker/volumes/2781 DBF DC 673 fc 7d 149 DC 4f 6217 ef 277 Fe 72e 05 ba 2e 20 FCE bb 617 AFE 97 eeeccb 30 /

[ root @ docker 01 _ data ] # docker RM-vt2-f

t2 .

[root@docker01 _data]# ls

七.集装箱和集装箱数据共享

卷容器—为其他容器提供卷存储卷的容器。 它还可以提供绑定装载和文档管理器卷。

创建vc_data容器

[ root @ docker 01~~ ] # docker create-- name VC _ data-v~/html:/usr/share/nginx/html-v/other/useful /

[ root @ docker 01~] # dockerinspectvc _ data

[ root @ docker 01~~ ] # docker run-itd-- name T3-p-- volumes-from VC _ data nginx:latest

[root@docker01 ~]# docker ps

[ root @ docker 01~] # curl 127.0.0.1:32779

八.集装箱跨主机数据共享

实验环境

文档01

文档02

httpd

nfs

请求: docker01和docker02的主目录相同。

准备工作

[ root @ localhost~] # hostnamectlset-hostname NFS

[ root @ localhost~] # hostnamectlset-hostname docker 01

[ root @ localhost~] # hostnamectlset-hostname docker 02

nfs操作

[ root @ localhost~] # yum-yinstallnfs-utils

//下载NFS服务

[root@nfs ~]# mkdir /datashare

//创建共享目录

[root@nfs ~]# vim /etc/exports

//将权限设定如下

/datashare*(rw,sync,no_root_squash ) )。

启用服务

[ root @ NFS~] # systemctlstartrpcbind

[ root @ NFS~] # systemctlenablerpcbind

[ root @ NFS~] # systemctlstartnfs-server

[ root @ NFS~] #系统mctlenablenfs-server

docker01和docker02测试nfs

[ root @ docker 01 htdocs ] # showmount-e 192.168.1.20

[ root @ docker 02 htdocs ] # showmount-e 192.168.1.20

文档01操作

[root@docker02 ~]# mkdir /xxx

[ root @ docker 01~] # mount-tnfs 192.168.1.10:/data share/XXX

//在NFS上挂载共享目录

[root@docker01 ~]# mount | tail -1

//检查是否安装

nfs创建测试文件

[root@nfs ~]# cd datashare/

[ root @ nfsdatashare ] # vimindex.html

div id=datetime

脚本

setinterval ( document.getelementbyid (\\ & amp; #039; datetime\\& quot; innerhtml=newdate ).toLocaleString ); 1000;

/脚本

/div

xgp666

让我们来看看docker01

文档02的操作与文档01相同

现在,我们不考虑将代码写入镜像,而是这样分别在docker01和docker02上部署httpd服务

[ root @ docker 01~~ ] # docker run-itd-- namebdqn-web1- p-v/XXX/:/usr/local/Apache2/htdocs htpd:latest

[ root @ docker 02~~ ] # docker run-itd-- namebdqn-web2- p-v/XXX/:/usr/local/Apache2/htdocs htpd:latest

[root@docker01 ~]# docker ps

//查看端口

0.0.0.0:32775-80/tcp bdqn-web

[root@docker02 ~]# docker ps

//查看端口

0.0.0.0:32769-80/tcp bdqn-web2

如果在浏览器中进行访问,则这两个WEB服务的主界面相同。 但是,如果NFS服务器上的源文件丢失,则为、

两个web服务都会变得异常。

设法将元数据写入镜像中,并在镜像基础上创建vc_data容器。 因为此处没有接触到docker-compose和docker-swarm等docker组织工具,所以必须手动创建镜像!

nfs操作

[ root @ nfsdatashare ] # echo xgp 666 index.html

//修改测试文件

文档02操作

[root@docker02 ~]# cd /xxx/

[ root @ docker 02 XXX ] # vimdockerfile

写文档文件

[ root @ docker 02 XXX ] # catdockerfile

FROM busybox

addindex.html/usr/local/Apache2/htdocs/index.html

volume/usr/local/Apache2/htdocs

创建镜像并运行容器

[ root @ docker 02 XXX ] # docker build-tback _ data。

基于文档文件创建镜像

[ root @ docker 02 XXX ] # docker create-- name back _ container1back _ data:latest

//基于刚创建的镜像创建容器

运行容器并导出镜像

[ root @ docker 02 XXX ] # docker run-itd-- namebdqn-web3- p-- volumes-from back _ container1httpd:latest

//驾驶一辆集装箱

[ root @ docker 02 XXX ] # dockersaveback _ data.tar back _ data:latest

//导出镜像,共享目录,因此在docker01中也能看到

文档01

[ root @ docker 01 XXX ] # docker load-iback _ data.tar

//转到共享目录并导入镜像

[ root @ docker 01 XXX ] # docker create-- name back _ container2back _ data:latest

//基于刚创建的镜像运行容器

[ root @ docker 01 XXX ] # docker run-itd-- namebdqn-web4-p-- volumes-from back _ container2httpd:latest

//驾驶一辆集装箱

浏览器访问

[root@docker01 ~]# docker ps

//查看端口

0.0.0.0:32776-80/tcp bdqn-web4

[root@docker02 ~]# docker ps

//查看端口

0.0.0.0:32770-80/tcp bdqn-web3

详情请访问云服务器、域名注册、虚拟主机的问题,请访问西部数码代理商官方网站: www.chenqinet.cn

相关推荐

后台-系统设置-扩展变量-手机广告位-内容页底部广告位3