Docker持久化存储之数据共享

持久化存储 Data volume

要知道容器是有生命周期的。
docker默认的存储方式:存储类型:(strage driver:overlay2.xfs)

data volume有两种挂载方式:

1)bind mount(用户管理):将宿主机上的某个目录或文件(不可以是没有格式化的磁盘文件),挂载到容器中,默认在容器内对此目录是有读写权限的,如果只需要向容器内添加文件,不希望覆盖目录,需要注意源文件必须存在,否则会被当做一个目录bind mount给容器。
2)docker manager volume(docker自动管理):不需要指定源文件,只需要指定mount point(挂载点)。把容器里面的目录映射到了本地。
这种方式相比bind mount 缺点是无法限制对容器里边目录或文件的权限。

使用第二种挂载方式,-v 挂载时,不指定源文件位置,则默认挂载的路径是:

[[email protected] _data]# pwd
/var/lib/docker/volumes/dd173640edd5b0205bb02f3c4139647be12528b38289b9f93f18123a6b1266a8/_data
#当有目录挂载时,默认在/var/lib/docker/volumes/下会生成一串hash值,hash值下有一个_data的目录,容器内映射的文件就在此路径下。

实例一:单台dockerhost,容器间的数据共享

首先创建一个volume container:

volume container基本概念:**

  • volume container是专门为其他容器提供volume的容器。
  • volume container 提供的卷可以使bind mount,也可以是docker manager volume。

volume contianer的优点:
与bind mount相比,不必为每一容器指定源文件路径,所有路径都在volume container中定义好,容器只需与volume container关联,从而实现容器与host的解耦。

(1)创建volume container:
首先我在本地创建容器需要挂载的web网页目录:
[[email protected] ~]# mkdir html
[[email protected] ~]# echo "hello volume_data" > html/index.html
#我直接使用了两种挂载方式(基于busybox镜像来创建):
[[email protected] ~]# docker create  --name vc_data01 -v /root/html/:/usr/share/nginx/html -v /other/useful/tools/ busybox

注意:该vcdata01也为一个容器,但它的状态是create。

(3)基于volume container运行nginx容器:
[[email protected] ~]# docker run -d --name test1 -p 80:80 --volumes-from vc_data01 nginx:latest 
  • --volumes-from:指定数据卷

(4)访问nginx的默认网页:

查看映射到本地默认路径,会生成两个hash值,代表挂载了两个host path。

实例二:跨主机实现数据共享

方法一:搭建nfs服务:

环境:两台dockerhost(centos7)
docker01:172.16.1.30
docker02:172.16.1.31
nfs服务器:172.16.1.40

nfs server:

[[email protected] ~]# yum -y install nfs-utils  #安装nfs服务
[[email protected] ~]# yum -y install rpcbind  #远程传输控制协议

[[email protected] ~]# vim /etc/exports

参数解释:
*:表示所有地址,也可以自定义ip地址,或者网段
rw:可读可写
sync:同步数据到磁盘
no_root_squash:加上这个选项后,root用户就会对共享的目录拥有至高的权限控制,就像是对本机的目录操作一样。

[[email protected] ~]# mkdir /nfs              #创建共享目录
[[email protected] ~]# systemctl start rpcbind    #先启动该服务
[[email protected] ~]# systemctl start nfs

docker01和dcoker02测试是否能够挂载:

docker01:
将本地目录挂载到nfs服务器上:

创建网页目录:
[[email protected] ~]# mkdir html

[[email protected] ~]# vim /etc/fstab ##进入配置文件进行挂载

[[email protected] ~]# mount -a   #重新加载使其生效
[[email protected] ~]# df -hT   #查看磁盘信息

编写网页内容:
[[email protected] ~]# echo "hello docker02" > html/index.html
[[email protected] ~]# cat html/index.html
hello docker02
运行nginx容器:
[[email protected] ~]# docker run -d --name nginx01 -p 80:80 -v /root/html/:/usr/share/nginx/html nginx:latest

docker02:
挂载nfs:

[[email protected] ~]# mkdir html    #创建挂载目录
[[email protected] ~]# vim /etc/fstab 


[[email protected] ~]# mount -a #重新加载使其生效

//查看目录文件是否同步:
[[email protected] ~]# cat html/index.html
hello docker02
//运行nginx容器:
[[email protected] ~]# docker run -d --name nginx02 -p  80:80 -v /root/html/:/usr/share/nginx/html nginx

访问nginx页面:

我们在docker01上修改nginx页面,测试docker02nginx页面是否同步:

[[email protected] ~]# echo "123456" > html/index.html

nginx02再次访问:
[[email protected] ~]# curl 127.0.0.1
123456

方法二:使用volume container

环境:两台dockerhost主机(centos7)
docker01:172.16.1.30
docker02:172.16.1.31

(1)docker01上创建目录文件:
[[email protected] ~]# mkdir html
[[email protected] ~]# echo "hello docker02" > html/index.html
(2)编写Dockerfile:
[[email protected] ~]# vim Dockerfile

//构建dockerfile:
[[email protected] ~]# docker build -t data:latest .  #镜像名称自定义

(3)创建volume container并基于运行nginx容器:
[[email protected] ~]# docker create  --name vc_data02 data:latest 

[[email protected] ~]# docker run -d --name box1 -P --volumes-from  vc_data02 nginx
  • -P:随机在宿主机生成端口,默认从32768开始。

访问nginx网页:
[[email protected] ~]# curl 127.0.0.1:32768
hello docker02

(4)将volume container镜像打包,并拷贝给docker02:
[[email protected] ~]# docker save  --output  data.tar data:latest
[[email protected] ~]# scp data.tar [email protected]:/root/

docker02:

//导入镜像
[[email protected] ~]# docker load --input  data.tar 
//创建volume container:
[[email protected] ~]# docker create  --name vc_data03 data:latest
//基于container运行nginx:
[[email protected] ~]# docker run  -d --name box2 -P --volumes-from vc_data03 nginx:latest

最后访问nginx默认界面(确保与docker01上的nginx页面相同)

[[email protected] ~]# curl 127.0.0.1:32768
hello docker02

以上就是跨主机实现数据共享的多种方法,当然还有其他的方法,可能会在后续的博客中会写到。

———————— 本文至此结束,感谢阅读 ————————

原文地址:https://blog.51cto.com/13972012/2446731

时间: 2024-11-01 03:31:48

Docker持久化存储之数据共享的相关文章

Docker持久化存储与数据共享

一.Docker持久化数据的方案 基于本地文件系统的Volume:可以在执行docker create或docker run时,通过-v参数将主机的目录作为容器的数据卷.这部分功能便是基于本地文件系统的volume管理. 基于plugin的Volume:支持第三方的存储方案,比如NAS,aws 1.Volume的类型 受管理的data Volume,由docker后台自动创建 绑定挂载的Volume,具体挂载位置可以由用户指定 二.数据持久化:Data Volume 1.操作流程 注意:mysq

Docker 持久化存储, Data Volume

docker容器, 再启动之后 我们可以对其进行 修改删除等等.如果是一个数据库的容器, 里面的数据 不想随着这个容器的消失, 而消失.  就需要持久化数据存储. Data Volume   这是 docker hub 上面  mysql 的Dockerfile 这里的 VOLUME 意思就是, 将产生的数据 写入到当前主机的 /var/lib/mysql 里面. [[email protected] ~]$ docker images REPOSITORY TAG IMAGE ID CREAT

docker 持久化存储

[[email protected] ~]# docker run --name mysql -p 3306:3306 -v /mysql(主机上的目录):/var/lib/mysql(容器内部目录) -d hub.c.163.com/public/centos:6.7-tools [[email protected] ~]# docker exec -it mysql /bin/bash [[email protected] /]# yum -y install mysql mysql-ser

docker的持久化存储和共享存储和网络架构

1.持久化存储docker容器中一般不保存数据,只封装系统和环境,这样就存在一个问题,一个docker容器的数据内容不能持久化,且不能共享出来,在生产中,不能很好地提供服务.为了解决这个问题,就要涉及到docker的持久化存储和共享存储的技术了.所谓持久化,就是将真实机目录挂载到容器中,让容器运行时所产生的数据都写入到真实机的目录中,以此来提供持久存储. mkdir /var/webroot docker run -d -p 80:80 -v /var/webroot:/var/www/html

44_自定义镜像及仓库、持久化存储 、 Docker网络架构

1. 制作自定义镜像(base基础镜像,搭建共性环境)基于centos镜像使用commit创建新的镜像文件基于centos镜像使用Dockerfile文件创建一个新的镜像文件 1.1 使用镜像启动容器 1)在该容器基础上修改yum源docker_images]# docker run -it centos345 /]# rm -rf /etc/yum.repos.d/*  345 /]# vi /etc/yum.repos.d/dvd.repo[dvd]name=dvdbaseurl=ftp:/

使用Ceph集群作为Kubernetes的动态分配持久化存储

使用Docker快速部署Ceph集群 , 然后使用这个Ceph集群作为Kubernetes的动态分配持久化存储. Kubernetes集群要使用Ceph集群需要在每个Kubernetes节点上安装ceph-common

Apache Stratos Mock架构及持久化存储卷的映射

Apache Stratos Mock IaaS 简介 Apache Stratos 支持许多基础设施作为服务 (IaaS) 的平台:EC2,OpenStack,vCloud,CloudStack,Docker等.然而,设立IaaS 或购买公共 IaaS 服务对于尝试Stratos来说是额外的开销.此外,设置本地 IaaS 需要大量的硬件资源和购买公有云上的IaaS账户所涉及的成本.这些对尝试Stratos带来了障碍 Stratos. 通过引入Docker/Kubernetes来支持Linux容

Longhorn:实现Kubernetes集群的持久化存储

Longhorn项目是Rancher Labs推出的开源的基于云和容器部署的分布式块存储新方式.Longhorn遵循微服务的原则,利用容器将小型独立组件构建为分布式块存储,并使用容器编排来协调这些组件,形成弹性分布式系统. 自2017年4月Longhorn项目发布以来,人们对在Kubernetes集群上运行Longhorn存储就产生了极大的兴趣.近日,Longhorn v0.2版本发布了,它可支持任何Kubernetes集群的持久化存储实现! Why Longhorn 如今,基于云和容器的部署规

Kubernetes 系列(六):持久化存储 PV与PVC(一)

在使用容器之后,我们需要考虑的另外一个问题就是持久化存储,怎么保证容器内的数据存储到我们的服务器硬盘上.这样容器在重建后,依然可以使用之前的数据.但是显然存储资源和 CPU 资源以及内存资源有很大不同,为了屏蔽底层的技术实现细节,让用户更加方便的使用,Kubernetes便引入了 PV 和 PVC 两个重要的资源对象来实现对存储的管理. 一.概念 PV 的全称是:PersistentVolume(持久化卷),是对底层的共享存储的一种抽象,PV 由管理员进行创建和配置,它和具体的底层的共享存储技术