Docker-Container erklärt ausführlich, wie man das Image vereinfacht und die Größe reduziert

Docker-Container erklärt ausführlich, wie man das Image vereinfacht und die Größe reduziert

Wir können das Bild unter zwei Gesichtspunkten optimieren:

Reduzieren Sie die Anzahl der Bildebenen, um die Kapazität zu verringern

1. Reduzieren Sie die Anzahl der Bildebenen

1. Zusammenführen von Anweisungen

Jede Anweisung in der Docker-Datei erstellt eine Ebene. Wenn man sich jedoch die Best Practices in der offiziellen Dokumentation ansieht, findet man dort diesen Satz:

In älteren Docker-Versionen war es wichtig, die Anzahl der Ebenen in Ihren Images zu minimieren, um deren Leistung sicherzustellen. Die folgenden Funktionen wurden hinzugefügt, um diese Einschränkung zu reduzieren:

  • Nur die Befehle RUN, COPY und ADD erstellen Ebenen. Andere Befehle erstellen temporäre Zwischenbilder und erhöhen die Größe des Builds nicht.

...

Referenzadresse: Minimieren Sie die Anzahl der Schichten

Dies bedeutet, dass nur die Anweisungen RUN, COPY und ADD Ebenen erstellen, während andere Anweisungen ein Zwischenbild erstellen und die Bildgröße nicht beeinflussen. Die Befehlszusammenführung, von der wir sprechen, basiert hauptsächlich auf diesen drei Anweisungen.

Nehmen wir als Beispiel das folgende Dockerfile

VON debian:stable

ARBEITSVERZEICHNIS /var/www
LABEL version="v1"

Führen Sie apt-get update aus.
Führen Sie apt-get -y --no-install-recommends aus, um curl zu installieren.

Führen Sie apt-get purge -y curl aus.
Führen Sie apt-get autoremove -y aus.
Führen Sie apt-get clean aus.
RUN rm -rf /var/lib/apt/lists/*

Erstellen des Images

Docker-Build -t curl:v1.

Anzeigen des Buildverlaufs durch den Verlauf

# Docker-Verlauf curl:v1

BILD ERSTELLT ERSTELLT VON GRÖSSE KOMMENTAR
29b721c09b67 vor 18 Sekunden /bin/sh -c rm -rf /var/lib/apt/lists/* 0B        
aa28ae151e59 vor 20 Sekunden /bin/sh -c apt-get clean 0B        
4f733781f557 vor 22 Sekunden /bin/sh -c apt-get autoremove -y 989kB     
f66887372121 vor 29 Sekunden /bin/sh -c apt-get purge -y curl 987kB     
d458ee0de463 vor 34 Sekunden /bin/sh -c apt-get -y --no-install-recommend… 4,46 MB    
43fdcf68018c vor 44 Sekunden /bin/sh -c apt-get update 17,6 MB    
65631e8bb010 vor 53 Sekunden /bin/sh -c #(nop) LABEL version="v1" 0B        
7ef7c53b019c vor 53 Sekunden /bin/sh -c #(nop) WORKDIR /var/www 0B        
8bfa93572e55 vor 13 Tagen /bin/sh -c #(nop) CMD ["bash"] 0B        
<fehlt> vor 13 Tagen /bin/sh -c #(nop) ADD file:d78d93eff67b18592… 124MB 

Bildgröße

[root@localhost dockerfiles]# Docker-Bilder
REPOSITORY TAG BILD ID ERSTELLT GRÖSSE
curl v1 29b721c09b67 vor 10 Minuten 148 MB

Wir verschmelzen die RUN-Anweisungen mit der Shell-ähnlichen Operation &&

Führen Sie apt-get update && \ aus.
    apt-get -y --no-install-recommends installiere curl && \
    apt-get purge -y curl && \
    apt-get autoremove -y && \
    apt-get sauber && \
    rm -rf /var/lib/apt/lists/*

Buildverlauf und Bildgröße anzeigen

# Docker-Verlauf curl:v2
BILD ERSTELLT ERSTELLT VON GRÖSSE KOMMENTAR
928e12c2f57e Vor etwa einer Minute /bin/sh -c apt-get update && apt-get -y … 989kB     
5a32372025fb Vor etwa einer Minute /bin/sh -c #(nop) LABEL version="v2" 0B        
7ef7c53b019c vor 30 Minuten /bin/sh -c #(nop) WORKDIR /var/www 0B        
8bfa93572e55 vor 13 Tagen /bin/sh -c #(nop) CMD ["bash"] 0B        
<fehlt> vor 13 Tagen /bin/sh -c #(nop) ADD file:d78d93eff67b18592… 124MB

# Docker-Bilder
REPOSITORY TAG BILD ID ERSTELLT GRÖSSE
curl v2 928e12c2f57e vor 3 Minuten 125 MB

Es ist ersichtlich, dass allein durch die Installation einer einfachen Curl-Anwendung mittels Befehlszusammenführung etwa 20 MB Kapazität freigegeben wurden. Macht Ihr Dockerfile außerdem lesbarer und prägnanter.

2. Mehrstufiger Aufbau

Mehrstufige Builds wurden in Docker 17.05 eingeführt. Mehrstufige Builds können die Build-Komplexität erheblich reduzieren und die Reduzierung der Image-Größe erleichtern. Schauen wir uns das Dockerfile für einen mehrstufigen Build an

#Phase 1
VON golang:1.16
ARBEITSVERZEICHNIS /go/src
KOPIEREN Sie app.go ./
Führen Sie den Befehl go build app.go -o myapp aus.
#Phase 2
VON Grund auf
ARBEITSVERZEICHNIS /server
KOPIEREN --from=0 /go/src/myapp ./
CMD ["./meineApp"]

Erstellen des Images

# docker build --no-cache -t server_app:v2 .

Anzeigen des erstellten Bilds

# Docker-Bilder
REPOSITORY TAG BILD ID ERSTELLT GRÖSSE
server_app v2 20225cb1ea6b vor 12 Sekunden 1,94 MB

Die oben genannten Anwendungsfälle stammen aus dem vorherigen Artikel „Dockerfile Multi-Stage Build Practice“. Weitere Einzelheiten zum mehrstufigen Erstellen von Images finden Sie im Artikel. Ich werde hier nicht näher darauf eingehen.

3. Aktivieren Sie die Squash-Funktion

Durch Aktivieren der Squash-Funktion (experimentelle Funktion) docker build --squash -t curl:v3 kann das erstellte Image in eine Ebene komprimiert werden. Um das überlegene Design der gemeinsamen Nutzung von Container-Image-Ebenen jedoch voll ausnutzen zu können, wird diese Methode nicht empfohlen.

2. Kapazität reduzieren

1. Wählen Sie ein kleines Basisbild

Die Größe der einzelnen Linux-Distributionsimages variiert stark und selbst innerhalb desselben Distributionsimages gibt es Unterschiede. Nehmen wir Debian als Beispiel:

Der Unterschied zwischen der stabilen Version und der Slim-Version beträgt ca. 40 MB

# Docker-Bilder 
debian stable-slim 2aa48a485e3a vor 13 Tagen 80,4 MB
debian stabil 8bfa93572e55 vor 13 Tagen 124 MB

Wir haben das Basis-Image im Dockerfile auf die Slim-Version debian:stable-slim geändert

VON debian:stable-slim

Die erstellte Bildgröße ist kleiner

# Docker-Bilder 
REPOSITORY TAG BILD ID ERSTELLT GRÖSSE
curl v4 1aab5c9bf8b3 vor 17 Sekunden 81,4 MB

Das aktuelle Image basiert auf Debian und enthält viele Binärdateien. Ein Docker-Container sollte einen einzelnen Prozess enthalten und nur das absolute Minimum beinhalten, das zu dessen Ausführung erforderlich ist. Wir brauchen eigentlich kein ganzes Betriebssystem.

Wir können das Debian-Basisimage durch ein auf Alpine basierendes Image ersetzen.

Von alpin

ARBEITSVERZEICHNIS /var/www
LABEL version="v5"
RUN echo -e 'https://mirrors.aliyun.com/alpine/v3.6/main/\nhttps://mirrors.aliyun.com/alpine/v3.6/community/' > /etc/apk/repositories && \
    APK-Update && \
    APK-Upgrade && \
    apk add --no-cache curl

Überprüfen Sie die Bildgröße

# Docker-Bilder
REPOSITORY TAG BILD ID ERSTELLT GRÖSSE
curl v5 7f735bb213be vor 11 Sekunden 10,1 MB

An diesem Punkt hat unser Image 10 MB erreicht. Das von Alpine verwendete Paketverwaltungstool ist apk und einige Paketnamen können unterschiedlich sein. Der größte Unterschied

2. Kontextmanagement

Der COPY-Befehl, den wir oft verwenden

KOPIEREN ./server/dir

COPY kopiert den gesamten Build-Kontext in das Image und generiert eine neue Cache-Ebene. Um zu verhindern, dass unnötige Dateien wie Protokolle, Cache-Dateien und der Git-Verlauf in den Build-Kontext geladen werden, fügen wir besser .dockerignore hinzu, um nicht wesentliche Dateien zu ignorieren. Dies ist auch ein wichtiger Schritt zur Optimierung des Images und kann die Sicherheit des von uns erstellten Images besser gewährleisten.

3. Downloads rechtzeitig aufräumen

Wir haben das folgende Dockerfile

..
ARBEITSVERZEICHNIS /tmp
RUN curl -LO https://docker.com/download.zip && tar -xf download.zip -C /var/www 
Führen Sie den Befehl rm -f download.zip aus.
...

Obwohl wir rm verwendet haben, um das Paket download.zip zu löschen, wurde download.zip aufgrund des Bildschichtproblems in einer neuen Schicht gelöscht und die vorherige Schicht war noch vorhanden.

Wir müssen die Downloads zeitnah in einer Schicht bereinigen

Führen Sie den folgenden Befehl aus: curl -LO https://docker.com/download.zip && tar -xf 

download.zip -C /var/www && rm -f download.zip

Darüber hinaus sollten Sie bei der Installation von Software das Paketverwaltungstool verwenden, um die Abhängigkeiten und den Cache der heruntergeladenen Software rechtzeitig zu löschen. Verwenden Sie beispielsweise das Paketverwaltungstool apt, um in unserer Docker-Datei aufzuräumen.

Hier werden die zugehörigen Vorgänge zum Rationalisieren von Bildern vorgestellt. Weitere relevante rationalisierte Bilder von Docker-Containern finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Docker konfiguriert den Speicherort lokaler Images und Container
  • Docker generiert Bilder über Container und übermittelt DockerCommit im Detail
  • Skywalking: Containerisierte Bereitstellung von Docker-Images zum Erstellen von K8s vom Test bis zur Verfügbarkeit
  • Implementierung der IDEA-Remoteverwaltung von Docker-Images und Containerdiensten
  • Docker-Container-Praxis-Image-Warehouse
  • Docker-Container-Praxis: So funktionieren Images und Container

<<:  SQL-Implementierung von LeetCode (177. N-höchstes Gehalt)

>>:  CSS-Vererbungsmethode

Artikel empfehlen

Analyse des Unterschieds zwischen fettgedrucktem <b> und <strong>

Wir alle Webmaster wissen, dass es bei der Optimi...

Seitenlayout für Bootstrap 3.0-Lernnotizen

Dieses Mal werden wir hauptsächlich etwas über da...

JavaScript zum Hinzufügen und Löschen von Nachrichten im Message Board

Dieser Artikel zeigt ein kleines Beispiel für das...

Lösung für den Docker-Container, der nicht gestoppt und gelöscht werden kann

Suchen Sie die ID des laufenden Containers Docker...

js, um einen simulierten Einkaufszentrumsfall zu erreichen

Freunde, die HTML-, CSS- und JS-Frontend lernen, ...

Detaillierte Analyse des temporären JDBC- und MySQL-Tablespace

Hintergrund Temporäre Tablespaces werden verwende...

js-Speicherleckszenarien, wie man sie im Detail überwacht und analysiert

Inhaltsverzeichnis Vorwort Welche Situationen kön...

So fügen Sie der Seite über Element UI eine Seitennavigationsleiste hinzu

brauchen Fügen Sie eine Paging-Leiste hinzu, die ...

Zusammenfassung der 11 häufigsten Fehler von MySQL-Anfängern

Vorwort Sie erhalten möglicherweise häufig Warn-E...

So installieren Sie Tomcat8 im Docker

1. Installieren Sie Tomcat8 mit Docker 1. Suchen ...