docker鏡像創建與優化

1 . 創建鏡像

有兩種方法構建鏡像:

  1. docker commit :將運行的容器保存成鏡像
  2. Dockerfile:自動構建

使用docker commit 創建鏡像分為三步:

  1. 運行容器
  2. 修改容器
  3. 將容器保存為鏡像

舉例:

[root@docker ~]# docker load -i busybox.tar     # 導入鏡像
8a788232037e: Loading layer   1.37MB/1.37MB
Loaded image: busybox:latest
[root@docker ~]# docker run -it --name test busybox  # 運行
/ # ls
bin   dev   etc   home  proc  root  sys   tmp   usr   var
/ # ^C
/ # [root@docker ~]# 
[root@docker ~]# 

修改容器

/ # echo "hello toto" > testfile
/ # ls
bin       etc       proc      sys       tmp       var
dev       home      root      testfile  usr

將容器保存為新的鏡像:

docker commit test busybox:v2

查看新生成的鏡像:無法看新鏡像層的操作

IMAGE               CREATED              CREATED BY                                      SIZE                COMMENT
0cdf20286e29        About a minute ago   sh                                              46B                 
59788edf1f3e        9 months ago         /bin/sh -c #(nop)  CMD ["sh"]                   0B                  
<missing>           9 months ago         /bin/sh -c #(nop) ADD file:63eebd629a5f7558c…   1.15MB

直接運行新生成的鏡像容器:

docker run -it --name test busybox:v2 / # ls
bin       etc       proc      sys       tmp       var
dev       home      root      testfile  usr   # 里面保存了之前操作的數據。

以Dockerfile 創建鏡像

Dockerfile的詳細介紹:

1 、FROM:
用于指定base鏡像,本地不存在會從遠程倉庫進行下載

2、MAINTAINER
MAINTAINER:設置鏡像的作者,如用戶郵箱等(不是必須的)

3、COPY
把文件從build context復制到鏡像
支持兩種形式:COPY src dest和COPY [" src" ,"dest "]
src必須指定build context中的文件或目錄
dest為容器中的路徑

4 、ADD
用法與COPY類似,不同的是src可以是歸檔壓縮文件,文件會被自動解壓到dest,也可自動下載URL并拷貝到鏡像
DD html.tar /var/www ##解壓
ADD http://ip/html.tar /var/www ##下載

5 EXPOSE
如果容器中運行應用服務,則可以包服務端口暴露出去

6 、VOLUME
聲明數據卷,通常指定應用數據掛載點

  • 一般VOLUME指定掛載點,沒有此路徑就會新建路徑。
  • 在運行docker宿主機上,可以根據命令docker inspect 容器名的具體信息,可以查看封裝容器,聲明的數據卷,Source會存在此容器目錄掛接到本地_data目錄
  • 由于自動掛載的路徑很長,不太方便記,也可以在運行的時候指定掛載路徑

7 、WORKDIR
為RUN、CMD、ENTRYPOINT、ADD和COPY指令設置鏡像中的當前工作目錄,如果目錄不存在也會自動創建

8 、RUN
RUN 在容器中運行命令并創建新的鏡像層,常用于安裝軟件包:每個run 都會多一層

9 、ENV:
設置環境變量,變量可以被后續的指令使用

10 、CMD 與 ENTRYPOINT
設置容器啟動后執行的命令,但是CMD會被docker run 后面的命令覆蓋,但ENTRYPOINT不會

Dockerfile中只能指定一個ENTRYPOINT,如果指定過多則只有最后一個有效

docke run后面的參數可以傳遞給ENTRYPOINT指令當作參數;

舉例:

創建空目錄以及Dockerfile文件

[root@docker docker]# ls
dockerfile
[root@docker docker]# pwd
/root/docker
[root@docker docker]# vim dockerfileFROM busybox    # 以已經存在的busybox進行為base鏡像
RUN echo 'hello world'   # 新加的操作,每一個RUN產生一個新的鏡像層
RUN echo 'westos linux'

創建新的鏡像:. 表示Dockerfile所在的路徑

[root@docker docker]# docker build -t busybox:v2 .
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM busybox---> 59788edf1f3e
Step 2/3 : RUN echo 'hello world'---> Running in aeb63ff2b255
hello world
Removing intermediate container aeb63ff2b255---> 2f50636190bd
Step 3/3 : RUN echo 'westos linux'---> Running in 80071f12fdbb
westos linux
Removing intermediate container 80071f12fdbb---> 4b51d8f9a94b
Successfully built 4b51d8f9a94b
Successfully tagged busybox:v2

成功之后再次查看鏡像,已經成功生成鏡像

[root@docker docker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             v2                  4b51d8f9a94b        59 seconds ago      1.15MB
busybox             latest              59788edf1f3e        9 months ago        1.15MB
game2048            latest              19299002fdbe        2 years ago         55.5MB

查看新生成的鏡像分層結構:

能清楚的看到每一層鏡像進行的操作,使用者可以對鏡像進行審計

[root@docker docker]# docker history busybox:v2
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
4b51d8f9a94b        2 minutes ago       /bin/sh -c echo 'westos linux'                  0B                  
2f50636190bd        2 minutes ago       /bin/sh -c echo 'hello world'                   0B                  
59788edf1f3e        9 months ago        /bin/sh -c #(nop)  CMD ["sh"]                   0B                  
<missing>           9 months ago        /bin/sh -c #(nop) ADD file:63eebd629a5f7558c…   1.15MB      

當不修改剛才的Dockerfile的基礎上再次添加內容創建鏡像的時候

FROM busybox
RUN echo 'hello world'
RUN echo 'westos linux'
RUN echo haha > hahafile    # 添加一條新的語句

再上一次的基礎上構建新的鏡像

[root@docker docker]# docker build  -t busybox:v3 .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM busybox---> 59788edf1f3e
Step 2/4 : RUN echo 'hello world'---> Using cache---> 2f50636190bd
Step 3/4 : RUN echo 'westos linux'---> Using cache---> 4b51d8f9a94b
Step 4/4 : RUN echo haha > hahafile---> Running in 3d4df4fde1c6
Removing intermediate container 3d4df4fde1c6---> 9e1099db5b57
Successfully built 9e1099db5b57
Successfully tagged busybox:v3

查看新生成的鏡像分層結構:

在Dockerfile文件中,每一個RUN語句都會生成一個新的鏡像層。

[root@docker docker]# docker history busybox:v3
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
9e1099db5b57        49 seconds ago      /bin/sh -c echo haha > hahafile                 5B                  
4b51d8f9a94b        6 minutes ago       /bin/sh -c echo 'westos linux'                  0B                  
2f50636190bd        6 minutes ago       /bin/sh -c echo 'hello world'                   0B                  
59788edf1f3e        9 months ago        /bin/sh -c #(nop)  CMD ["sh"]                   0B                  
<missing>           9 months ago        /bin/sh -c #(nop) ADD file:63eebd629a5f7558c…   1.15MB              

docker鏡像優化:

1.優化鏡像應該主要有以下幾個方面:

1 選擇最精簡的基礎鏡像
2 減少鏡像的層數
3 清理鏡像構建的中間產物
4 注意優化網絡需求
5 盡量去用構建緩存

舉例(以nginx為例):

1、未優化

[root@docker docker]# ls
Dockerfile  nginx-1.15.8.tar.gz  westos.repo
[root@docker docker]# cat Dockerfile 
FROM rhel7 
EXPOSE 80   
VOLUME ["/usr/local/nginx/html"] 
ADD  nginx-1.15.9.tar.gz /mnt   
COPY westos.repo /etc/yum.repos.d/westos.repo
RUN rpmdb --rebuilddb  
RUN yum install -y gcc pcre-devel zlib-devel make
WORKDIR /mnt/nginx-1.15.9 
RUN ./configure --prefix=/usr/local/nginx 
RUN make
RUN make install 
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

創建鏡像并查看鏡像大小

docker build -t nginx:v1 .docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
nginx               v1                  c4712dcc2963        About a minute ago   295MB
rhel7               latest              0a3eb3fde7fd        5 years ago          140MB

2、 清理中間緩存并盡量減少鏡像層數

 vim Dockerfile FROM rhel7
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
ADD  nginx-1.15.9.tar.gz /mnt
COPY westos.repo /etc/yum.repos.d/westos.repo
WORKDIR /mnt/nginx-1.15.9
RUN rpmdb --rebuilddb && yum install -y gcc pcre-devel zlib-devel make && yum clean all && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx && make && make install
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

創建鏡像并查看鏡像大小

docker build -t nginx:v2 .docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               v2                  2b20e470e31c        25 seconds ago      252MB
nginx               v1                  c4712dcc2963        11 minutes ago      295MB
rhel7               latest              0a3eb3fde7fd        5 years ago         140MB

3、使用多階段構建方法

我們需要的只不過是編譯之后的軟件包,那么我們就可以在一容器編譯安裝以后,將編譯安裝之后的安裝包拷貝到另一個容器中,這樣就減小了不需要的開銷。并且將壓縮包刪除。

vim Dockerfile FROM rhel7 as build    # 這一階段只需需要完成nginx的編譯
ADD nginx-1.15.9.tar.gz /mnt
COPY westos.repo /etc/yum.repos.d/westos.repo
WORKDIR /mnt/nginx-1.15.9
RUN rpmdb --rebuilddb && yum install -y gcc pcre-devel zlib-devel make && yum clean all && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx && make && make install && rm -fr /mnt/nginx-1.15.8FROM rhel7    # 創建鏡像,將編譯好的文件直接拿過來用
COPY --from=build /usr/local/nginx /usr/local/nginx
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

創建鏡像并查看鏡像大小

 docker build -t nginx:v3 .docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               v3                  e5b903942033        19 seconds ago      141MB
nginx               v2                  2b20e470e31c        11 minutes ago      252MB
nginx               v1                  c4712dcc2963        22 minutes ago      295MB
rhel7               latest              0a3eb3fde7fd        5 years ago         140MB

4、減少底層base的大小

使用一個最基礎的系統環境鏡像。然后從nginx進行中將運行nginx所需要的依賴庫都導入到基礎的系統鏡像中,就可以滿足運行nginx的要求。做到最小化。

docker load -i distroless.tar				##一個基礎的系統環境鏡像
docker load -i nginx.tar			        ##nginx的進行,vim Dockerfile
FROM nginx:1.16 as base
# https://en.wikipedia.org/wiki/List_of_tz_database_time_zones 
ARG Asia/Shanghai
RUN mkdir -p /opt/var/cache/nginx && \
cp -a --parents /usr/lib/nginx /opt && \
cp -a --parents /usr/share/nginx /opt && \
cp -a --parents /var/log/nginx /opt && \
cp -aL --parents /var/run /opt && \
cp -a --parents /etc/nginx /opt && \
cp -a --parents /etc/passwd /opt && \
cp -a --parents /etc/group /opt && \
cp -a --parents /usr/sbin/nginx /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libpcre.so.* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libz.so.* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libc.so.* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libdl.so.* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libpthread.so.* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libcrypt.so.* /opt && \
cp -a --parents /usr/lib/x86_64-linux-gnu/libssl.so.* /opt && \
cp -a --parents /usr/lib/x86_64-linux-gnu/libcrypto.so.* /opt && \
cp /usr/share/zoneinfo/${TIME_ZONE:-ROC} /opt/etc/localtimeFROM gcr.io/distroless/base
COPY --from=base /opt /
EXPOSE 80
VOLUME ["/usr/share/nginx/html"]
ENTRYPOINT ["nginx", "-g", "daemon off;"]

創建鏡像并查看鏡像大小

docker images 
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
nginx                    v4                  cb475e8f4412        7 seconds ago       23.7MB
nginx                    v3                  e5b903942033        19 minutes ago      141MB
nginx                    1.16                ac44715da54a        4 weeks ago         109MB
rhel7                    latest              0a3eb3fde7fd        5 years ago         140MB
gcr.io/distroless/base   latest              9a255d5fe262        49 years ago        16.8MB

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/542001.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/542001.shtml
英文地址,請注明出處:http://en.pswp.cn/news/542001.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ISP運營商實驗室測試機架拓撲搭建經驗分享

大家好&#xff0c;有些日子沒更新干貨了&#xff0c;近期難得有假期進行修整&#xff0c;思前顧后還是坐下來聊聊自己長期負責維護和搭建的實驗室環境。廢話不多說&#xff0c;直接上圖。因為圖較大&#xff0c;分上下部分進行上傳。網絡主框架&#xff08;上&#xff09;服務…

關于二手交易用戶指南怎么寫_讓用戶拍案叫絕文案怎么寫?試試這3個方法

“共鳴”到底是什么&#xff1f; 為什么有些文章會引起共鳴&#xff0c;而有些則沒有。現在假設為產品家用手持式美容儀寫一份副本。 由于主要重點是“家庭使用”&#xff0c;因此您立即想到了“家庭美容”的口號。 盡管這句話很簡單易懂&#xff0c;但談論起來總是很簡單……似…

結構化程序goto語句_C ++ goto語句| 查找輸出程序| 套裝1

結構化程序goto語句Program 1: 程序1&#xff1a; #include <iostream>#include <math.h>using namespace std;int main(){int num1 1;int num2 0;MY_LABEL:num2 num1 * num1;cout << num2 << " ";num1 num1 pow(2, 0);if (num1 < …

docker倉庫搭建、加密、用戶認證

1 . 含義及理解&#xff1a; 倉庫分為公開倉庫&#xff08;Public&#xff09;和私有倉庫&#xff08;Private&#xff09;兩種形式。最大的公開倉庫是 Docker Hub&#xff0c;存放了數量龐大的鏡像供用戶下載。 國內的公開倉庫包括 Docker Pool等&#xff0c;可以提供大陸用戶…

Centos7+Nginx+Keepalived實現Apache服務的高可用負載均衡

Centos7NginxKeepalived實現Apache服務的高可用&負載均衡今天是2017年的第一天&#xff0c;昨天也就是2016年的最后一天&#xff0c;我嘗試部署了Centos7NginxKeepalived實現WEB服務的高可用負載均衡服務&#xff0c;終于在2017年的第一天前完成了&#xff0c;所以在此分享…

客戶端通過網口啟動可過去的ip_西安交通大學16年3月課程考試《網絡組網技術綜合訓練》作業考核試題...

西安交通大學16年3月課程考試《網絡組網技術綜合訓練》作業考核試題一、單選題(共 20 道試題&#xff0c;共 40 分。)V 1. 下列不屬于服務器內部結構的是()A. CPUB. 電源C. 5類雙絞線D. 北橋芯片滿分&#xff1a;2 分2. 網絡中使用光纜的優點是()A. 便宜B. 容易安裝C. 是一個工…

mcq 隊列_MCQ | 軟件工程基礎知識/簡介(1)

mcq 隊列Q1. Which of the following is a part of the software? Q1。 以下哪個是軟件的一部分&#xff1f; Programs 程式 Documentation 文獻資料 Operating Procedures 運營流程 All of the above 上述所有的 Answer: d. All of the above 答案&#xff1a; d。 上述所有…

docker設置鏡像加速器

設置鏡像加速器 一般情況下&#xff0c;直接從官方倉庫中直接拉取鏡像會比較慢&#xff0c;可以設置鏡像加速器&#xff0c;相當于一個反向代理。以阿里云為例 1 . 首先獲取自己的加速器地址 www.aliyun.com 登陸自己的賬號&#xff08;可以是支付寶賬號&#xff09; 首頁點…

keytool條目_java keytool 常用命令

最近在做ssl連接active directory&#xff0c; 遇到了不少的ssl的問題。連接ssl時會需要用將證書保存到keystore&#xff0c; 而這個步驟剛好就用到了keytool命令。直接敲keytool會有提示如何用這個命令&#xff0c; 但對于完全不懂的我&#xff0c;還是找了下基本命令&#xf…

用JavaScript中的示例進行fill()函數

fill() is a predefined function in JavaScript, which is used to fill all elements of an array with a static value. fill()是JavaScript中的預定義函數&#xff0c;用于用靜態值填充數組的所有元素。 Example: 例&#xff1a; <html><head><title>J…

談談重載(overload)覆蓋(override)與隱藏

這三個概念都是與OO中的多態有關系的。如果單是區別重載與覆蓋這兩個概念是比較容易的&#xff0c;但是隱藏這一概念卻使問題變得有點復雜了&#xff0c;下面說說它們的區別吧。重載是指不同的函數使用相同的函數名&#xff0c;但是函數的參數個數或類型不同。調用的時候根據函…

搭建Harbor私有倉庫

1 首先裝好docker&#xff1a; 由于之前已安裝過&#xff0c;所以直接開起就行 2 . 安裝python2.7以上版本 之前編譯安裝過7.3的&#xff0c;直接用吧 3 . 安裝docker-compose docker容器管理工具&#xff0c;是habor的依賴之一。 curl -L "https://github.com/docker…

mysql日志查詢指令_MySQL查詢日志總結

MySQL查詢日志介紹MySQL的查詢日志記錄了所有MySQL數據庫請求的信息。無論這些請求是否得到了正確的執行。默認文件名為hostname.log。默認情況下MySQL查詢日志是關閉的。生產環境&#xff0c;如果開啟MySQL查詢日志&#xff0c;對性能還是有蠻大的影響的。另外很多時候&#x…

thinkphp5.0助手函數占用服務器資源

db(user) 默認情況下&#xff0c;每次請求都會重新連接數據庫&#xff0c;這樣會占用服務器資源 方法1.如果不想每次都重連可以這樣 db("List",[],false) 方法2.還可以直接改function&#xff0c;及則需要把 function db($name , $config [], $force true){retu…

python 無符號整數_Python中的有符號和無符號整數數組

python 無符號整數An array can be declared by using "array" module in Python. 可以通過在Python中使用“數組”模塊來聲明數組 。 Syntax to import "array" module: 導入“數組”模塊的語法&#xff1a; import array as array_alias_nameHere, imp…

mysql快速批量入庫_MySQL-批量入庫優化

MySQL批量入庫的方式循環一條一條入庫批量入庫通過程序組合 insert into (字段) tbl vlaues(), vlaues(), vlaues(),...事務入庫$autoCommit (isset($this->startTransaction) ? !$this->startTransaction : true);$ids array();if ($autoCommit) {$this->startTra…

docker集群搭建(k8s)

1 . 理解&#xff1a; Kubernetes是一個開源的&#xff0c;用于管理云平臺中多個主機上的容器化的應用&#xff0c;Kubernetes的目標是讓部署容器化的應用簡單并且高效&#xff08;powerful&#xff09;,Kubernetes提供了應用部署&#xff0c;規劃&#xff0c;更新&#xff0c…

Python模擬刪除字符串兩邊的空白

目標&#xff1a;   1.使用string模塊的whitespace   2.刪除左邊、右邊以及兩邊的空白 代碼如下&#xff1a; [rootlocalhost python]# cat rmspace.py #!/usr/bin/env python #coding:utf8 """ 使用字符串刪除左右兩端的空白。 """from str…

xml分析錯誤:注釋未終止_錯誤:C中的未終止注釋(無效的注釋塊) 常見的C程序錯誤...

xml分析錯誤:注釋未終止Comments are used to write logic explain or anything that you do not want to compile. In C language there are two types of comments 1) Single line comment and 2) Multi-line comment. 注釋用于編寫邏輯解釋或您不想編譯的任何內容。 在C語言…

查看 mysql 狀態_查看mysql狀態的常用命令

在mysql客戶端輸入"show status"之后將會看到如下輸出&#xff1a;如果想要查看某個具體的值&#xff0c;可以使用如下命令&#xff1a;show status LIKE "%具體變量%";Aborted_clients 由于客戶沒有正確關閉連接已經死掉&#xff0c;已經放棄的連接數量.A…