谷歌技术人员解决Docker镜像体积太大问题的方法

虚拟机的问题

最初,大家都使用虚拟机作为软件的运行环境,对外提供服务。为了在虚拟机上运行你的 Service,你不得不运行一大堆程序:

系统进程
定时任务
SSH
安装 Agent
安装 Bash
安装一大堆 libs

其实,你仅仅只是想让你的 Service运行起来,但你不得不维护一个 40GB的虚拟机。

然后你开始试用 Docker

开始试用 Docker,你毫不犹豫选择了和之前虚拟机一样的镜像:Ubuntu 1404,将之前的虚机的内容复制到了 Docker镜像,安装了一堆软件,最后发现你的 Docker镜像有 8GB。

谷歌的 Docker镜像构建实践

找到最小的基础镜像

Alpine Linux是基于 musl和 BusyBox的操作系统,目的是为了为用户提供更高效的资源使用效率。它的特性是体积小,最小的 Alpine Linux体积可以只有 5MB。谷歌某些团队使用 Alpine Linux作为 Docker Build的基础镜像。

目的:仅仅为了运行 Service

谷歌认为,为了运行一个 Service,并不需要将那些无关联的包、程序打包到容器里,换句话说,Docker镜像里只留下需要用到的,其他的都删除,从而得到一个最小的镜像。这需要考虑以下几点:

1、程序编译后的二进制文件(从 Artifactory获取)

2、程序的所有依赖(从 Artifactory获取)

3、程序语言的运行时(libc,JRE,node,…)

4、任何程序和 Kernel之间的中间件

其实这一切的信息,构建工具都已经知道。

谷歌的构建工具 Bazel

介绍 Bazel之前,先介绍下谷歌的开发模式,对于服务器端代码库,谷歌的开发流程如下:

1、所有的服务器端代码库都在一个巨大的版本控制系统里

2、每个人都用 Bazel构建软件

3、不同的组负责源码树的不同部分,所有的组件都是作为 BUILD目标来用

4、分支主要是用来管理发布,所以每个人都在最新版本上开发软件

Bazel(https://bazel.build/)是 Google内部用来构建自己的服务器端软件的工具。目前变成谷歌公司贡献的一个开源项目,目的是帮助开发者将软件的构建和测试变得更快、更可靠。

从上图可以看到,Bazel有 WORDSPACE的概念,WORDSPACE文件用来准备 Docker镜像构建所依赖的所有材料和来源。BUILD文件用来告诉 Bazel这个镜像应该使用什么命令进行构建,以及如何构建、如何测试。

使用 Bazel的声明式语言: WORKSPACE和 BUILD,开发者可以用文件描述整个构建和部署的环境。谷歌使用 Bazel进行 Docker的构建已经很多年,它为谷歌带来以下收益:

1、支持跨平台构建,分布式缓存,优化依赖解析,并行构建,增量构建。

2、支持多语言(Java, C++, Android, iOS, Go等等)。

3、跨平台。

4、水平扩展和自定义扩展。

Bazel是以下理念的奠基石:由于 Bazel需要所有的依赖都被完整地指定,我们可以预测改动影响了哪些程序和测试,并在提交前执行他们。

谷歌提供的 Distroless镜像构建文件

Distroless (https://github.com/GoogleCloudPlatform/distroless)是谷歌内部使用的镜像构建文件,包括 Java、Node、Python等镜像构建文件,Distroless仅仅只包含运行服务所需要的最小镜像,不包含包管理工具、shell命令行等其他功能。

为什么你需要这些镜像?这些镜像是谷歌和其他大公司的最佳实践的产物,经过了漏洞扫描,镜像会持续更新,保持安全性。

如何使用?Distroless提供的构建镜像的 BUILD文件,通过 Bazel可以直接进行构建。

谷歌为大家介绍了内部如何解决镜像过大的问题,以及进行大规模并发构建、测试所用到的构建工具 Bazel,并且开源了 Docker镜像构建文件 Distroless项目。如果你认为你的镜像也存在体积太大的问题,可以参考谷歌的实践,体验他们的工具。

总结

以上就是本文关于谷歌技术人员解决Docker镜像体积太大问题的方法的全部内容,希望对大家有所帮助。感兴趣的朋友可以可以继续参阅本站:

Docker探索namespace详解

详解Docker使用Linux iptables 和 Interfaces管理容器网络

浅谈Docker安全机制内核安全与容器之间的网络安全

如有不足之处,欢迎留言指出。

您可能感兴趣的文章:

  • docker 如何删除none镜像
  • 如何给Docker配置官方国内加速镜像
  • 详解在docker中制作自己的JDK+tomcat镜像
  • 详解Docker 国内镜像的配置及使用
  • Dockerfile制作官方Tomcat镜像及镜像使用详解
  • Docker配置国内加速器加速镜像下载的方法
  • 在 docker 之间导出导入镜像的方法
  • docker中修改镜像容器的存放目录的方法
(0)

相关推荐

  • 如何给Docker配置官方国内加速镜像

    在国内访问 Docker 官方的镜像,一直以来速度都慢如蜗牛.为了快速访问 Docker 官方镜像都会配置三方加速器,目前常用三方加速器有: 网易 . USTC . DaoCloud . 阿里云 . 现在 Docker 官方针对中国区推出了镜像加速服务.通过 Docker 官方镜像加速,国内用户能够以更快的下载速度和更强的稳定性访问最流行的 Docker 镜像. 如何使用官方镜像 Docker 中国官方镜像加速可通过 registry.docker-cn.com 访问.目前该镜像库只包含流行的公

  • Docker配置国内加速器加速镜像下载的方法

    引言 由于网络原因,我们在pull Image 的时候,从Docker Hub上下载会很慢...所以,国内的Docker爱好者们就添加了一一些国内的镜像(mirror),方便大家使用. 配置阿里云加速器1. 登录阿里开发者平台:https://dev.aliyun.com/search.html2. 点击"创建我的容器镜像" 3. 注册/登录后,进入Docker 镜像仓库 (https://cr.console.aliyun.com/#/imageList),选中加速器 Tab 这里可

  • docker 如何删除none镜像

    删除none的镜像,要先删除镜像中的容器.要删除镜像中的容器,必须先停止容器. $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE <none> <none> 168b258ceea3 34 seconds ago 460.6 MB <none> <none> b2c5d34941c6 23 minutes ago 588.7 MB tankzhang/es v1 85fc66558c37 13 days

  • 详解在docker中制作自己的JDK+tomcat镜像

    也许你和我一样,想要自己亲手制作一个热乎乎的镜像,最好自己指定JDK版本和tomcat版本.当然,这是可以的. 根据我的水平,目前有两种办法可以制作我想要的这个镜像.来,我们先说简单点的. 方式一 首先,准备好想要的jdk和tomcat,另外,我们需要创建一个Dockerfile文件,什么,你说你不知道Dockerfile是什么也不会写Dockerfile文件?哦,那也没关系吧,你Ctrl+C就好了.下面展示一个Dockerfile文件的完整内容: FROM ubuntu:14.10 MAINT

  • Dockerfile制作官方Tomcat镜像及镜像使用详解

    这两天学习了Dockerfile感觉这个地方知识点挺多的,而且很重要,所以,今天添加一点小笔记. 官方Tomcat镜像 地址:https://hub.docker.com/_/tomcat/ 镜像的Full Description中,我们可以得到许多信息,这里简单介绍几个: 1.Supported tags and respective Dockerfile links 支持的标签,以及对应的Dockerfile链接.一个Dockerfile可以对应多个标签,我们将以8.5.16-jre8版本的

  • 详解Docker 国内镜像的配置及使用

    Docker国内镜像 DaoCloud - Docker加速器 阿里云 - 开发者平台 微镜像 - 希云cSphere 镜像广场 - 时速云 灵雀云 网易蜂巢 阿里云的Docker加速器 阿里云 - 开发者平台:https://dev.aliyun.com/ 阿里云 - 容器Hub服务控制台:https://cr.console.aliyun.com/ 注册并登陆阿里云 - 开发者平台之后,在首页点击"创建我的容器镜像",然后就会来到阿里云的服务面板.点击加速器标签. 根据提示输入Do

  • 在 docker 之间导出导入镜像的方法

    很喜欢玩docker,但最新遇到一个问题,公司给的新机器的dns有问题,导致pull不下来镜像. 没办法了,没有镜像什么神马都干不了,又不能花很多时间去搭建私有的镜像库,只有另寻办法了. 废话少说,经过探究,发现 docker 提供把镜像导出export(保存save)为文件的机制,这样就可以把镜像copy到任意地方了. 1. 导出 export - 导入 import 格式:docker export CONTAINER(容器) 使用 docker ps -a 查看本机已有的容器,如: 我们使

  • docker中修改镜像容器的存放目录的方法

    最近在学习docker的路上,今天遇到了个问题,在网上查找了一下资料,顺便留个笔记 在默认情况下,Docker镜像和容器的默认存放位置为: /var/lib/docker 一般根下分区我们不会给太大.镜像和容器越存越多一般我们有两种解决方法: 1. 挂载大分区到/var/lib/docker 一般选择建立逻辑分区lvm,方便后期扩展集体. 建立新分区,并格式化 [root@localhost lib]# lvcreate -L 300G lv_docker vg_home [root@local

  • 谷歌技术人员解决Docker镜像体积太大问题的方法

    虚拟机的问题 最初,大家都使用虚拟机作为软件的运行环境,对外提供服务.为了在虚拟机上运行你的 Service,你不得不运行一大堆程序: 系统进程 定时任务 SSH 安装 Agent 安装 Bash 安装一大堆 libs 其实,你仅仅只是想让你的 Service运行起来,但你不得不维护一个 40GB的虚拟机. 然后你开始试用 Docker 开始试用 Docker,你毫不犹豫选择了和之前虚拟机一样的镜像:Ubuntu 1404,将之前的虚机的内容复制到了 Docker镜像,安装了一堆软件,最后发现你

  • 修改Docker镜像默认存储位置的方法(解决方法)

    由于系统初始分区的原因,导致操作系统中对应 / 分区不会太大,通过 /var 目录不会单独分区.如果上面运行 Docker 服务,经过长时间的使用,会使原本就比较大的分区越来越不够用.如何更好地的处理这个问题呢? 1. 使用软链接 我们知道在操作系统当中,默认情况下 Docker 容器的存放位置在 /var/lib/docker 目录下面,可以通过下面命令查看具体位置. # 默认存放位置 $ sudo docker info | grep "Docker Root Dir" 解决默认存

  • 基于Docker镜像部署go项目的方法步骤

    依赖知识 Go交叉编译基础 Docker基础 Dockerfile自定义镜像基础 docker-compose编排文件编写基础 当然,一点也不会也可以按照这个步骤部署完成,不过可能中间如果出点小问题,会不知道怎么解决,当然你也可以留言. 我是在mac环境上开发测试的,如果你是在windows上可能有一点出入,但应该不会有啥大问题. 一.依赖环境 Docker 二.编写一个GoLang web程序 我这里就写一个最简单的hello world程序吧,监听端口是80端口. 新建一个main.go文件

  • 解决Docker容器没有vim命令的方法

    发现问题 今天在尝试修改Docker容器内文件时, 发现容器内并没有vim命令, 返回了: vim my.cnf bash: vim: command not found 本篇文章就来记录下如何解决此问题. 解决方案 仍然在docker容器内部, 首先运行以下命令, 并耐心等待一会儿: apt-get update 完成后运行: apt-get install vim 等待安装完成后, 运行以下命令, 验证是否安装成功: vim 如果返回了类似以下界面则证明vim安装成功: VIM安装成功返回

  • Docker镜像构建的两种方法解析

    关于Docker里面的几个主要概念 这里用个不太恰当的比方来说明. 大家肯定安装过ghost系统,镜像就像是ghost文件,容器就像是ghost系统.你可以拿别人的ghost文件安装系统(使用镜像运行容器),也可以把自己现有的系统制作成ghost文件(从容器构建镜像).Dockerfile则像是一个生成ghost文件的脚本(镜像构建脚本),这个脚本会指定去哪里下载哪个版本的window系统,再去哪里下载哪些软件并安装,再修改哪些配置文件,等等.本文主要讲的是,如何从容器构建镜像(把现有系统制作成

  • 构建Golang应用最小Docker镜像的实现

    我通常使用docker运行我的 golang 程序,在这里分享一下我构建 docker 镜像的经验.我构建 docker 镜像不仅优化构建后的体积,还要优化构建速度. 示例应用 首先贴出代码例子,我们假设要构建一个 http 服务 package main import ( "fmt" "net/http" "time" "github.com/gin-gonic/gin" ) func main() { fmt.Printl

  • 详解制作各种docker镜像

    做了一个星期的镜像,收货颇多,现在整理记录下来,当做工作笔记吧.把常用的几个镜像的Dockerfile分享下. 制作基础docker镜像 第一步:设置Docker镜像源 复制代码 代码如下: yum install -y yum-priorities && rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm && rpm --import /etc/pki/rp

  • 详解Maven Docker镜像使用技巧

    本文介绍了Maven Docker镜像使用技巧,分享给大家,具体如下: Maven是目前最流行的Java项目管理工具之一,提供了强大的包依赖管理和应用构建功能. Docker提供了官方的Maven镜像可以用于管理和构建Java应用.与直接安装使用Maven工具相比,使用Docker镜像具有更好的可移植性,可以方便地进行版本切换,非常适合在持续集成过程中使用. 关于Maven官方镜像的用法可以参考使用文档 使用阿里云加速 Maven官方仓库在国内网络下的下载速度实在是让人欲哭无泪,利用阿里云的Ma

  • 使用Dockerfile构建docker镜像

    今天我们看看Dockerfile创建的方法. 构建docker镜像,有两种方法: 1.一种是使用docker commit命令 2.另外一种是基于docker build命令和dockerfile文件 通常情况下,dockerfile构建镜像比docker commit命令构建 镜像更加灵活,因此采用后者较多. 使用Dockerfile构建docker镜像 1.什么是Dockerfile? dockerfile是一个文件,它是使用DSL语法编写一个文件,之后使用docker build命令基于该

  • docker镜像无法删除 Error:No such image:xxxxxx解决

    前言 docker镜像无法删除,通过 docker images 查看镜像明明存在就是删除不了. 删除提示:Error:No such image:xxxxxxx 具体截图内容如下: 解决方法 进入目录: cd /var/lib/docker/image/overlay2/imagedb/content/sha256 该目录即为 docker 中的所有镜像文件(以shar256加密方式加密后的镜像文件),我们通过 ll 查看一下: 删哪个呢?别慌,docker images 中的 IMAGE I

随机推荐