您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關使用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:
很明顯,由圖我們可以看到,四條指令分別形成四個層,假設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鏡像怎么進行優化就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。