2016-03-26 18 views
3

yapıyorum Docker ile deneme yapıyorum. Kolay bakım ve genişletilebilirlik için buna benzeyen bir görüntü mimarisi oluşturmaya çalışıyorum. Devralınan Docker görüntüleri neden farklı boyutlarda

architecture

aşağıdaki Dockerfiles ile görüntüleri inşa ve farklı konteyner boyutları hakkında merak ediyorum. Neden bu kadar farklılar? Bir 210.9 MB görüntüde

ardından baz/Dockerfile sonuçları (ubuntu: yani sorun yok güvenilir 188 MB sahip).

FROM ubuntu:trusty 
RUN apt-get -qq update && \ 
    DEBIAN_FRONTEND=noninteractive apt-get -qq install \ 
    nano 
ENV TERM xterm 
RUN apt-get -y autoremove && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 

apache/Dockerfile 224,4 MB içinde sonuçlanır.

FROM ubuntu:trusty 
RUN apt-get -qq update && \ 
    DEBIAN_FRONTEND=noninteractive apt-get -qq install \ 
    nano \ 
    apache2 
ENV TERM xterm 
RUN apt-get -y autoremove && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 
COPY apache2-foreground /usr/local/bin/ 
RUN chmod a+x /usr/local/bin/apache2-foreground 
EXPOSE 80 
WORKDIR /var/www/html 
CMD ["apache2-foreground"] 

apache-php/Dockerfile 266.7 MB içinde sonuçlanır.

FROM ubuntu:trusty 
RUN apt-get -qq update && \ 
    DEBIAN_FRONTEND=noninteractive apt-get -qq install \ 
    nano curl \ 
    apache2 \ 
    libapache2-mod-php5 php5-mysql php5-mcrypt php5-gd php5-curl php-pear php-apc && \ 
    curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer 
RUN /usr/sbin/php5enmod mcrypt 
# + last 7 lines from apache/Dockerfile 

Şimdiye kadar sorun yok ama şu ana kadar miras kullanmadık. Bir göz atalım:

Neden 289,4 MB içinde apache-php-on-baz/Dockerfile sonuç nedir? Temelde aynı adımlar ancak iki görüntüde bölünmüş. Biraz fazla havaya uçurmayı beklerdim ama yaklaşık% 10 değil.

FROM base 
# + apache-php/Dockerfile without "install nano" 

Birden devralma kullanarak daha da büyük açıklanmıştır: 314.9 MB içinde apache-php-on-apache-on-baz/Dockerfile sonuçlanır. apache-on-baz/Dockerfile elbette

FROM apache-on-base 
# + apache-php/Dockerfile without "install nano apache2" 

(247 MB ​​ ile sonuçlanan):

FROM base 
# + apache/Dockerfile without "install nano" 

Soru: bu büyük büyüyen görüntüleri engelleyen bir yolu var mı sürdürülebilirliği korurken?

Güncelleme: thaJeztah'ın önerilerini uygulamak Takip ettik :) Tekrar teşekkürler! derinlemesine tüm farklılıklara geçmekte olmadan

REPOSITORY   TAG     IMAGE ID   CREATED    SIZE 
apache-php-on-aob latest    2cf12a3b5872  2 minutes ago  249.9 MB 
apache-on-base  latest    121c8a098ff5  3 minutes ago  203.7 MB 
base    latest    ee95e4f8aaee  3 minutes ago  189.3 MB 
apache-php-on-aob v1     e43df5e61aed  3 days ago   314.9 MB 
apache-on-base  v1     c291f91f1a10  3 days ago   247 MB 
base    v1     b181fc6f181d  3 days ago   210.9 MB 
ubuntu    trusty    97434d46f197  10 days ago   188 MB 
+1

Resimlerinize 'docker geçmişi ' sürümünü çalıştırmayı deneyin ve ekstra katmanın nereden geldiğini belirlemek için resimler arasında hangi katmanların daha büyük/küçük olduğunu görebilirsiniz. – tpbowden

cevap

2

, en olası nedeni dikkate katmanlı dosya sistemini alarak değil olmasıdır.

Docker, Dockerfile dosyanızdaki her talimat için yeni görüntü katmanı oluşturur.Temelde ne olur (çok basitleştirilmiş) 'dir:

FROM ubuntu:trusty 

(Ve Docker yaptığı bir şey gibi) bu ikinci olacak

Docker build -t layer1 . 

:

Yani, bu ilk katman haline gelecek katman:

FROM layer1 
RUN apt-get -qq update && \ 
    DEBIAN_FRONTEND=noninteractive apt-get -qq install \ 
    nano 

(Ve Docker bir şey gibi yapar)

Docker build -t layer2 . 

Ve benzeri.

Son görüntü, "yığılmış" görüntülerin birleşimidir. 'un gerçekleştirmesi gereken önemli olan, "katman1" de eklenmiş bir dosyadır, ancak "layer2" kaldırılmış "layer2" hala resmin bir parçasıdır; Docker, bunu yalnızca layer2'de "kaldırıldı" olarak işaretler ancak , görüntüyü küçültmez.

İlk Dockerfile'ınıza bir göz atalım. Eğer ilk RUN talimat dosyaların çok ekleyerek konum görebileceğiniz gibi, daha sonra ilk RUN itibaren tüm gereksiz dosyaları siler başka RUN ardından sadece bir ENV Var ayarlar boş bir katman ekleyin. Ancak, bu dosyalar önceki katmandan kaldırılmaz, , bu nedenle hala son görüntüde yer kaplar;

FROM ubuntu:trusty 
RUN apt-get -qq update && \ 
    DEBIAN_FRONTEND=noninteractive apt-get -qq install \ 
    nano 
ENV TERM xterm 
RUN apt-get -y autoremove && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 

(docker build -t foobar .) oluşturduktan sonra, bu bana verir: apt-get update ve apt-get clean adımlar hem gerçekleşecek şekilde

REPOSITORY TAG  IMAGE ID  CREATED  SIZE 
foobar  latest 363aa5572838 2 minutes ago 210.9 MB 

, küçük bir değişiklik yapma ve iki RUN talimatları birleştirmek AynıRUN, aynı tabakası;

REPOSITORY TAG  IMAGE ID  CREATED  SIZE 
foobar  latest ac8fb5e4db16 9 minutes ago 189.3 MB 

küçük 20MB var: Bu görüntü üretir

FROM ubuntu:trusty 
RUN apt-get -qq update && \ 
    DEBIAN_FRONTEND=noninteractive apt-get -qq install \ 
    nano && \ 
    apt-get -y autoremove && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 
ENV TERM xterm 

Ve bina!

Bu konuda daha fazla bilgiyi belgenin Dockerfile best practice bölümünde bulabilirsiniz.

+0

Teşekkürler! Bu gerçekten neler olup bittiğini anlamama yardımcı oluyor :) – Alex

İlgili konular