如何优化docker储存

author author     2023-02-03     631

关键词:

大家在使用Docker的过程中,有没有想过,Docker在本地存储镜像时把文件存储在哪里了呢?有没有对文件的总大小做一定的限制呢?能不能调整本地存储的位置及总限制大小呢?今天,我们就从这些问题入手,来讨论一下Docker的存储优化方案。

一、Docker的默认存储策略

Docker提供了查看配置信息的命令,即docker info命令,通过该命令可以查看Docker的各种系统层面的信息,如当前运行的容器数、镜像数、Docker版本等信息,其中就包括了存储信息。

我们输入docker info命令后,可得到类似如下的内容:

Storage Driver: devicemapper

Pool Name: docker-253:2-923803-pool

Pool Blocksize: 65.54 kB

Base Device Size: 10.74 GB

Backing Filesystem: xfs

Data file: /dev/loop0

Metadata file: /dev/loop1

Data Space Used: 12.9 GB

Data Space Total: 107.4 GB

Data Space Available: 19.75 GB

Metadata Space Used: 21.77 MB

Metadata Space Total: 2.147 GB

Metadata Space Available: 2.126 GB

Thin Pool Minimum Free Space: 10.74 GB

Udev Sync Supported: true

Deferred Removal Enabled: false

Deferred Deletion Enabled: false

Deferred Deleted Device Count: 0

Data loop file: /var/lib/docker/devicemapper/devicemapper/data

WARNING: Usage of loopback devices is strongly discouraged for production use. Use `--storage-opt

dm.thinpooldev` to specify a custom block storage device.

Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata

Library Version: 1.02.140-RHEL7 (2017-05-03)

其中,Data Space Total 即默认的最大储存空间,约为100G;Data loop file即默认的镜像存储路径,可以看到默认设置在/var/lib/docker路径下。

值得一提的是,存储目录下的devicemapper/devicemapper/data文件是docker创建的稀疏文件,该文件在创建时即指定了大小,未真正使用的部分被系统由0填充,并且在磁盘统计时不计入使用磁盘大小。同时,该文件的大小即为Docker的最大储存空间。

-rw------- 1 root root 100G Nov 8 10:11 data

根据实际情况,有时需要扩大或者缩小Docker的最大储存空间,下面介绍一下具体的方法,并测试Docker的最大储存空间过小,对于Docker的影响,以及相关的建议。

二、修改存储位置及储存空间

一般情况下,Docker的配置文件的位置为:

/etc/systemd/system/docker.service.d/docker.conf

若无此文件可手动创建。此文件的内容可参照如下配置填写:

[Service]

ExecStart=

ExecStart=/usr/bin/dockerd --storage-driver=devicemapper --insecure-registry 0.0.0.0/0 --registry-mirror http://dockerhub.yonyou.com -g /data/docker/

其中,利用-g参数即可指定存储挂载路径。比如,示例中的配置将存储目录挂载在/data/docker/路径下。

若想修改Docker的最大储存空间,也需要通过修改此配置文件实现。

扩大存储空间

扩大Docker的最大储存空间,直接修改配置文件即可。假设需要将Docker的最大储存空间扩大到200G,则具体的方法为:

1、停止docker服务

停止docker服务的命令如下。

systemctl stop docker

2、修改配置文件

在Docker的配置文件最后一行的末尾添加——storage-opt dm.loopdatasize=200G,添加完之后的配置为:

[Service]

ExecStart=

ExecStart=/usr/bin/dockerd --storage-driver=devicemapper --insecure-registry 0.0.0.0/0 --registry-mirror http://dockerhub.yonyou.com -g /data/docker/ --storage-opt dm.loopdatasize=200G

3、重启docker服务

重启docker的命令如下。

systemctl daemon-reload && systemctl start docker

重启之后,查看Docker的最大储存空间:

Data Space Used: 1.09 GB

Data Space Total: 214.7 GB

Data Space Available: 22.36 GB

Metadata Space Used: 1.753 MB

Metadata Space Total: 2.147 GB

Metadata Space Available: 2.146 GB

Data loop file:/data/docker/devicemapper/devicemapper/data

可以看到,最大存储空间的配置已经生效,当前约为200G.

我们在配置中同时配置了挂载目录,可以看到,当前docker的存储文件也改变至/data/docker目录下。

缩小存储空间

我们首先想要提醒您的是,缩小Docker存储空间需要清空Docker的工作目录才能生效,清空Docker的工作目录会导致所有数据丢失。一定要确认本地所有镜像均已备份或可丢弃后,才可进行缩小存储空间操作。

假设要将Docker的最大储存空间缩小为50G,具体的方法为:

1、停止docker服务

同样的,先使用命令停止docker服务。

systemctl stop docker

2、修改配置文件

在Docker的配置文件最后一行的末尾添加——storage-opt dm.loopdatasize=50G,添加完之后的配置为:

[Service]

ExecStart=

ExecStart=/usr/bin/dockerd --storage-driver=devicemapper --insecure-registry 0.0.0.0/0 --registry-mirror http://dockerhub.yonyou.com -g /data/docker/ --storage-opt dm.loopdatasize=50G

3、删除Docker的工作目录

请再次注意,清空Docker的工作目录会导致所有数据丢失,包括在本地保存的所有Docker镜像。

rm -rf /data/docker

4、重启docker服务

systemctl daemon-reload && systemctl start docker

重启之后,查看Docker的最大储存空间:

Data Space Used: 11.8 MB

Data Space Total: 53.69 GB

Data Space Available: 23.44 GB

可以看到,docker的存储空间已缩小至50G左右。

那么我们可以思考一下,如果Docker的储存空间过小,会对我们使用Docker产生什么样的影响呢?

储存空间过小的影响

为了测试Docker的最大储存空间过小对Docker的影响,将Docker的最大储存空间设置为2G。

下载四个镜像,分别为:

REPOSITORY TAG IMAGE ID CREATED SIZE

alpine latest 053cde6e8953 4 days ago 3.96 MB

apps latest 67ea7f76e6db 5 days ago 687 MB

jenkins latest ec714cdad606 3 months ago 975 MB

dclb latest 483ca54282f0 4 months ago 44 MB

使用docker info查看Docker存储空间的使用情况:

Data Space Used: 1.935 GB

Data Space Total: 2.147 GB

Data Space Available:212.3 MB

在Data Space Available项中,可以看到仅剩余200M左右存储空间。

若此时下载其他镜像,则可能会报如下错误:

failed to register layer: devmapper: Thin Pool has 3190 free data blocks which is less than minimum required 3276 free data blocks. Create more free space in thin pool or use dm.min_free_space option to change behavior

如果创建一个容器,如alpine,则也可能会报如下错误:

docker: Error response from daemon: devmapper: Thin Pool has 3239 free data blocks which is less than minimum required 3276 free data blocks. Create more free space in thin pool or use dm.min_free_space option to change behavior.

通过测试,可知在删除一个镜像并释放空间之后,可以重新拉取小于此镜像大小的镜像,或者也可以成功创建alpine容器。

三、优化Docker的存储策略

在日常使用Docker服务时,我们给出以下两点建议:

1)、每天定时清理不用的Docker文件;

2)、将Docker的工作目录设置在数据挂载磁盘文件夹里面,且设置磁盘大于100G.

优化建议一:定时清理Docker文件

使用docker-gc可以清理Docker文件,docker-gc的清理规则是:

·Containers that exited more than an hour ago are removed(删除已经退出一小时的容器)

·Images that don‘t belong to any remaining container after that are removed(删除不属于任何容器的镜像)

运行如下命令,每天定时使用docker-gc清理Docker文件:

sudo echo ‘0 2 * docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /etc:/etc:ro -e FORCE_IMAGE_REMOVAL=1 spotify/docker-gc‘ >> /var/spool/cron/root

其中:FORCE_IMAGE_REMOVAL=1代表清理重复的镜像。

优化建议二:迁移Docker工作目录

在Docker的工作目录里面,会有很多大文件,如果将Docker的工作目录存放在根目录的话,会导致根目录很快被占满,因此需要将Docker的工作目录迁移到挂载的数据磁盘。

假设要将Docker的工作目录从/var/lib/docker迁移到/data/docker目录下,迁移的方法为:

1、暂停Docker服务

systemctl stop docker

2、迁移工作目录的数据

创建docker工作目录,如果/data/docker已经存在,则可以跳过此步骤,直接复制文件:

mkdir /data/docker

迁移数据:

cp -rf /var/lib/docker/* /data/docker/

3.修改Docker的工作目录

Docker的启动配置文件位置在:

/etc/systemd/system/docker.service.d/docker.conf

无此文件可手动创建。打开此文件,在其后面增加-g /data/docker,如果已经有-g选项,则直接修改后面的目录即可。修改后的结果如下:

[Service]

ExecStart=

ExecStart=/usr/bin/dockerd --storage-driver=devicemapper --insecure-registry 0.0.0.0/0 --registry-mirror http://dockerhub.yonyou.com –g /data/docker/

4、启动Docker服务

systemctl daemon-reload && systemctl start docker

5、删除源文件

rm -rf /var/lib/docker/*

以上就是Docker储存的优化方案,希望对您能够有所帮助,更好的使用Docker容器技术。

如何释放mac上的储存空间?

...家准备了实用的苹果电脑释放储存空间的方法,教你如何使用Mac的储存空间管理功能,或以其他方式释放空间,非常有用,有兴趣的朋友可以来了解一下哦!优化储存空间要腾出更多可用储存空间,请使用... 查看详情

如何释放mac上的储存空间?

...家准备了实用的苹果电脑释放储存空间的方法,教你如何使用Mac的储存空间管理功能,或以其他方式释放空间,非常有用,有兴趣的朋友可以来了解一下哦!优化储存空间要腾出更多可用储存空间,请使用... 查看详情

docker---镜像详解dockerfile编写及优化部署nginx(代码片段)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录一、镜像分层原理1、初级了解镜像2、如何堆叠镜像2、涉及技术二、Dockerfile编写1、dockerfile操作指令2、编写dockerfile文件--部署nginx3、... 查看详情

docker-容器介绍与配置镜像分层部署nginx优化镜像(代码片段)

目录docker简介docker和虚拟机的区别:容器是如何工作的1.配置docker1.1搭建docker仓库1.2下载docker-ce1.3测试2.镜像的分层2.1文件导入镜像3.Dockerfile详解3.1.FROM3.2.RUN3.3.MAINTAINER3.4.COPY3.5.ADD3.6.ENV3.7.EXPOSE3.8.VOLUME3.9.WORKDIR3.10.CM 查看详情

spark系列(代码片段)

...mpose使用与负载均衡Docker安装Jenkins并实现项目自动化部署如何0失误快速搭建K8s环境?你想了解的这都有JVM性能优化:JVM性能优化系列-(1)Java内存区域JVM性能优化系列-(2)垃圾收集器与内存分配策略JVM性能优化系列-(3)虚拟机执行子系... 查看详情

spark系列(代码片段)

...mpose使用与负载均衡Docker安装Jenkins并实现项目自动化部署如何0失误快速搭建K8s环境?你想了解的这都有JVM性能优化:JVM性能优化系列-(1)Java内存区域JVM性能优化系列-(2)垃圾收集器与内存分配策略JVM性能优化系列-(3)虚拟机执行子系... 查看详情

docker安装优化与docker基础命令(代码片段)

Docker安装优化与Docker基础命令#个人阿里云镜像加速;登陆阿里云搜索镜像加速,复制链接sudomkdir-p/etc/dockersudotee/etc/docker/daemon.json<<-‘EOF‘"registry-mirrors":["https://ye71id77.mirror.aliyuncs.com"]EOFsudosystemctldaemon-re 查看详情

如何查找 NGC Docker 映像的内容?

】如何查找NGCDocker映像的内容?【英文标题】:HowtofindcontentsofanNGCDockerimage?【发布时间】:2021-09-1706:39:58【问题描述】:NVIDIANGCcontainercatalog拥有广泛的GPU优化容器,可用于深度学习等常见活动。如何找到Docker镜像中的内容?例... 查看详情

如何更改电脑储存路径

...储---更改新内容的保存位置后应用台式机(AMD平台)性能如何优化¥2.99电脑调修-专家1对1远程在线服务¥38路由器的选购、设置与进阶玩法¥39一看就会的RAID实用教程¥29.9小白必看的硬盘知识¥9.9查看更多官方服务... 查看详情

linux企业运维——docker镜像封装及优化(代码片段)

Linux企业运维——Docker(二)镜像封装及优化文章目录Linux企业运维——Docker(二)镜像封装及优化1、Docker封装rhel7+nginx镜像实例2、封装后镜像的优化1、Docker封装rhel7+nginx镜像实例(1)删除之前建立... 查看详情

docker镜像的大小优化(代码片段)

镜像的大小优化与默认挂载一、优化镜像优化一:把不需要的命令丢入/dev/null优化二:减少RUN构建优化三:多阶段构建优化四:使用更为轻量级的linux发行版二、关于VOLUME一、优化镜像原版FROMcentos:7RUNyuminstall-ygccpcrepcre-... 查看详情

docker镜像的大小优化(代码片段)

镜像的大小优化与默认挂载一、优化镜像优化一:把不需要的命令丢入/dev/null优化二:减少RUN构建优化三:多阶段构建优化四:使用更为轻量级的linux发行版二、关于VOLUME一、优化镜像原版FROMcentos:7RUNyuminstall-ygccpcrepcre-... 查看详情

中国区优化的docker安装脚本

...安装不同版本的docker,我们在这里提供针对中国网络环境优化的安装脚本。它们使用中国的软件包仓库(在此感谢USTC)。用法使用需要的docker版本替换以下脚本中的<docker-version-you-want>curl -sSL https://github.com/gitlawr/insta... 查看详情

docker网络映射配置,完整pdf

数据库2.1池化技术:如何减少频繁创建数据库连接的性能损耗?2.2数据库优化方案(一):查询请求增加时,如何做主从分离?2.3数据库优化方案(二):写入数据量增加时,如何实现... 查看详情

docker容器:封装镜像+优化(代码片段)

Docker基础知识可以参考之前的文章Docker基础知识Docker的基本使用方法可以参考之前的文章Docker基本使用里边包含创建镜像的两种方法,第二种方法Dockerfile是下面涉及到的,建议把链接的文章看一下自己创建一个nginx的镜... 查看详情

java开发必学!docker服务启动不了

数据库2.1池化技术:如何减少频繁创建数据库连接的性能损耗?2.2数据库优化方案(一):查询请求增加时,如何做主从分离?2.3数据库优化方案(二):写入数据量增加时,如何实现... 查看详情

docker客户端拉包逻辑及优化思路(代码片段)

docker客户端拉包逻辑及优化思路dockerpullxxxxxxConcurrentdownloadsBydefaulttheDockerdaemonwillpullthreelayersofanimageatatime.Ifyouareonalowbandwidthconnectionthismaycausetimeoutissuesandyoumaywantto>>lowert 查看详情

docker客户端拉包逻辑及优化思路(代码片段)

docker客户端拉包逻辑及优化思路dockerpullxxxxxxConcurrentdownloadsBydefaulttheDockerdaemonwillpullthreelayersofanimageatatime.Ifyouareonalowbandwidthconnectionthismaycausetimeoutissuesandyoumaywantto>>lowert 查看详情