Docker数据持久化与容器迁移(三)

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:

上节讲到当容器运行期间产生的数据是不会在写镜像里面的,重新用此镜像启动新的容器就会初始化镜像,会加一个全新的读写入层来保存数据。如果想做到数据持久化,Docker提供数据卷(Data volume)或者数据容器卷来解决问题,另外还可以通过commit提交一个新的镜像来保存产生的数据。那么,来一一看下各自的使用方法。

一、数据卷

数据卷特性:

  • 可以绕过UFS文件系统,为一个或多个容器提供访问。

  • 完全独立于容器的生存周期,因此不会在删除容器时删除其挂在的数据卷。

数据卷特点:

  • 数据卷在容器启动初始化时,如果容器使用的镜像在挂载点包含了数据,这些数据会拷贝到新初始化的数据卷中。

  • 数据卷可以在容器直接共享和重用。

  • 可以直接对数据卷里的内容进行修改。

  • 数据卷的变化不会影响镜像的更新。

  • 卷会一直存在,即使挂载数据卷的容器已经删除。

1.数据卷使用

创建并挂载数据卷:

$ sudo docker run -itd --name ubuntu_test1 -v /container_data:/data ubuntu

注:container_data为宿主机目录,/data是容器中目录,目录不存在会自动创建

$ sudo docker inspect ubuntu_test1

    "Mounts": [

        {

            "Source": "/container_data",

            "Destination": "/data",

            "Mode": "",

            "RW": true

        }

    ],

可以看到已经挂载成功,并且容器对这个目录具有读写权限。

测试:

$ cd container_data  

$ sudo touch test.txt

sudo docker exec ubuntu_test1 ls /data

test.txt

在宿主机目录创建的文件,同样在容器内看到。

2.删除容器,数据会一同删除吗?

$ sudo docker stop ubuntu_test1

$ sudo docker rm ubuntu_test1 

$ ls container_data

test.txt

看到宿主机上数据卷目录里的文件并没有发生变化,说明删除容器不会影响数据卷。

3.重新启动一个容器,同样挂载这个数据卷试试

$ sudo docker run -itd --name ubuntu_test2 -v /container_data:/data ubuntu   

sudo docker exec ubuntu_test1 ls /data

test.txt

文件依然存在,说明初始化时将数据拷贝到了容器中。

3.再启动一个容器,还将数据卷挂载到这里

$ sudo docker run -itd --name ubuntu_test3 -v /container_data:/data ubuntu

sudo docker exec ubuntu_test1 ls /data

test.txt

同样可以看到数据,说明数据卷可以共享多个容器使用。


二、容器数据卷

将一个正常的容器作为数据卷,让其他容器通过挂载这个容器实现数据共享。

注意:数据卷容器会降低I/O性能。

1.容器数据卷使用

创建一个dvdata的数据卷容器:

$ sudo docker run -itd -v /data --name dvdata ubuntu 

注:/data是数据卷容器内共享的目录

在其他容器中挂载dvdata容器的数据卷:

$ sudo docker run -itd --name web1 --volumes-from dbdata ubuntu

sudo docker run -itd --name web2 --volumes-from dbdata ubuntu

分别进入web1、web2容器中,会有一个/data目录,在web1里的/data目录创建文件,web2也能看的到。

总结:如果删除dvdata、web1、web2,时,数据卷并不会被自动删除。如果想删除需在删除最后一个挂载着它的容器时使用docker rm -v 命令来指定删除关联的容器。


博客地址:http://lizhenliang.blog.51cto.com


三、commit命令使用

commit命令作用是将已存在容器中的镜像和修改内容提交为一个新的镜像,通过这个方式同样能保存读写层内容。

1.启动一个新容器,并在容器/opt目录下创建test.txt文件

$ sudo docker run -itd --name web ubuntu

$ sudo docker exec web touch /opt/test.txt

$ sudo docker exec web ls /opt

test.txt

2.提交一个新的镜像

$ sudo docker commit web web:v2

$ sudo docker images

wKiom1aHmizRJTH3AAALZBBhRf0914.png

3.成功提交一个新的镜像,用这个新的镜像启动一个容器,看是否创建的文件存在

$ sudo docker run -itd --name web_v2 web:v2

$ sudo docker exec web_v2 ls /opt

test.txt

总结:commit命令同样能实现保存读写层数据,但不适于做数据持久化


四、数据卷容器备份和还原

备份:

$ sudo docker run --volumes-from dvdata -v /container_backup:/backup ubuntu tar cvf /backup/backup.tar /data

说明:先创建一个临时容器,并挂载dvdata容器数据卷,再挂载数据卷/container_backup目录到容器/bakcup,在容器中执行备份/data目录到/backup,也就是备份到宿主机/container_backup目录。

恢复:

#先创建一个数据卷容器

$ sudo docker run -v /data --name dvdata2 ubuntu                      

注意:这个数据卷目录名要与备份的一样

#再将备份文件恢复到这个数据卷容器

$ sudo docker run --volumes-from dvdata2 -v /container_backup:/backup ubuntu tar xvf /backup/backup.tar

#最后启动一个容器挂载验证/data目录数据恢复成功

$ sudo docker run -itd --volumes-from dvdata2 --name web_recover ubuntu


五、迁移容器和镜像

export与import命令使用:

#export导出容器会丢失历史记录和元数据,类似与快照

先创建测试容器:

$ sudo docker exec web touch /opt/test.txt

$ sudo docker exec web ls /opt

test.txt

执行导出:

$ sudo docker export web > web.tar

执行导入:

$ cat web.tar | sudo docker import - web:v2

$ sudo docker images

wKiom1aHmtuhyu9UAAAHiNrmLo0553.png$ sudo docker run -itd --name web_v2 web:v2 /bin/bash

#启动这个镜像要加/bin/bash,否则报错Error response from daemon: No command specified

$ sudo docker exec web_v2 ls /opt

test.txt

总结:通过export命令也可以将容器里的数据保存,并可以迁移到别的docker主机 

save与load命令使用:

#一般用于迁移镜像到别处

导出:

$ sudo docker save web > web.tar

导入:

$ sudo docker load < ubuntu.tar

注:不会丢弃历史记录和元数据,并可以回滚版本。启动不用加/bin/bash




本文转自 李振良OK 51CTO博客,原文链接:http://blog.51cto.com/lizhenliang/1730892,如需转载请自行联系原作者
相关文章
|
25天前
|
Docker 容器
进入Docker容器中
进入Docker容器中
34 2
|
5天前
|
存储 运维 监控
构建高效稳定的Docker容器监控体系
【4月更文挑战第18天】 在现代微服务架构中,Docker容器已成为部署和运行应用的标准环境。随之而来的挑战是如何有效监控这些容器的性能与健康状况,确保系统的稳定性和可靠性。本文将探讨构建一个高效稳定的Docker容器监控体系的关键技术和方法,包括日志管理、性能指标收集以及异常检测机制,旨在为运维人员提供实用的指导和建议。
10 0
|
14天前
|
Linux Docker 容器
docker 容器常用命令
docker 容器常用命令
12 0
|
14天前
|
Linux Shell 虚拟化
linux 部署docker容器虚拟化平台(二)--------docker 镜像制作方法
linux 部署docker容器虚拟化平台(二)--------docker 镜像制作方法
21 0
|
14天前
|
存储 Linux Shell
centos 部署docker容器 安装 、基本使用方法(一)
centos 部署docker容器 安装 、基本使用方法(一)
24 0
|
20天前
|
Linux Docker 容器
/var/lib/docker/overlay2 占用很大,清理Docker占用的磁盘空间,迁移 /var/lib/docker 目录...
/var/lib/docker/overlay2 占用很大,清理Docker占用的磁盘空间,迁移 /var/lib/docker 目录...
|
22天前
|
Kubernetes 网络协议 Docker
Docker 容器的DNS
Docker 容器的DNS
25 1
|
25天前
|
关系型数据库 MySQL Nacos
【深入浅出Nacos原理及调优】「实战开发专题」采用Docker容器进行部署和搭建Nacos服务以及“坑点”
【深入浅出Nacos原理及调优】「实战开发专题」采用Docker容器进行部署和搭建Nacos服务以及“坑点”
46 1
|
26天前
|
NoSQL 关系型数据库 MySQL
安装Docker&镜像容器操作&使用Docker安装部署MySQL,Redis,RabbitMQ,Nacos,Seata,Minio
安装Docker&镜像容器操作&使用Docker安装部署MySQL,Redis,RabbitMQ,Nacos,Seata,Minio
133 1
|
26天前
|
运维 监控 云计算
构建高效稳定的Docker容器监控体系
随着微服务架构的普及,Docker容器作为其核心承载单元,在系统运维中扮演着日益重要的角色。本文旨在探讨如何构建一个高效且稳定的Docker容器监控体系,以确保容器运行的可靠性和系统的高可用性。文章首先分析了容器监控的必要性,接着详细介绍了监控体系的设计理念和组件选择,最后提供了实施过程中的关键步骤与最佳实践。通过本文,读者将掌握构建和维护Docker容器监控体系的有效方法。