2016-03-26 7 views
3

Ich experimentiere in letzter Zeit mit Docker. Ich versuche, eine Bildarchitektur zu erstellen, die so aussieht, dass sie leicht zu pflegen und zu erweitern ist. Warum unterscheiden sich geerbte Docker-Bilder in der Größe

architecture

Ich baute Bilder mit folgenden Dockerfiles und bin neugierig auf unterschiedliche Behältergrößen. Warum unterscheiden sie sich so sehr?

Nach base/Dockerfile Ergebnisse in einem 210,9 MB Bild (ubuntu: trusty mit 188 MB, so dass in Ordnung ist).

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 Ergebnisse in 224,4 MB.

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 Ergebnisse in 266,7 MB.

Das ist in Ordnung, aber wir haben bis jetzt keine Vererbung verwendet. Lassen Sie uns einen Blick:

Warum Apache-PHP-on-base/Dockerfile Ergebnis in 289,4 MB? Es sind im Grunde die gleichen Schritte, aber in zwei Bilder aufgeteilt. Ich hätte ein wenig Overhead erwartet, aber nicht etwa 10%.

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

Es ist noch größer Mehrfachvererbung: Apache-PHP-on-Apache-on-base/Dockerfile Ergebnisse in 314,9 MB.

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

Wo Apache-on-base/Dockerfile natürlich ist (was zu 247 MB ​​):

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

Frage: Gibt es eine Möglichkeit, Bilder von den Anbau dieser großen verhindern unter Beibehaltung der Wartbarkeit?

Update: Umsetzung ThaJeznahs Vorschläge bekam ich folgende :) Danke nochmal!

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

Versuchen Sie, "Docker History " auf Ihren Bildern zu laufen und Sie können sehen, welche Ebenen größer/kleiner zwischen den Bildern sind, um genau zu bestimmen, woher der zusätzliche Bloat kommt. – tpbowden

Antwort

2

Ohne in der Tiefe durch alle Unterschiede zu gehen, ist der wahrscheinlichste Grund dafür, dass Sie nicht mit dem geschichteten Dateisystem berücksichtigt werden.

Docker erstellt einen neuen ImageLayer für jede Anweisung in Ihrer Dockerfile.Grundsätzlich , was passiert ist (sehr vereinfacht):

Also, das die erste Schicht werden wird:

FROM ubuntu:trusty 

(Und Docker tut so etwas wie)

Docker build -t layer1 . 

Dies ist der zweite sein wird Schicht:

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

(Und Docker macht so etwas)

Docker build -t layer2 . 

Und so weiter.

Das endgültige Bild ist eine Kombination all dieser Bilder "gestapelt". Die wichtige Sache zu realisieren ist, dass eine Datei, die in "Schicht1" hinzugefügt wird, aber entfernt in "Schicht2" ist immer noch Teil des Bildes; Docker markiert es nur als "entfernt" in Schicht2, aber das macht das Bild nicht kleiner.

Werfen wir einen Blick auf Ihre erste Dockerfile. Wie Sie Sie viel von Dateien in der ersten und fügte hinzu, dann RUN Anweisung sind sehen eine leere Ebene hinzufügen, die nur eine ENV var setzt, von einem anderen RUN gefolgt, die alle redundanten Dateien vom ersten RUN entfernt. Diese Dateien werden jedoch nicht von der früheren Ebene entfernt, so dass im endgültigen Bild noch Platz beansprucht wird.

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/* 

Nach dem Bau (docker build -t foobar .), das gibt mir:

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

eine kleine Änderung zu machen, und verbinden die beiden RUN Anweisungen, so dass sowohl die apt-get update und apt-get clean Schritte in der nehmen gleicheRUN, so die gleiche Schicht;

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 

und Gebäude, die das Bild erzeugt:

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

Das 20MB ist kleiner!

Sie können mehr darüber in der Dockerfile best practice Abschnitt der Dokumentation lesen.

+0

Danke! Das hilft mir wirklich zu verstehen, was los ist :) – Alex

Verwandte Themen