Dockerfile schreiben. Best Practices

Wir veröffentlichen eine neue Übersetzung und hoffen, dass die Empfehlungen des Autors Ihnen helfen, Ihr Docker-Image zu optimieren.


Seit seiner Gründung hat Docker die Art und Weise, wie wir Container verwenden, revolutioniert. Dies liegt hauptsächlich an der Einfachheit, die Docker bietet. Es kann verwendet werden, ohne komplexe Containerthemen zu verstehen.







Wenn Sie Docker noch nicht kennen, können Sie eine Vorlage (Basisimage) auswählen und Ihre Anweisungen (Dockerfile-Befehle) definieren, um Ihren Code im Image zu platzieren und auszuführen.



Die Einfachheit von Docker wird Sie von Anfang an begleiten, und die Fähigkeit, es zu optimieren, hängt von der Erfahrung ab und erfordert normalerweise Zeit.



Ich arbeite seit langer Zeit mit Docker und habe mich daher entschlossen, meine Erfahrungen darüber zu teilen, wie Container besser erstellt werden können, auch wenn Sie Anfänger sind.



1. Definieren Sie zwischengespeicherte Einheiten ➱



Wussten Sie, dass jeder in der Docker-Datei enthaltene RUN- Befehl die Caching-Ebene beeinflusst?



Die Verwendung mehrerer RUN-Befehle zum Installieren von Paketen wirkt sich auf die Leistung und Effizienz des Erstellungsprozesses aus. Wenn Sie alle Pakete und Abhängigkeiten mit einem RUN-Befehl installieren, können Sie eine zwischengespeicherte Einheit anstelle mehrerer erstellen.



RUN apt-get update && apt-get install -y \
    aufs-tools \
    automake \
    build-essential \
    curl \
    dpkg-sig \
    libcap-dev \
    libsqlite3-dev \
    mercurial \
    reprepro \
    ruby1.9.1 \
    ruby1.9.1-dev \
    s3cmd=1.1.*

      
      





2. Reduzieren Sie die Bildgröße



Die Bildgröße spielt eine wichtige Rolle bei der Erstellung einer guten Docker-Datei. Die Verwendung kleinerer Images ermöglicht eine schnellere Bereitstellung und verringert das Angriffspotenzial.



Entfernen unnötiger Abhängigkeiten



Vermeiden Sie die Installation unnötiger Tools, z. B. Debugging-Tools, im Image.



Wenn der Paketmanager die empfohlenen Pakete automatisch zur Installation verwendet, verwenden Sie die Paketmanagerflags und vermeiden Sie die Installation unnötiger Abhängigkeiten.



RUN apt-get update && apt-get -y install --no-install-recommends
      
      





Tipp: Teilen Sie wiederverwendbare Komponenten mithilfe von Bit ( Github ) zwischen Projekten .



Bit erleichtert das Dokumentieren, Freigeben und Wiederverwenden unabhängiger Komponenten zwischen Projekten. Verwenden Sie diese Option, um Code wiederzuverwenden, die Designkonsistenz aufrechtzuerhalten, im Team zusammenzuarbeiten, die Bereitstellung zu beschleunigen und skalierbare Apps zu erstellen.



Bit unterstützt Node, TypeScript, React, Vue, Angular und mehr.





Entdecken Sie die auf Bit.dev veröffentlichten Komponenten



3. Bildunterstützung



Die Auswahl des richtigen Basisimages für Ihre Anwendung ist sehr wichtig.



Verwenden des offiziellen Docker-Images Durch



Verwenden des offiziellen Docker-Images wird die Größe reduziert, indem unnötige Abhängigkeiten reduziert werden, die das Image vergrößern. Die Verwendung des offiziellen Bildes bietet drei Hauptvorteile:



  • ermöglicht es uns, ein Bild zu verwenden, das auf Best Practices basiert,
  • sorgt für die Zuverlässigkeit des Bildes und seine Sicherheit,
  • erhöht das Vertrauen und die Sicherheit.


#    
FROM node:13.12.0-alpine

#   
WORKDIR /app

#  `/app/node_modules/.bin`  $PATH
ENV PATH /app/node_modules/.bin:$PATH
      
      





Verwenden bestimmter Tags



Bei der Auswahl eines Basisbilds wird empfohlen, ein bestimmtes Tag zu verwenden. Verwenden Sie nicht das neueste Tag für das Bild . Das neueste Tag kann im Laufe der Zeit wichtige Änderungen erfahren.



#    
FROM node:13.12.0-alpine
      
      





Verwenden einer minimalen Build-Version Ein



minimaler Build reduziert die Größe des endgültigen Images. Auf diese Weise können Sie Anwendungen schneller und sicherer bereitstellen.







Wie Sie dem obigen Beispiel entnehmen können, ist die Bildgröße bei Verwendung des minimalen Builds kleiner. Die meisten Bilder verwenden die alpine Montage. Alpine ist ein sehr leichtes Bild mit einer Standardgröße von 2 MB.



Durch die Verwendung eines alpinen Bildes können wir die Größe des resultierenden Bildes erheblich reduzieren.



4. Reproduzierbarkeit



Erstellen aus dem Quellcode in einer konsistenten Umgebung



Wenn Sie Docker verwenden, ist es am besten, Ihre Anwendung in einer verwalteten Umgebung zu erstellen, um die Isolation zu gewährleisten.



Wir sollten vermeiden, Anwendungen lokal zu erstellen und zur Registrierung hinzuzufügen.



Andernfalls können die Pakete, die Sie in Ihrer lokalen Umgebung installiert haben, die Konsistenz des Images beeinträchtigen. Wahrscheinlich möchte niemand in dieser Situation sein, da dies einen der Hauptvorteile von Docker gefährdet - die konsistente Ausführung in verschiedenen Umgebungen.



Verwenden mehrstufiger Assemblys zum Entfernen von Abhängigkeiten



Es wird empfohlen, eine mehrstufige Anwendungsbereitstellungsmethode zu verwenden.



Dadurch entfällt die Verwendung von Assemblyabhängigkeiten in einem laufenden Container.



Wir können die Anwendung mit einem eindeutigen Build-Image erstellen, das Entwicklungsabhängigkeiten aufweist, und die kompilierten Binärdateien in ein separates Container-Image verschieben, um sie auszuführen.



# Stage 0, "build-stage", based on Node.js, to build and compile the frontend
FROM node:13.12.0 as build-stage
WORKDIR /app
COPY package*.json /app/
RUN npm install
COPY ./ /app/
RUN npm run build
# Stage 1, based on Nginx, to have only the compiled app, ready for production with Nginx
FROM nginx:1.15
COPY --from=build-stage /app/build/ /usr/share/nginx/html
      
      





In der obigen Docker-Datei gibt es zwei separate Schritte. Stufe 0 wird verwendet, um eine Knotenanwendung aus dem ursprünglichen Knotenabbild zu erstellen, und Stufe 1 wird verwendet, um die zusammengestellten Dateien aus dem Erstellungsabbild auf das Webserverabbild (Nginx) zu kopieren, das letztendlich der Anwendung dient.



Fazit



Das ist alles was ich dir sagen wollte. Wenn Sie Docker noch nicht kennen, empfehle ich, diese Vorgehensweisen beim Erstellen Ihres ersten Images auszuprobieren. Auf diese Weise können Sie das Thema besser verstehen und Docker vom ersten Tag an effektiv einsetzen.



Wenn Sie andere coole Praktiken kennen, teilen Sie diese in den Kommentaren mit. Danke fürs Lesen!



All Articles