现如今docker如此受人追捧,主要是因为它的轻量化、可以快速部署以及资源的利用。但是一个docker images质量的好与坏,主要取决于dockerfile编写的质量。同样功能的镜像,但是不同的dockerfile build出来的镜像大小是不一样的,这是因为docker是由一层一层的只读层累积起来的,而这每一层就是dockerfile中的每一条指令,所以docker image的大小完全取决于dockerfile中的每条指令生成的中间层的大小,

下面我们来举一个小例子来详细说明dockerimage的形成。

我们有一个dockerfile:

from ubuntu:14.04

add run.sh /

volume /data

cmd [“./run.sh”]

这个简单的dockerfile主要做的事情是:基于ubuntu:14.04系统将run.sh放在根目录下,设置卷挂载点,然后在image启动的时候run脚本run.sh。

下图就是形成的docker image:

很明显,由图我们可以看到,四条指令分别形成四个层,假设ubuntu:14.04是150mb,run.sh是1mb的话,那么from ubuntu:14.04层的大小就是150mb,add run.sh /层的大小即为1mb,而volume /data层和cmd [“./run.sh”]由于没有加入文件等数据,也没有在系统中生成数据,所以该层的大小为0。

所以整个image的大小就是151mb。在知道了docker image生成的原理之后,下面我们就来聊一下docker镜像的优化与压缩。

需要说明的一点就是:层数的多少在某些情况下是不会决定image的大小的,只有当dockerfile中出现:

run yum install ***

run yum uninstall ***

的时候镜像是可以压缩优化的,因为上面这两句是安装一个工具,然后卸载掉,正常情况下我们感觉这样一安装一卸载大小就为0了,但是在docker image中不是这样的,run yum uninstall ***这一层只能是令上一层不可见,但是上一层的大小是不会变化的,所以,如果想达到0的效果,我们就需要将这两层压缩成一层,也就是这样写:

run yum install *** && \

yumuninstall ***

这样就会达到压缩镜像的效果。

所以,压缩镜像主要有两点:

1、选择一个较小的原镜像,也就是from后面的那个镜像尽量要小。

2、根据实际情况对dockerfile中的层进行合并,具体情况就是如上述所说的情况,要知道并不是随便合并层就会达到效果的。

补充知识:如何将anaconda+jupyter build成docker镜像

最近由于业务的需求,要build一个jupyter的image来提供服务,因为docker的轻量化可以很方便的迁移。

下面来介绍一下我所做的操作,以及我踩的坑:

首先来安装anaconda,有python2和3版本的,版本不同但是build的过程是一样的,有两种方式,第一种,你可以通过dockerfile的方式来build image,但是在运行anaconda2-5.0.1-linux-x86_64.sh脚本的时候无法实现交互,所以,我才用了docker commit的方式来执行,但是事实证明也可以通过dockerfile的方式来build,您只需要在本机上先运行了anaconda2-5.0.1-linux-x86_64.sh的脚本,并将生成的文件夹就是anaconda2 add到image中相应的位置,并且修改环境变量,将path加进去即可。

下面以python2为例来说:

1. 从anaconda官网上下载运行脚本anaconda2-5.0.1-linux-x86_64.sh,其中在下载的时候要注意你的系统的是32位还是64位。

2. 将脚本scp到基础镜像中,安装解压指令bzip2

yum install bzip2

3. 运行脚本(一路输入yes)

sh anaconda2-5.0.1-linux-x86_64.sh

4. 更新anaconda

conda update anaconda

5. 安装jupyter

conda install jupyter

6. 创建登录密码

root@localhost ~]# ipython

python 3.5.2 (default, aug 4 2017, 02:13:48)

type 'copyright', 'credits' or 'license' for more information

ipython 6.1.0 -- an enhanced interactive python. type '?' for help.

in [1]: from notebook.auth import passwd

in [2]: passwd()

enter password:

verify password:

out[2]: 'sha1:5311cd8b9da9:70dd3321fccb5b5d77e66080a5d3d943ab9752b4'

7. 生成配置文件

jupyter notebook --generate-config --allow-root

注意:在这一步的时候有可能会遇见编码错误:unicodeencodeerror:'ascii'codec can't encode characters in position...

处理的方法是:在anaconda2文件夹中的lib>python2.7>site.py更改:

if 0:

# enable to support locale aware default string encodings.

import locale

loc = locale.getdefaultlocale()

if loc[1]:

encoding = loc[1]

#将上述代码段中if后面的0改成1,保存,重新启动anaconda。

8. 修改配置文件:

vi ~/.jupyter/jupyter_notebook_config.py

添加以下内容:

c.notebookapp.ip='*'

c.notebookapp.password = u'sha1:5311cd8b9da9:70dd3321fccb5b5d77e66080a5d3d943ab9752b4' #注意这里的密钥是刚刚生成的那个

c.notebookapp.open_browser = false

c.notebookapp.port =8888 #随便指定一个端口,使用默认8888也可以

9.保存镜像

docker commit 容器id 镜像名称

10. 启动images提供服务:

docker run --privileged -d -p 8889:8888 -v /sys/fs/cgroup:/sys/fs/cgroup --name jupyter jupyter2:v2 /usr/sbin/init

注意:centos7有一个大坑,就是你在关闭防火墙的时候,systemctl 无法使用,报错: failed to get d-bus connection : operation not permitted

所以要用init来起,在dockerfile中可以用cmd来使运行时启动。

11. 进入docker image

docker exec -it jupyter /bin/bash

12.关闭防火墙

systemctl stop firewalls.service

13. 启动jupyter

jupyter notebook --notebook-dir=/root/ --allow-root

14.在浏览器输入服务器的ip+映射的端口号即可访问,完成~

以上这篇docker镜像压缩与优化操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持萬仟网。

希望与广大网友互动??

点此进行留言吧!

python docker 镜像过大_Docker镜像压缩与优化操作相关推荐

  1. docker 镜像重命名_Docker 镜像该怎么传

    开门见山,提一个问题,如何把一个容器从开发环境取出来,到其他机器上跑起来?docker hub是一个很好的选择,把镜像提交上去,到另外的机器上拉取下来,很方便. 但是,没有网络怎么办,本文告诉你如何操 ...

  2. docker 镜像重命名_Docker镜像管理(二)

    在<Docker镜像管理(一)>中介绍了使用Docker Hub来管理你的Docker镜像,小伙伴们在创建仓库时,细心的同学可能已经发现再次创建private类型的仓库时,不能创建了,如下 ...

  3. docker pull 下载一半_docker镜像pull不下来最终解决方法

    pull镜像wordpress下来,但是出现如下错误: # docker pull wordpress:latest Error response from daemon: Get https://r ...

  4. docker 镜像_Docker镜像分层

    为了有效地利用存储驱动程序,了解Docker如何构建和存储镜像以及如何使用这些镜像非常重要. 镜像分层 Docker镜像是由一系列层来构成的,每层代表Dockerfile中的一条指令,依下面Docke ...

  5. docker pull的镜像放在哪里_Docker 安装ELK及Docker常见命令

    最近搭建基于Spring Cloud的微服务框架,日志系统当然最佳选择就是ELK.看着MAC 那紧巴巴的配置,又不想热情退去而留下一堆软件,果断选择Docker安装来节省那可怜的资源.当然这只是鹏哥的 ...

  6. 系统制成docker镜像_docker镜像原理 镜像制作 dockerfile

    为什么一个centos镜像只有两百多兆,而tomcat镜像五百多兆 1.先说说操作系统 操作系统组成部分: 进程调度子系统 进程通信子系统 内存管理子系统 设备管理子系统 文件管理子系统 网络通信子系 ...

  7. docker公共存储库_Docker入门(2)——镜像结构和私有镜像库

    前面一篇教程里面,我们操练了一下如何在一台服务器上实际安装和使用docker.接下来我们来讨论一下和镜像有关的话题. Docker镜像的分层结构 前面我们也提到过,docker在宿主机上面并不是以一个 ...

  8. docker pull 下载一半_Docker三个重要的基本操作,镜像,容量,仓库

    前言 Docker的功能和特性有很多,各种运行命令.参数等也都要学习和练习. 比如:如何管理数据.如何管理网络.如何互相配合工作.如何编写更专业的Dockerfile等. 本文讲讲Docker镜像,容 ...

  9. docker build命令详解_Docker镜像与容器常用命令图文详解

    一.系统命令 #查看docker版本 docker version #查看docker的系统信息,包含镜像容器的数量 docker info #查看docker的所有命令 docker --help ...

最新文章

  1. 手机芯片谁是AI之王?高通、联发科均超华为
  2. Scala开发入门教程
  3. 如何配置Windows Live Writer
  4. 海华·垃圾分类AI挑战赛baseline分享,评测得分最高至0.85
  5. Windows10避开注册的方式安装sourceTree,Failed to connect to github.com port 443: Timed out问题解决
  6. #宝塔面板# #nginx+apache# KVS服务器运行环境搭建过程记录
  7. 实现背景透明的方法,兼容ie6/7/8等浏览器
  8. python存储序列_python序列类型及一些操作
  9. idea创建springboot项目+mybatis_从spring boot项目创建到netty项目过渡1
  10. Vim 还是 Emacs
  11. R读写Excel文件中数据的方法
  12. 字符串t1t2t3t4
  13. 通俗易懂的Monte Carlo积分方法(一)
  14. HCL_路由器_OSPF配置
  15. uReport2报表工具的基础使用及注意事项
  16. webmax函数高级教程整理集2
  17. C语言解决一个人有100元钱,打算买100只鸡。到市场上面一看,公鸡一只3元,母鸡一只5元,小鸡3只一元,试求用100元买100只鸡,各买多少合适?
  18. CTF-数据分析(二)
  19. 优秀网页设计的七条基本准则
  20. u盘打开提示格式化怎么办?有用的方法来了

热门文章

  1. cmd执行python脚本命令大全_Python脚本实现在cmd执行相关命令
  2. 人死后竟然会知道自己死了?
  3. python 怎么算l2范数_向量范数与矩阵范数(L0, L1, L2)
  4. 用于RF收发器的简单基带处理器
  5. 非数学类全国大学生数学竞赛总结
  6. 集成Opencascade+Gmsh+OSG的CAD测试程序
  7. java刷票代码_Java 刷票器
  8. NLP机器阅读理解:四大任务及相应数据集、比赛
  9. 利用python预测交通拥堵_Python可视化轻松展示交通拥堵情况
  10. 2019清华计算机考研名单,2019清华大学研究生硕士考研拟录取名单