大家在使用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容器技术。

如何优化Docker储存的更多相关文章

  1. Docker容器技术-优化Docker镜像

    一.优化Docker镜像 1.降低部署时间 一个大的Docker应用是如何影响在新Docker宿主机上的部署时间. (1)编写Dockerfile创建一个大Docker镜像 [root@bogon ~ ...

  2. 一:优化Docker中的Spring Boot应用:单层镜像方法

    优化Docker中的Spring Boot应用:单层镜像方法 1.Docker关键概念 2.镜像层内容很重要 3.镜像层影响部署 4.Docker中的Spring Boot应用 5.单层方法 5.1 ...

  3. 优化 Docker 镜像大小常见方法

    平时我们构建的 Docker 镜像通常比较大,占用大量的磁盘空间,随着容器的大规模部署,同样也会浪费宝贵的带宽资源.本文将介绍几种常用的方法来优化 Docker 镜像大小,这里我们使用 Docker ...

  4. 利用分层机制优化 Docker Image

    文章转载自:https://mp.weixin.qq.com/s/FrIOIquHVsCTEMfHiF87MA 假设系统中我们有两个应用 App1 和 App2.这两个节点的环境信息如下: 通过上表环 ...

  5. Docker镜像优化

    前言 上篇博文说到使用Visual Studio Tools for Docker帮助我们生成Dockerfile,现在我们讨论下生成的Dockerfile的优劣. 一.以往Dockerfile构建模 ...

  6. 谁是Docker的开发人员

    由CHRIS DAWSON发表在thenewstack/DATA RESEARCH qianhen123/CHB译 我们分析了Docker的容器库并提出两个问题: 1.Docker的贡献者们感兴趣的其 ...

  7. 京东618:Docker扛大旗,弹性伸缩成重点 (2015-06-23)

    不知不觉中,年中的618和年终的11.11已经成为中国电商的两大促销日,当然,这两天也是一年中系统访问压力最大的两天.对于京东而言,618更是这一年中最大的一次考试,考点是系统的扩展性.稳定性.容灾能 ...

  8. docker(一)安装和必要的配置。

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...

  9. 【02】循序渐进学 docker:如何安装

    写在前面的话 我们接下来的操作都是 CentOS 7.5 以下完成的,为了避免你我结果不一致,建议你也采用 CentOS 7.5,原因如下: 1. 个人几年工作下来经历的公司,包括身边的运维朋友,90 ...

随机推荐

  1. 挂载KVM Guest操作系统磁盘

    使用虚拟机时, 发现想要修改虚拟机中的文件非常麻烦, 需要启动虚拟机, 然后再登录进去修改. 对于已经关闭的虚拟机, 为了修改一个文件而启动, 非常耽误时间. 对于一个无法启动的虚拟机(比如启动文件损 ...

  2. May 23. 2018 Week 21st Wednesday

    You should love and take care of yourself because after all, it is your own life. 要学会爱自己,照顾自己,毕竟生活是你 ...

  3. #004 C语言大作业学生管理系统试着做

    链表不会用 文件不会使 在这种情况下就边写边做 希望这个月能做完这个作业 #include<stdio.h> #include<stdlib.h> #include<st ...

  4. js原生动态创建表格

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. Myeclipse2017C版本破解

    原文地址: https://blog.csdn.net/qq_33945246/article/details/79589152

  6. (转)ElasticSearch教程——汇总篇

    https://blog.csdn.net/gwd1154978352/article/details/82781731 环境搭建篇 ElasticSearch教程——安装 ElasticSearch ...

  7. vue事件绑定处理

    事件监听指令 v-on 指令监听 DOM 事件来触发一些 JavaScript 代码,通常是触发一个函数,简写@ <template> <div id="app" ...

  8. Codeforces Round #546 (Div. 2) C. Nastya Is Transposing Matrices

    C. Nastya Is Transposing Matrices time limit per test 1 second memory limit per test 256 megabytes i ...

  9. 引用变量 php面试总结1

    (1)PHP引用变量 概念:不同的变量名,访问同一个变量内容,使用& 知识点: 使用php函数 (a)memory_get_usage() 查看内存使用情况 eg // 定义一个变量 $a = ...

  10. 解决Zabbix网页端Get value error: cannot connect to [[192.168.238.139]:10050]: [113] No route to host问题

    在安装配置完zabbix_agentd以后,网页端出现  Get value error: cannot connect to [[192.168.238.139]:10050]: [113] No ...