<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          編寫 Dockerfile 最佳實(shí)踐

          共 3784字,需瀏覽 8分鐘

           ·

          2021-09-03 18:50

          官方倉庫雖然有數(shù)十萬計(jì)的免費(fèi)鏡像,但大多數(shù)無法直接滿足公司業(yè)務(wù)需求,這就需要我們自己去定制鏡像了。

          Docker通過Dockerfile自動構(gòu)建鏡像,Dockerfile是一個(gè)包含用于組建鏡像的文本文件,由一條一條的指令組成。

          這里,給你提供5點(diǎn)編寫建議,可幫助你編寫高效易用的Dockerfile。 


          1、減少鏡像層
          一次RUN指令形成新的一層,盡量Shell命令都寫在一行,減少鏡像層。
          例如:

          FROM centos:7
          MAINTAINER www.aliangedu.cn
          RUN yum install epel-release -y
          RUN yum install -y gcc gcc-c++ make -y
          RUN wget http://docs.php.net/distributions/php-5.6.36.tar.gz
          RUN tar zxf php-5.6.36.tar.gz
          RUN cd php-5.6.36
          RUN ./configure --prefix=/usr/local/php
          RUN make -j 4 
          RUN make install
          EXPOSE 9000
          CMD ["php-fpm"]


          應(yīng)該寫成:

          FROM centos:7
          MAINTAINER www.aliangedu.cn
          RUN yum install epel-release -y && \
              yum install -y gcc gcc-c++ make

          RUN wget http://docs.php.net/distributions/php-5.6.36.tar.gz && \
              tar zxf php-5.6.36.tar.gz && \
              cd php-5.6.36 && \
              ./configure --prefix=/usr/local/php && \
              make -j 4 && make install
          EXPOSE 9000
          CMD ["php-fpm"]


          結(jié)果:12層 -> 6層

          2、優(yōu)化鏡像大?。呵謇頍o用數(shù)據(jù)

          一次RUN形成新的一層,如果沒有在同一層刪除,無論文件是否最后刪除,都會帶到下一層,所以要在每一層清理對應(yīng)的殘留數(shù)據(jù),減小鏡像大小。

          FROM centos:7
          MAINTAINER www.aliangedu.cn
          RUN yum install epel-release -y && \
              yum install -y gcc gcc-c++ make gd-devel libxml2-devel \
              libcurl-devel libjpeg-devel libpng-devel openssl-devel \
              libmcrypt-devel libxslt-devel libtidy-devel autoconf \
              iproute net-tools telnet wget curl && \
              yum clean all && \
              rm -rf /var/cache/yum/*

          RUN wget http://docs.php.net/distributions/php-5.6.36.tar.gz && \
              tar zxf php-5.6.36.tar.gz && \
              cd php-5.6.36 && \
              ./configure --prefix=/usr/local/php \
              make -j 4 && make install && \
              cd / && rm -rf php*


          至少能節(jié)省幾十M,甚至幾百M(fèi)。


          3、減少網(wǎng)絡(luò)傳輸時(shí)間

          最好在內(nèi)部有一個(gè)存放軟件包的地方,類似于上述的PHP官方下載地址:http://docs.php.net/distributions/php-5.6.36.tar.gz,如果用到maven構(gòu)建這樣的操作,同時(shí)也更改為私有maven倉庫,減少網(wǎng)絡(luò)傳輸時(shí)間,提高鏡像構(gòu)建速度。

          4、多階段進(jìn)行鏡像構(gòu)建

          • 如果運(yùn)行一個(gè)項(xiàng)目,根據(jù)咱們上面的做法,是直接把代碼拷貝到基礎(chǔ)鏡像里,如果是一個(gè)需要預(yù)先代碼編譯的項(xiàng)目呢?例如JAVA語言,如何代碼編譯、部署在一起完成呢!

          • 上面做法需要事先在一個(gè)Dockerfile構(gòu)建一個(gè)基礎(chǔ)鏡像,包括項(xiàng)目運(yùn)行時(shí)環(huán)境及依賴庫,再寫一個(gè)Dockerfile將項(xiàng)目拷貝到運(yùn)行環(huán)境中,有點(diǎn)略顯復(fù)雜了。

          • 像JAVA這類語言如果代碼編譯是在Dockerfile里操作,還需要把源代碼構(gòu)建進(jìn)去,但實(shí)際運(yùn)行時(shí)只需要構(gòu)建出的包,這種把源代碼放進(jìn)去有一定安全風(fēng)險(xiǎn),并且也增加了鏡像體積。
            為了解決上述問題,Docker 17.05開始支持多階段構(gòu)建(multi-stage builds),可以簡化Dockerfile,減少鏡像大小。

          例如,構(gòu)建JAVA項(xiàng)目鏡像:

          # git clone https://github.com/lizhenliang/tomcat-java-demo
          # cd tomcat-java-demo
          # vi Dockerfile
          FROM maven AS build
          ADD ./pom.xml pom.xml
          ADD ./src src/
          RUN mvn clean package

          FROM lizhenliang/tomcat
          RUN rm -rf /usr/local/tomcat/webapps/ROOT
          COPY --from=build target/*.war /usr/local/tomcat/webapps/ROOT.war
          # docker build -t demo:v1 .
          # docker container run -d -v demo:v1


          首先,第一個(gè)FROM 后邊多了個(gè) AS 關(guān)鍵字,可以給這個(gè)階段起個(gè)名字。
          然后,第二部分FROM用的我們上面構(gòu)建的Tomcat鏡像,COPY關(guān)鍵字增加了—from參數(shù),用于拷貝某個(gè)階段的文件到當(dāng)前階段。這樣一個(gè)Dockerfile就都搞定了。

          5、選擇小的基礎(chǔ)鏡像

          • 選擇原則一:追求鏡像小,可使用Alpine鏡像,Alpine是一個(gè)輕量級的Linux發(fā)行版,鏡像僅有5.6MB,構(gòu)建出的鏡像也很小,但其采用MuslLibc,相比Glibc兼容性市面主流技術(shù)較差,需進(jìn)一步測試。
          • 選擇原則二:追求穩(wěn)定及使用習(xí)慣,使用CentOS鏡像。
          • 選擇原則三:追求穩(wěn)定及軟件包新版,使用Ubuntu/Debian鏡像,軟件包新版發(fā)布上線快。


          小結(jié):鏡像小有很多好處,例如快速部署、快速回滾。減少服務(wù)中斷時(shí)間,同時(shí)鏡像倉庫占用磁盤空間也少了。

          - END -

           推薦閱讀 

          31天拿下K8s含金量最高的CKA+CKS證書! 
          大規(guī)模微服務(wù)利器:eBPF 與 Kubernetes
          運(yùn)維工程師不得不看的經(jīng)驗(yàn)教訓(xùn)和注意事項(xiàng)
          Kubernetes 的這些核心資源原理,你一定要了解
          終于搞懂了服務(wù)器為啥產(chǎn)生大量的TIME_WAIT!
          Kubernetes 網(wǎng)絡(luò)方案之炫酷的 Cilium
          Prometheus+InfluxDB+Grafana 打造高逼格監(jiān)控平臺
          民生銀行 IT運(yùn)維故障管理 可視化案例
          這些 K8S 日常故障處理集錦,運(yùn)維請收藏~
          Linux 這些工具堪稱神器!
          豬八戒網(wǎng) CI/CD 最佳實(shí)踐之路
          從零開始搭建創(chuàng)業(yè)公司DevOps技術(shù)棧
          12年資深運(yùn)維老司機(jī)的成長感悟
          搭建一套完整的企業(yè)級 K8s 集群(kubeadm方式)



          點(diǎn)亮,服務(wù)器三年不宕機(jī)

          瀏覽 62
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美性猛交一区二区三区精品 | 国产视频性高潮 | 九九国产精品 | www,亚洲黄色片 | 免费手机在线看日韩 |