温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

使用Docker镜像怎么进行优化

发布时间:2020-11-27 14:07:36 来源:亿速云 阅读:230 作者:Leah 栏目:开发技术

这篇文章将为大家详细讲解有关使用Docker镜像怎么进行优化,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

我们有一个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:

使用Docker镜像怎么进行优化

很明显,由图我们可以看到,四条指令分别形成四个层,假设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

关于使用Docker镜像怎么进行优化就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI