Docker数据持久化(1)

一、前言

当我们使用Docker创建一个mysql的container, 数据是存储在container内的.
如果有一天不小心执行了docker rm $(docker ps -aq)删除所有container. 那么mysql里的数据也会被删掉, 这是不安全的.
我们需要将数据持久化, 存储在container外部. 即使删除container也不会删除原有的数据.

二、容器的缺陷

容器中的数据可以存储在容器层。但是将数据存放在容器层存在以下问题:
1.数据不是持久化。意思是如果容器删除了,这些数据也就没了
2.主机上的其它进程不方便访问这些数据
3.对这些数据的I/O会经过存储驱动,然后到达主机,引入了一层间接层,因此性能会有所下降

三、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的目录,容器内映射的文件就在此路径下。

四、Storage Driver

数据存储方式

Centos7版本的docker,Storage Driver(数据存储方式)为:overlay2 ,Backing Filesystem(文件系统类型): xfs

可使用 “docker inspect 容器名称” 来查看数据存储方式

五、Data Volume

(Bind mount)

持久化存储:本质上是DockerHost文件系统中的目录或文件,能够直接被Mount到容器的文件系统中。在运行容器时,可通过-v实现。

特点:
**1. Data Volume是目录或文件,不能是没有格式化的磁盘(块设备)。

  1. 容器可以读写volume中的数据。
  2. Volume数据可以永久保存,即使使用它的容器已经被销毁。**

小实验:

运行一个nginx服务,做数据持久化

(1)Data Volume是目录或文件,不能是没有格式化的磁盘(块设备)。

[[email protected] ~]# mkdir html
//创建测试目录
[[email protected] ~]# cd html/
[[email protected] html]# echo "This is a testfile in dockerHost." > index.html
//创建测试网页
[[email protected] ~]# docker run -itd --name testweb -v /root/html/:/usr/share/nginx/html nginx:latest
//运行一个nginx容器,并挂载目录
[[email protected] ~]# docker inspect testweb

[[email protected] ~]# curl 172.17.0.3

注意:dockerhost上需要被挂载的源文件或目录,必须是已经存在,否则,会被当作一个目录挂载到容器中。

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

[[email protected] ~]# docker exec  -it testweb  /bin/bash
[email protected]:/# cd /usr/share/nginx/html/
[email protected]:/usr/share/nginx/html# echo "update" > index.html
//容器中更新网页
[email protected]:/usr/share/nginx/html# exit
[[email protected] ~]# cat html/index.html
//可以看到宿主目录的挂载目录也更新了

(3)Volume数据可以永久保存,即使,使用它的容器已经被销毁,也可以通过宿主机的挂在目录重新启动一个容器挂载这个目录进行访问。

[[email protected] ~]# docker ps -a -q |xargs docker rm -f
//删除所有容器

[[email protected] ~]# cat html/index.html
//容器删除之后,宿主机的测试网页也在

[[email protected] ~]# docker run  -itd --name t1  -P -v  /root/html/:/usr/share/nginx/html nginx:latest
//基于测试网页创建一个容器
[[email protected] ~]# docker ps

[[email protected] ~]# curl 127.0.0.1:32768
//访问一下

[[email protected] ~]# echo "update-new" > html/index.html
//再次更新测试网页
[[email protected] ~]# curl 127.0.0.1:32768
//在宿主机更新测试网页,刚刚创建的容器的测试网页也会更新

(5)默认挂载到容器内的文件,容器是有读写权限。可以在运行容器是-v 后边加“:ro”限制容器的写入权限

[[email protected] ~]# docker run  -itd --name t2 -P  -v  /root/html/:/usr/share/nginx/html:ro  nginx:latest
//创建容器设置指读权限
[[email protected] ~]# docker exec -it t2 /bin/bash
//进入容器
[email protected]:/# cd /usr/share/nginx/html
[email protected]:/usr/share/nginx/html# echo 1234 > index.html
//修改测试网页(失败,因为是只读的)

[[email protected] ~]# echo 654321 > html/index.html
//宿主机可以更改
[[email protected] ~]# curl 127.0.0.1:32768

(6)并且还可以挂载单独的文件到容器内部,一般他的使用场景是:如果不想对整个目录进行覆盖,而只希望添加某个文件,就可以使用挂载单个文件。
<1>测试1

 [[email protected] ~]# docker run -itd --name v6 -P -v /root/html/index.html:/usr/share/nginx/html/index.html nginx:latest
[[email protected] ~]# docker ps

[[email protected] ~]# curl 127.0.0.1:32770

<1>测试2

[[email protected] ~]#  echo test > test.html
[[email protected] ~]# docker run -itd --name t8 -P -v /root/test.html:/usr/share/nginx/html/test.html nginx:latest

[[email protected] ~]# curl 127.0.0.1:32772/test.html

六,Docker Manager Volume

会自动在宿主机生成目录,所以在挂载目录的时候只用写容器中的目录。

[[email protected] ~]# docker run -itd --name t1 -P  -v /usr/share/nginx/html nginx:latest
[[email protected] ~]# docker ps

[[email protected] ~]# docker inspect t1

[[email protected] _data]# cd /var/lib/docker/volumes/17c50a065a6b10ccd01ca1ce8091fdf6282dc9dcb77a0f6695906257ecc03a63/_data
[[email protected] _data]# echo "this is a testfile" > index.html
[[email protected] _data]# docker ps

[[email protected] _data]# curl 127.0.0.1:32777

[[email protected] _data]# docker volume ls

[[email protected] _data]# docker rm t1 -f
[[email protected] _data]# cat index.html

1.删除容器的操作,默认不会对dockerhost上的源文件操作,如果想要在删除容器时把源文件也删除,可以在删除容器时添加-v选项(一般不推荐使用这种方式,因为文件有可能被其他容器使用)

[[email protected] _data]# docker run -itd --name t2 -P  -v /usr/share/nginx/html nginx:latest
[[email protected] ~]# docker inspect t2

[[email protected] ~]# cd /var/lib/docker/volumes/2781dbfdc673fc7d149dc4f6217ef277fe72e05ba2e20fcebb617afe97eccb30/_data
[[email protected] _data]# docker rm -v t2 -f
t2
[[email protected] _data]# ls

七,容器与容器的数据共享

Volume container:给其他容器提供volume存储卷的容器。并且它可以提供bind mount,也可以提供docker manager volume。

创建一个vc_data容器

[[email protected] ~]# docker create --name vc_data  -v ~/html:/usr/share/nginx/html  -v /other/useful/tools busybox
[[email protected] ~]# docker inspect vc_data

[[email protected] ~]# docker run -itd --name t3 -P  --volumes-from vc_data nginx:latest
[[email protected] ~]# docker ps

[[email protected] ~]# curl 127.0.0.1:32779

原文地址:https://blog.51cto.com/14320361/2459668

时间: 2024-10-08 10:46:34

Docker数据持久化(1)的相关文章

Docker数据持久化与容器迁移

上节讲到当容器运行期间产生的数据是不会在写镜像里面的,重新用此镜像启动新的容器就会初始化镜像,会加一个全新的读写入层来保存数据.如果想做到数据持久化,Docker提供数据卷(Data volume)或者数据容器卷来解决问题,另外还可以通过commit提交一个新的镜像来保存产生的数据.那么,来一一看下各自的使用方法. 一.数据卷 数据卷特性: 可以绕过UFS文件系统,为一个或多个容器提供访问. 完全独立于容器的生存周期,因此不会在删除容器时删除其挂在的数据卷. 数据卷特点: 数据卷在容器启动初始化

Docker数据持久化简述

Docker中的数据持久化方式有两种:数据卷(Data Volumes)挂载主机目录 (Bind mounts) 数据卷:数据卷可以在容器之间共享和重用对数据卷 的修改会立马生效对数据卷 的更新,不会影响镜像数据卷默认会一直存在,即使容器被删除$ docker volume create my-vol #创建数据卷$ docker volume ls #查看有哪些卷$ docker volume inspect my-vol #查看卷详情$ docker run -d -P --name web

docker 数据持久化

confluence #!/bin/bash docker run --name confluence --volume "$PWD/data/opt":/opt --volume "$PWD/data/atlassian/confluence":/var/atlassian/confluence --detach --publish 8090:8090 confluence/confluence:6.13.0 jira #!/bin/bash docker run

Docker实现数据持久化

由于Docker技术的火爆,以至于现在大大小小的公司都在使用Docker.对Docker熟悉的朋友都明白DOcker容器运行是有生命周期的,如果docker容器发生故障,那么就意味着容器中的数据也将丢失.那么对于企业来说的话,数据是重要的!如何做到对docker容器中的数据持久化就是运维人员需要考虑的问题了!本篇博文将了解如何对容器中的数据进行持久化! 在了解Docker数据持久化之前,需要对Docker的存储类型有一个简单的了解,执行以下命令即可看出: [[email protected] ~

【赵强老师】Docker Swarm集群的数据持久化

如果Docker Swarm集群中运行了mysql.nginx等服务,这些服务的数据如果没有挂载到宿主机中,那么容器一旦停止运行,那就意味着数据丢失. 有什么方法可以解决swarm集群中运行的服务能够数据持久化呢?我们可以通过volme.nfs等方法来实现swarm集群应用数据持久化,其实也和docker数据持久化的形式是一样的. 可以用两种方式来实现: volume 默认模式:工作节点宿主机数据同步到容器内. volume NFS 共享存储模式:管理节点宿主同步到工作节点宿主,工作节点宿主同步

k8s数据持久化

k8s数据持久化 Docker容器是有生命周期的,因此数据卷可以实现数据持久化 数据卷主要解决的问题: 数据持久性:当我们写入数据时,文件都是暂时性的存在,当容器崩溃后,host就会将这个容器杀死,然后重新从镜像创建容器,数据就会丢失 数据共享:在同一个Pod中运行容器,会存在共享文件的需求 存储类(Storage class)是k8s资源类型的一种,它是有管理员为管理PV更加方便创建的一个逻辑组,可以按照存储系统的性能高低,或者综合服务质量,备份策略等分类.不过k8s本身不知道类别到底是什么,

k8s存储数据持久化,emptyDir,hostPath,基于Nfs服务的PV,PVC

在docker和K8S中都存在容器是有生命周期的,因此数据卷可以实现数据持久化. 数据卷解决的主要问题: 1.数据持久性:当我们写入数据时,文件都是暂时性的存在,当容器崩溃后,host就会将这个容器杀死,然后重新从镜像创建容器,数据就会丢失. 2.数据共享:在同一个Pod中运行容器,会存在共享文件的需求. 数据卷的类型: 1.emptyDiremptyDir数据卷类似于docker数据持久化的docker manager volume,该数据卷初分配时,是一个空目录,同一个Pod中的容器可以对该

docker mysql 数据持久化到本地、设置不区别表名大小写

Docker MySQL 把数据存储在本地目录,很简单,只需要映射本地目录到容器即可 1.加上-v参数 $ docker run -d -e MYSQL_ROOT_PASSWORD=admin --name mysql -v /data/mysql/data:/var/lib/mysql -p 3306:3306 mysql 还可以指定配置文件 docker run -d -e MYSQL_ROOT_PASSWORD=admin --name mysql -v /data/mysql/my.cn

自己学Docker:5.Docker的数据持久化之数据卷

首先,别忘记之前的两个问题: 1. 如何保存我们在容器里的修改? 2. 如果apt-get如果不能安装时,如何在Docker中安装软件? 删除镜像命令 在此之前,先记一个命令, sudo docker rm ID/NAME 即删除创建的镜像.如 现在删除id为"cc8a23b1d624"的镜像. sudo docker rm cc8a23b1d624 可以看到,id为cc8a23b1d624的镜像被删除了. 而且可以发现,本地的/var/lib/docker/containers目录下