Komprimierungs- und Optimierungsvorgänge für Docker-Images

Komprimierungs- und Optimierungsvorgänge für Docker-Images

Der Grund für die heutige Beliebtheit von Docker liegt vor allem in seiner Leichtigkeit, schnellen Bereitstellung und Ressourcennutzung. Die Qualität eines Docker-Images hängt jedoch hauptsächlich von der Qualität des Docker-Files ab. Dasselbe Funktionsimage, aber die Image-Größen der verschiedenen Dockerfile-Builds sind unterschiedlich. Dies liegt daran, dass Docker schreibgeschützte Schichten schichtweise ansammelt und jede Schicht jede Anweisung im Dockerfile darstellt. Daher hängt die Größe des Docker-Image vollständig von der Größe der Zwischenschicht ab, die durch jede Anweisung im Dockerfile generiert wird.

Lassen Sie uns die Erstellung eines Dockerimages anhand eines kleinen Beispiels im Detail erklären.

Wir haben ein Dockerfile:

VON Ubuntu:14.04
Füge run.sh hinzu /
VOLUME /Daten
CMD [“./run.sh”]

Dieses einfache Dockerfile führt im Wesentlichen folgende Aufgaben aus: Basierend auf dem Ubuntu:14.04-System wird run.sh in das Stammverzeichnis eingefügt, der Volume-Einhängepunkt festgelegt und anschließend das Skript run.sh ausgeführt, wenn das Image gestartet wird.

Die folgende Abbildung zeigt das resultierende Docker-Image:

Aus der Abbildung können wir offensichtlich erkennen, dass die vier Anweisungen jeweils vier Schichten bilden. Angenommen, Ubuntu:14.04 ist 150 MB groß und run.sh ist 1 MB groß, dann beträgt die Größe der Schicht FROM Ubuntu:14.04 150 MB, die Größe der Schicht ADD run.sh / beträgt 1 MB und die Größe der Schicht VOLUME /data und CMD ["./run.sh"] ist 0, da keine Dateien oder andere Daten hinzugefügt werden und keine Daten im System generiert werden.

Die Größe des gesamten Bildes beträgt also 151 MB. Nachdem wir das Prinzip der Docker-Image-Generierung kennen, sprechen wir über die Optimierung und Komprimierung von Docker-Images.

Eine Sache, die erklärt werden muss, ist, dass die Anzahl der Ebenen in einigen Fällen nicht die Größe des Bildes bestimmt. Nur wenn die Docker-Datei angezeigt wird:

Führen Sie „yum install“ aus ***

Führen Sie „yum uninstall“ aus ***

Das Image kann komprimiert und optimiert werden, wenn RUN yum uninstall *** verwendet wird. Da die beiden obigen Sätze ein Tool installieren und es dann deinstallieren. Unter normalen Umständen haben wir das Gefühl, dass die Größe der Installation und Deinstallation 0 ist, aber dies ist im Docker-Image nicht der Fall. RUN yum uninstall *** kann nur die vorherige Ebene unsichtbar machen, aber die Größe der vorherigen Ebene ändert sich nicht. Wenn wir also den Effekt von 0 erzielen möchten, müssen wir diese beiden Ebenen zu einer Ebene komprimieren, was wie folgt geschrieben wird:

Führen Sie den Befehl yum install *** && \ aus.

yumuninstall ***

Dadurch wird der Effekt einer Bildkomprimierung erzielt.

Daher gibt es beim Komprimieren von Bildern zwei Hauptpunkte:

1. Wählen Sie ein kleineres Originalbild, d. h. das Bild nach FROM sollte so klein wie möglich sein.

2. Fügen Sie die Ebenen in der Docker-Datei entsprechend der tatsächlichen Situation zusammen. Die konkrete Situation ist wie oben beschrieben. Es ist zu beachten, dass der Effekt nicht durch zufälliges Zusammenführen von Ebenen erreicht wird.

Zusatzwissen: So bauen Sie Anaconda+Jupyter in ein Docker-Image ein

Aufgrund geschäftlicher Anforderungen müssen wir in letzter Zeit ein Jupyter-Image erstellen, um Dienste bereitzustellen. Da Docker leichtgewichtig ist, kann es problemlos migriert werden.

Hier ist eine kurze Einführung in das, was ich getan habe und die Fallstricke, auf die ich gestoßen bin:

Installieren wir zuerst Anaconda. Es gibt Python2- und Python3-Versionen. Die Versionen sind unterschiedlich, aber der Erstellungsprozess ist derselbe. Es gibt zwei Möglichkeiten. Die erste besteht darin, dass Sie das Image über Dockerfile erstellen können, aber es gibt keine Interaktion beim Ausführen des Skripts Anaconda2-5.0.1-Linux-x86_64.sh, daher habe ich die Docker-Commit-Methode verwendet, um es auszuführen. Es stellt sich jedoch heraus, dass Sie es auch über Dockerfile erstellen können. Sie müssen nur zuerst das Skript Anaconda2-5.0.1-Linux-x86_64.sh auf Ihrem lokalen Computer ausführen und den generierten Ordner, der Anaconda2 ist, an der entsprechenden Stelle im Image hinzufügen und die Umgebungsvariablen ändern, um PATH hinzuzufügen.

Nehmen wir Python2 als Beispiel:

1. Laden Sie das Skript Anaconda2-5.0.1-Linux-x86_64.sh von der offiziellen Anaconda-Website herunter und führen Sie es aus. Achten Sie beim Herunterladen darauf, ob Ihr System 32-Bit oder 64-Bit ist.

2. scp das Skript auf das Basisimage und installieren Sie den Dekomprimierungsbefehl bzip2

yum installiere bzip2

3. Führen Sie das Skript aus (geben Sie durchgehend „yes“ ein)

sh Anaconda2-5.0.1-Linux-x86_64.sh

4. Aktualisieren Sie Anaconda

Conda-Aktualisierung Anaconda

5. Installieren Sie Jupyter

conda installiert jupyter

6. Erstellen Sie ein Login-Passwort

root@localhost ~]# ipython
 
Python 3.5.2 (Standard, 4. August 2017, 02:13:48)
Geben Sie „Copyright“, „Credits“ oder „Lizenz“ ein, um weitere Informationen zu erhalten
IPython 6.1.0 – Ein verbessertes interaktives Python. Geben Sie „?“ ein, um Hilfe zu erhalten.
 
In [1]: from notebook.auth import passwd
In [2]: passwd()
Passwort eingeben:
Kennwort bestätigen:
Aus[2]: 'sha1:5311cd8b9da9:70dd3321fccb5b5d77e66080a5d3d943ab9752b4'

7. Konfigurationsdateien generieren

Jupyter Notebook – Konfiguration generieren – Root zulassen

Hinweis: Bei diesem Schritt können Kodierungsfehler auftreten: UnicodeEncodeError:'ascii'-Codec kann Zeichen an Position ... nicht kodieren.

Die Lösung lautet: Ändern Sie im Ordner anaconda2 unter lib>python2.7>site.py Folgendes:

wenn 0:  
 # Aktivieren, um gebietsschemaabhängige Standard-Zeichenfolgenkodierungen zu unterstützen.  
 Gebietsschema importieren  
 loc = locale.getdefaultlocale()  
 wenn loc[1]:   
 Kodierung = loc[1]
#Ändern Sie die 0 nach „if“ im obigen Codesegment in 1, speichern Sie und starten Sie Anaconda neu.

8. Ändern Sie die Konfigurationsdatei:

vi ~/.jupyter/jupyter_notebook_config.py

Fügen Sie den folgenden Inhalt hinzu:

c.NotebookApp.ip='*'
c.NotebookApp.password = u'sha1:5311cd8b9da9:70dd3321fccb5b5d77e66080a5d3d943ab9752b4' #Beachten Sie, dass der Schlüssel hier der gerade generierte ist c.NotebookApp.open_browser = False
c.NotebookApp.port = 8888 #Geben Sie einen beliebigen Port an. Sie können auch den Standardport 8888 verwenden.

9. Speichern Sie das Bild

Docker-Commit-Container-ID, Image-Name

10. Starten Sie Bilder, um Dienste bereitzustellen:

docker run --privileged -d -p 8889:8888 -v /sys/fs/cgroup:/sys/fs/cgroup --name jupyter jupyter2:v2 /usr/sbin/init

Hinweis: In CentOS7 gibt es eine große Falle. Wenn Sie die Firewall ausschalten, kann systemctl nicht verwendet werden und es wird eine Fehlermeldung angezeigt: D-Bus-Verbindung konnte nicht hergestellt werden: Vorgang nicht zulässig

Sie müssen also init zum Starten verwenden und können im Dockerfile CMD verwenden, um die Laufzeit zu starten.

11. Geben Sie das Docker-Image ein

docker exec -it jupyter /bin/bash

12. Schalten Sie die Firewall aus

systemctl stoppe Firewalls.Service

13. Starten Sie Jupyter

jupyter notebook --notebook-dir=/root/ --allow-root

14. Geben Sie die Server-IP + die zugeordnete Portnummer in den Browser ein, um darauf zuzugreifen. Fertig~

Die oben beschriebene Docker-Bildkomprimierungs- und -optimierungsoperation ist der gesamte Inhalt, den der Editor mit Ihnen teilt. Ich hoffe, er kann Ihnen als Referenz dienen. Ich hoffe auch, dass Sie 123WORDPRESS.COM unterstützen.

Das könnte Sie auch interessieren:
  • Docker-Image-Analysetool - Analyse des Tauchprinzips
  • So erstellen Sie ein Apache-Image mit Dockerfile
  • Docker-Image-Zugriff auf den lokalen Elasticsearch-Port-Vorgang
  • Multiservice-Image-Packaging-Vorgang von Dockerfile unter Aufsicht
  • So erstellen Sie Ihr eigenes Docker-Image und laden es auf Dockerhub hoch

<<:  Realisierung baumförmiger Sekundärtabellen auf Basis von Angular

>>:  Wichtige Punkte zum Schreiben von Inhalten für META-Tags in HTML-Webseiten

Artikel empfehlen

Wo werden MySQL-Daten gespeichert?

Speicherort der MySQL-Datenbank: 1. Wenn MySQL di...

Tutorial zu HTML-Tabellen-Tags (20): Zeilenhintergrund-Farbattribut BGCOLOR

Mit dem BGCOLOR-Attribut kann die Hintergrundfarb...

Zusammenfassung des MySQL Undo Log und Redo Log

Inhaltsverzeichnis Undo-Protokoll Erstellung und ...

Detaillierte Erklärung der Desktop-Anwendung mit Vue3 und Electron

Inhaltsverzeichnis Vue CLI erstellt ein Vue-Proje...

JS realisiert den Effekt des Bildwasserfallflusses

In diesem Artikel wird der spezifische JS-Code zu...

Methode zum Erkennen, ob IP und Port verbindbar sind

Windows cmd Telnet Format: Telnet-IP-Port Fall: T...

So konvertieren Sie zusätzlichen Text in HTML in Auslassungspunkte

Wenn Sie zusätzlichen Text in HTML als Auslassung...

Zusammenfassung des Verständnisses des virtuellen DOM in Vue

Es handelt sich im Wesentlichen um ein allgemeine...

So schreiben Sie eine Node.JS-Version eines Spiels

Inhaltsverzeichnis Überblick Build-Prozess Verwan...

HTML-Meta erklärt

Einführung Der Meta-Tag ist ein Hilfstag im HEAD-...