大家在使用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. Linux命令一

    软件包管理命令: sudo apt-cache search package    #搜索包 sudo apt-cache show package     #获取包的相关信息,如说明.大小.版本 s ...

  2. 查看iPhone电池寿命

    iBackupBot 软件:iBackupBot for iTunes (收费软件) 官网:http://www.icopybot.com/download.htm iBackupBot for iT ...

  3. LeetCode算法题-Minimum Depth of Binary Tree(Java实现)

    这是悦乐书的第168次更新,第170篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第27题(顺位题号是111).给定二叉树,找到它的最小深度.最小深度是沿从根节点到最近的 ...

  4. 【算法】LeetCode算法题-Palindrome Number

    这是悦乐书的第144次更新,第146篇原创 今天这道题和回文有关,即从前往后和从后往前是一样的,如"上海自来水来自海上"就是一个回文字符串,如整数121就是回文数,这些都是和回文相 ...

  5. Spring的IOC注解开发入门2

    注解方式设置属性的值 在我们IOC基于xml属性注入的方式中有(一般推荐set方法) 构造方法注入普通值:<constructor-arg>的使用 set方法注入普通值:<prope ...

  6. 寒假训练——搜索——C - Robot

    The Robot Moving Institute is using a robot in their local store to transport different items. Of co ...

  7. 5.01-requests_auth

    import requests # 发送post请求 data = { } response = requests.post(url, data=data) # 内网 需要 认证 auth = (us ...

  8. 基于Spring Boot和Shiro的后台管理系统FEBS

    FEBS是一个简单高效的后台权限管理系统.项目基础框架采用全新的Java Web开发框架 —— Spring Boot 2.0.3,消除了繁杂的XML配置,使得二次开发更为简单:数据访问层采用Myba ...

  9. .NET 环境中使用RabbitMQ 转发 http://www.cnblogs.com/yangecnu/p/4227535.html

    .NET 环境中使用RabbitMQ   在企业应用系统领域,会面对不同系统之间的通信.集成与整合,尤其当面临异构系统时,这种分布式的调用与通信变得越发重要.其次,系统中一般会有很多对实时性要求不高的 ...

  10. Python2 处理 Unicode 字符串的规则

    在 Python2 中处理 Unicode 字符串,需遵循如下规则: 1. 程序中的字符串要加前缀 u 2. 不要用 str(),而应该用 unicode() 作为字符串转换函数.不要使用 chr() ...