Docker实现数据持久化

由于Docker技术的火爆,以至于现在大大小小的公司都在使用Docker。对Docker熟悉的朋友都明白DOcker容器运行是有生命周期的,如果docker容器发生故障,那么就意味着容器中的数据也将丢失。那么对于企业来说的话,数据是重要的!如何做到对docker容器中的数据持久化就是运维人员需要考虑的问题了!本篇博文将了解如何对容器中的数据进行持久化!

在了解Docker数据持久化之前,需要对Docker的存储类型有一个简单的了解,执行以下命令即可看出:

[[email protected] ~]# docker info              //查看Docker的详细信息
Containers: 2                   //一共有几个容器
 Running: 2                      //正在运行的有几个容器
 Paused: 0                      //挂起、暂停的有几个容器
 Stopped: 0                    //停止的有几个容器
Images: 2                      //有几个镜像
Server Version: 18.09.0                         //docker的版本信息
Storage Driver: overlay2                       //存储驱动类型为overlay2
 Backing Filesystem: xfs                      //支持的文件系统:xfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local                                         //本地存储
 Network: bridge host macvlan null overlay             //支持的网络类型
 Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: c4446665cb9c30056f4998ed953e6d4ff22c7c39
runc version: 4fc53a81fb7c994640722ac585fa9ca548971871
init version: fec3683
Security Options:
 seccomp
  Profile: default
Kernel Version: 3.10.0-862.el7.x86_64               //内核信息
Operating System: CentOS Linux 7 (Core)         //操作系统
OSType: linux                                     //操作系统类型
Architecture: x86_64
CPUs: 2                                         //CPU个数
Total Memory: 1.779GiB                       //内存容量
Name: docker
ID: 3SU5:P433:UIFM:YK6O:FBGP:MJSN:MTSO:PKPA:3NMN:6VW4:XUOV:XL5H
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
 127.0.0.0/8
Registry Mirrors:                 //采用的加速器信息
 http://f1361db2.m.daocloud.io/
Live Restore Enabled: false
Product License: Community Engine

Data Volume(数据卷管理操作)

数据库管理操作分为两种bind mount与docker managervolume两种方式。

1)Bind mount(绑定挂载)

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

Bind mount的特点:

  • Data Volume是目录或文件,不能是没有格式化的磁盘(块设备);
  • 容器可以读写volume中的数据;
  • 随源文件变化而变化;
  • volume数据可以永久保存,即使使用它的容器已经被销毁;

示例:

[[email protected] ~]# mkdir /html
[[email protected] ~]# echo "hello world" >> /html/index.html    //创建测试页面
[[email protected] ~]# docker run -itd --name test -p 80:80 -v /html:/usr/share/nginx/html nginx:latest
//运行容器并使用“-v”选项指定挂载目录,前面为docker host的目录,“:”后面为容器中的目录
[[email protected] ~]#
[[email protected] ~]# curl 127.0.0.1                    //可以看到挂载已经生效
hello world
[[email protected] ~]# echo "lzj" > /html/index.html
[[email protected] ~]# curl 127.0.0.1
//这种方式可以看出当源文件发生变化时,目标文件也会随之发生变化
lzj
[[email protected] ~]# docker inspect test    //查看容器的详细信息
        "Mounts": [                            //找到Mount字段
            {
                "Type": "bind",                          //其类型为bind
                "Source": "/html",                      //源目录
                "Destination": "/usr/share/nginx/html",               //目标目录
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

注意:

  • DockerHost上需要被挂着的源文件或目录,必须是已经存在,否则,当做的一个目录挂着到容器中;
  • 默认挂载到容器内的文件,容器是有读写权限。可以在运行容器是-v后边加“:ro” 限制容器的写入权限;
  • 可以挂载单独的文件到容器内部,使用场景:如果不想对整个目录进行覆盖,而只希望添加某个文件,就可以使用挂载单个文件;

2)Docker Manager Volume

示例:

[[email protected] ~]# docker run -itd --name test1 -v /usr/share/nginx/html nginx:latest
//这种方式“-v”选项后,只需添加容器中的目录即可
[[email protected] ~]# docker inspect test1
        "Mounts": [
            {
                "Type": "volume",                     //其类型为volume
                "Name": "47545a64ef51aa1ea1065848b6cb5cc5f19e2da8b2c91966b256a910fca58c4d",
                "Source": "/var/lib/docker/volumes/47545a64ef51aa1ea1065848b6cb5cc5f19e2da8b2c91966b256a910fca58c4d/_data",            //源目录(docker自动生成的)
                "Destination": "/usr/share/nginx/html",      //目标目录
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
[[email protected] ~]# ls /var/lib/docker/volumes/47545a64ef51aa1ea1065848b6cb5cc5f19e2da8b2c91966b256a910fca58c4d/_data
50x.html  index.html
//可以看出宿主机上的目录就是容器中挂载的目录             

这种方式特点:

  • 会随着源文件的变化而变化,跟Bind mount效果是一样的!
  • 删除容器的操作,默认不会对dockerhost主机上的原文件进行删除,如果想要在删除容器是将原文件删除,可以在删除容器时添加“-v”选项,(一般情况下不建议使用,因为文件有可能被其他容器就使用);

3)Volume containe(容器与容器的数据共享)

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

[[email protected] ~]#  docker create --name vc_data  -v /html:/usr/share/nginx/html busybox:latest
//创建一个容器(无须运行)
[[email protected] ~]# docker run -itd --name test3 -P --volumes-from vc_data nginx:latest
//使用“--volumes-from”来挂载vc_data容器中的数据间到新的容器test3
[[email protected] ~]# docker ps             //查看其映射的端口
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
021653708bb2        nginx:latest        "nginx -g ‘daemon of…"   7 seconds ago       Up 5 seconds        0.0.0.0:32768->80/tcp    test3
[[email protected] ~]# curl 127.0.0.1:32768        //测试效果
lzj

注意:以上方式在源目录删除后,容器中的数据也会发生丢失现象!

可以采用编写dockerfile文件的方式,将目录或文件写到镜像中,然后根据镜像生成容器,才可保证原数据丢失,容器中的数据不会发生变化!

由于这种方式随机性、灵活性太差,这里就不多做介绍了这样就可以通过数据卷容器实现容器之间的数据共享。

通过以上机制,即使容器在运行过程中出现故障,用户也不用担心数据发生丢失。如果发生意外,只需快速重新创建容器即可!

注意:生产环境中最注重的就是存储的可靠性,以及存储的可动态扩展性,一定要在做数据卷时考虑到这一点,在这方面比较出色的还要数GFS文件系统了,我上面只是做了简单的配置,若在生产环境中,一定要好好考虑,就比如上面做的镜像卷容器,就可以在宿主机本地挂载GFS文件系统,然后创建镜像卷容器时,将挂载GFS的目录映射到容器中的镜像卷,这样才是一个合格的镜像卷容器。

——————————本文到此为止,感谢阅读————————————

原文地址:https://blog.51cto.com/14157628/2460173

时间: 2024-08-29 12:42:47

Docker实现数据持久化的相关文章

自己学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目录下

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 容器数据持久化

Docker Volumn 卷 提供了一种容器数据持久化的技术,可以将容器中的目录挂载至本机上.同时也为容器之间的数据共享提供了方便. 不指定挂载到宿主机 比如运行docker run -d --name nginx -v /usr/share/nginx/html whoami/hello-nginx -d 在daemon中运行 --name nginx 将容器命名为nginx -v /usr/share/nginx/html 指定需要持久化的目录,即需要挂载的目录. 使用sudo docke

Docker 容器数据 持久化(系统学习Docker05)

写在前面 本来是可以将数据存储在 容器内部 的.但是存在容器内部,一旦容器被删除掉或者容器毁坏(我亲身经历的痛,当时我们的大数据平台就是运行在docker容器内,有次停电后,不管怎样容器都起不来.以前的同事也没有将数据映射到外面 .搞得最后我们重新导的数据,痛的领悟啊~~). 再就是如果不将数据映射出来 ,比如要想使用容器内部的web日志,也是比较难搞,反正不就是其它容器/服务不是很方便. 大体上来说,一般只要使用Docker都会将 重要的数据 进行持久化. 本文有任何问题,欢迎留言指正~ Do

Docker 数据卷-Docker容器数据持久化方式

以tomcat为例,若是我们需要启动一个docker tomcat 容器,并将我们的工程放进tomcat启动 在没有数据卷的情况下,我们所采用的方式: 利用dockerfile将工程拷贝到tomcat 的 webapps目录下创建一个新的镜像,然后通过这个新的镜像来创建容器并启动,以此部署. 这种方式固然好用,但是却需要创建新的镜像,假如需要部署新的工程,又要创建新的镜像.很麻烦 而且,这种方式会造成重复写的问题,就是我们的工程文件实质上在docker容器和宿主机上写入了两次.造成性能损耗. 还

docker容器实现数据持久化的两种方式及其区别

前言 这篇博文是我对docker实现数据持久化几种方式的特征进行一个总结. 在docker中,它的存储文件系统是在dockerhost上原有的xfs或ext4架设了一层文件系统:overlay2(将此行重点标注的原因就是我在面试中被问到过:docker使用的是什么文件系统?),通过docker info命令可以查看出主机上docker相关的信息,包括支持的网络类型.系统版本.内核版本.docker主机的cpu.内存等信息.如下: 在docker中实现数据持久化有两种方式:Bind mount和D

自己学Docker:7.数据卷容器的备份、恢复

最近由于工作的原因,各种事情,忙的要死.用户发现软件有问题,也不管是不是自己操作的问题,一口就咬定是软件的问题,询问什么问题时就"有问题"三个字回应也是醉了. 烦心事过去就不说,之前一直关于Docker看到了数据卷容器,就像知道数据卷容器有什么用处.查了不少资料,最基本的用处还是利用数据卷容器来备份.恢复.迁移数据卷. 备份 我们先创建一个data容器. sudo docker run -i -t -v /data --name data c9fc7f8eec37 根据之前Docker

Docker数据持久化与容器迁移

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

Docker Swarm bind 数据持久化

Docker Swarm bind 数据持久化 bind:主要将工作节点宿主级文件或目录,同步挂载到容器中. 环境: 系统:Centos 7.4 x64 应用版本:Docker 18.09.0 管理节点:192.168.1.79 工作节点:192.168.1.78 工作节点:192.168.1.77 一.两种宿主级挂载方式 管理节点:读写挂载 docker service create --mount type=bind,src=<HOST-PATH>,dst=<CONTAINER-PA