现如今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 '"htmlcode">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镜像压缩与优化操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 三国志8重制版恶名怎么消除 恶名影响与消除方法介绍
- 模拟之声慢刻CD《柏林之声5》2019[原抓WAV+CUE]
- AlexandraSoumm-Parisestunefte(2024)[24Bit-96kHz]FLAC
- 李嘉《国语转调1》[天王唱片][WAV整轨]
- 不是哥们 这都能跑?网友展示用720显卡跑《黑神话》
- 玩家自制《黑神话:悟空》亢金星君3D动画 现代妆容绝美
- 大佬的审美冲击!《GTA6》环境设计师展示最新作品
- 纪晓君.2001-野火·春风【魔岩】【WAV+CUE】
- 汪峰.2005-怒放的生命【创盟音乐】【WAV+CUE】
- 群星.1995-坠入情网【宝丽金】【WAV+CUE】
- 群星《谁杀死了Hi-Fi音乐》涂鸦精品 [WAV+CUE][1G]
- 群星1998《宝丽金最精彩98》香港首版[WAV+CUE][1G]
- 汪峰《也许我可以无视死亡》星文[WAV+CUE][1G]
- 李嘉-1991《国语转调2》[天王唱片][WAV整轨]
- 蔡琴2008《金声回忆录101》6CD[环星唱片][WAV整轨]