|
|
| (6 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) |
| Zeile 1: |
Zeile 1: |
| '''Docker/Image/Erstellung''' - Image-building best practices
| | #WEITERLEITUNG [[Docker/Image]] |
| | |
| | |
| == Docker-Images erstellen ==
| |
| | |
| | |
| * Docker-Hub bietet umfangreiche Möglichkeiten zum '''Erstellen eigener Images''' und zum Austausch dieser Images.
| |
| | |
| ; Erstellen einer Dockerfile
| |
| | |
| * Jedes [[Docker#Docker_Images|Docker-Image]] basiert auf einer '''Dockerfile'''
| |
| * Eine Dockerfile ist eine Textdatei, die Anweisungen zum Erstellen eines Images enthält
| |
| | |
| 1. Verwenden Sie folgenden Kommandozeilenbefehl, um ein Verzeichnis mit dem Namen ''mydockerbuild'' zu erstellen:
| |
| | |
| <syntaxhighlight lang="bash" highlight="1" line copy>
| |
| mkdir mydockerbuild
| |
| </syntaxhighlight>
| |
| 2. In das neue Verzeichnis navigieren
| |
| <syntaxhighlight lang="bash" highlight="1" line copy>
| |
| cd mydockerbuild
| |
| </syntaxhighlight>
| |
| 3. Neue Textdatei erstellen
| |
| <syntaxhighlight lang="bash" highlight="1" line copy>
| |
| nano Dockerfile
| |
| </syntaxhighlight>
| |
| | |
| === Dockerfile schreiben ===
| |
| Die neu erstellte Textdatei dient als Bauplan für Ihr selbst entwickeltes Image
| |
| | |
| * Anstatt das Image von Grund auf neu zu programmieren, wird in diesem Docker-Handbuch das Demo-Image ''docker/whalesay'' als Vorlage verwendet.
| |
| * Um das Image in die Dockerfile aufzunehmen, muss darin der Befehl ''FROM'' angegeben werden.
| |
| * Um die neueste Version des Images zu erhalten, wird das Tag '':latest'' verwendet.
| |
| | |
| <syntaxhighlight lang="Dockerfile" highlight="1" line copy>
| |
| FROM docker/whalesay:latest
| |
| </syntaxhighlight>
| |
| | |
| Bisher arbeitet ''docker/whalesay'' so, dass Sie dem Wal die Worte in den Mund legen müssen
| |
| * Das Terminal zeigt genau den Text an, der zuvor in Kombination mit dem Befehl zum Starten des Containers eingegeben wurde.
| |
| * Als Nächstes wird die automatische Generierung neuer Text-Ausgabedaten mit Hilfe des Programms ''fortunes'' gezeigt.
| |
| * Die Grundfunktion von Fortunes besteht darin, Glückskeks-Sprüche und humorvolle Aphorismen zu generieren
| |
| * Um den lokalen Paketindex zu aktualisieren und fortunes zu installieren, verwenden Sie den folgenden Befehl:
| |
| | |
| <syntaxhighlight lang="Dockerfile" highlight="1" line copy>
| |
| RUN apt-get -y update && apt-get install -y fortunes
| |
| </syntaxhighlight>
| |
| | |
| Anschließend definieren Sie ein ''CMD''-Statement
| |
| * Das CMD-Statement wird beim Start des Containers ausgeführt, sofern es beim Aufruf (docker run image CMD) nicht überschrieben wurde
| |
| * Verwenden Sie folgenden Befehl, um das Programm ''fortunes'' mit der Option -a („Wähle aus allen Datenbanken“) auszuführen und die Ausgabe über das Programm ''cowsay'' im Terminal anzeigen zu lassen:
| |
| | |
| <syntaxhighlight lang="Dockerfile" highlight="1" line copy>
| |
| CMD /usr/games/fortune -a | cowsay
| |
| </syntaxhighlight>
| |
| | |
| Ihr Dockerfile sollte nun folgendermaßen aussehen:
| |
| <syntaxhighlight lang="Dockerfile" highlight="1" line copy>
| |
| FROM docker/whalesay:latest
| |
| RUN apt-get -y update && apt-get install -y fortunes
| |
| CMD /usr/games/fortune -a | cowsay
| |
| </syntaxhighlight>
| |
| | |
| ;Hinweis
| |
| :'''Befehle''' innerhalb eines Dockerfiles sind '''immer einzeilig''' und beginnen stets mit einem Schlüsselwort
| |
| :* Die zugrundeliegende Syntax ist case-insensitive – es ist also egal, ob Sie groß- oder kleinschreiben
| |
| :* Es hat sich jedoch eine konsequente Großschreibung von Schlüsselwörtern etabliert
| |
| ;
| |
| * '''Textdatei speichern:''' Speichern Sie Ihre Eingabe
| |
| :* Sollten Sie den Editor Nano verwenden, nutzen Sie dazu die Tastenkombination [STRG] + [O] und bestätigen Sie mit [ENTER]
| |
| :* Nano gibt Ihnen die Meldung aus, dass drei Zeilen in die ausgewählte Datei geschrieben wurden
| |
| :* Beenden Sie den Texteditor mit der Tastenkombination [STRG] + [X]
| |
| * '''Image aus Dockerfile erstellen:''' Um ein Image aus einem Dockerfile zu erstellen, navigieren Sie zunächst in das Verzeichnis, in dem Sie die Textdatei abgelegt haben
| |
| :* Die Image-Erstellung starten Sie mit dem Kommandozeilenbefehl docker build
| |
| :* Möchten Sie das Image individuell benennen oder mit einem Tag versehen, verwenden Sie die Option -t sowie nachfolgend die gewünschte Kombination aus Bezeichnung und Tag
| |
| :* Es gilt das Standardformat name:tag
| |
| | |
| Im aktuellen Beispiel soll ein Image mit dem Namen ''docker-whale'' erzeugt werden:
| |
| <syntaxhighlight lang="docker" highlight="1" copy line>
| |
| docker build -t docker-whale .
| |
| </syntaxhighlight>
| |
| | |
| Der abschließende '''Punkt''' gibt an, dass sich das zugrundeliegende Dockerfile im ausgewählten Verzeichnis befindet
| |
| * Alternativ haben Sie die Möglichkeit, einen Dateipfad oder eine URL zu den Quelldateien anzugeben
| |
| | |
| Der ''build''-Prozess startet, sobald Sie den Befehl mit [ENTER] bestätigt haben
| |
| * Zunächst überprüft der Docker-Daemon, ob ihm alle Dateien vorliegen, die für die Erstellung des Images benötigt werden
| |
| * In der Docker-Terminologie werden diese unter dem Begriff „Context“ zusammengefasst
| |
| * Im Anschluss wird das Image ''docker/whalesay'' mit dem Tag '':latest'' lokalisiert
| |
| * Liegt der für die Image-Erstellung benötigte Context vollständig vor, startet der Docker-Daemon die via ''FROM'' eingebundene Image-Vorlage in einem temporären Container und geht zum nächsten Befehl im ''Dockerfile'' über
| |
| * Im aktuellen Beispiel handelt es sich dabei um den ''RUN''-Befehl, der die Installation des ''fortunes''-Programms zur Folge hat
| |
| | |
| Am Ende jedes Schritts im Rahmen der Image-Erstellung gibt Docker Ihnen eine '''ID für den entsprechenden Layer''' (Schicht) aus, der in diesem Schritt erstellt wurde
| |
| * Dabei gilt: Jede Zeile im zugrundeliegenden Dockerfile entspricht einem Layer des darauf aufbauenden Images
| |
| | |
| Wurde der ''RUN''-Befehl beendet, stoppt der Docker-Daemon den dafür erstellten Container, entfernt diesen und startet einen neuen temporären Container für das Layer des CMD-Statements
| |
| * Am Ende des Erstellungsprozesses wird auch dieser temporäre Container beendet und entfernt
| |
| * Docker gibt Ihnen die ID des neuen Images aus:
| |
| | |
| <syntaxhighlight lang="docker">
| |
| Successfully built a8f2048c9ab8
| |
| </syntaxhighlight>
| |
| | |
| Ihr neu erstelltes Image finden Sie unter dem Namen ''docker-whale'' in der Übersicht ihrer lokal gespeicherten Images
| |
| <syntaxhighlight lang="bash" highlight="1" line copy>
| |
| sudo docker images
| |
| </syntaxhighlight>
| |
| | |
| Um einen Container aus Ihrem neu erstellten Image zu starten, verwenden Sie den Kommandozeilenbefehl sudo docker run in Kombination mit dem Namen des Images:
| |
| | |
| <syntaxhighlight lang="bash" highlight="1" line copy>
| |
| sudo docker run docker-whale
| |
| </syntaxhighlight>
| |
| | |
| Wurde das Image fehlerfrei aus dem Dockerfile erstellt, sollte Ihr Wal Sie nun mit mehr oder weniger weisen Sprüchen begeistern
| |
| * Beachten Sie: Jedes Mal, wenn Sie den Container neu starten, wird ein anderer Spruch generiert
| |
| | |
| == Image layering ==
| |
| Using the docker image history command, you can see the command that was used to create each layer within an image
| |
| | |
| === Docker image history ===
| |
| Use the docker image history command to see the layers in the getting-started image you created
| |
| | |
| <syntaxhighlight lang="bash" highlight="1" line copy>
| |
| docker image history getting-started
| |
| </syntaxhighlight>
| |
| | |
| IMAGE CREATED CREATED BY SIZE COMMENT
| |
| a78a40cbf866 18 seconds ago /bin/sh -c #(nop) CMD ["node" "src/index.j… 0B
| |
| f1d1808565d6 19 seconds ago /bin/sh -c yarn install --production 85.4MB
| |
| a2c054d14948 36 seconds ago /bin/sh -c #(nop) COPY dir:5dc710ad87c789593… 198kB
| |
| 9577ae713121 37 seconds ago /bin/sh -c #(nop) WORKDIR /app 0B
| |
| b95baba1cfdb 13 days ago /bin/sh -c #(nop) CMD ["node"] 0B
| |
| <missing> 13 days ago /bin/sh -c #(nop) ENTRYPOINT ["docker-entry… 0B
| |
| <missing> 13 days ago /bin/sh -c #(nop) COPY file:238737301d473041… 116B
| |
| <missing> 13 days ago /bin/sh -c apk add --no-cache --virtual .bui… 5.35MB
| |
| <missing> 13 days ago /bin/sh -c #(nop) ENV YARN_VERSION=1.21.1 0B
| |
| <missing> 13 days ago /bin/sh -c addgroup -g 1000 node && addu… 74.3MB
| |
| <missing> 13 days ago /bin/sh -c #(nop) ENV NODE_VERSION=12.14.1 0B
| |
| <missing> 13 days ago /bin/sh -c #(nop) CMD ["/bin/sh"] 0B
| |
| <missing> 13 days ago /bin/sh -c #(nop) ADD file:e69d441d729412d24… 5.59MB
| |
| | |
| Each of the lines represents a layer in the image
| |
| * The display here shows the base at the bottom with the newest layer at the top
| |
| * Using this, you can also quickly see the size of each layer, helping diagnose large images
| |
| | |
| You'll notice that several of the lines are truncated
| |
| * If you add the --no-trunc flag, you'll get the full output
| |
| | |
| <syntaxhighlight lang="bash" highlight="1" line copy>
| |
| docker image history --no-trunc getting-started
| |
| </syntaxhighlight>
| |
| | |
| == Layer caching ==
| |
| Now that you've seen the layering in action, there's an important lesson to learn to help decrease build times for your container images
| |
| * Once a layer changes, all downstream layers have to be recreated as well
| |
| | |
| Look at the following Dockerfile you created for the getting started app
| |
| | |
| <syntaxhighlight lang="Dockerfile" line copy>
| |
| syntax=docker/dockerfile:1
| |
| FROM node:lts-alpine
| |
| WORKDIR /app
| |
| COPY .
| |
| RUN yarn install --production
| |
| CMD ["node", "src/index.js"]
| |
| </syntaxhighlight>
| |
| | |
| Going back to the image history output, you see that each command in the Dockerfile becomes a new layer in the image
| |
| * You might remember that when you made a change to the image, the yarn dependencies had to be reinstalled
| |
| * It doesn't make much sense to ship around the same dependencies every time you build
| |
| | |
| ; Caching von Abhängigkeiten
| |
| | |
| To fix it, you need to restructure your Dockerfile to help support the caching of the dependencies
| |
| * For Node-based applications, those dependencies are defined in the package.json file
| |
| * You can copy only that file in first, install the dependencies, and then copy in everything else
| |
| * Then, you only recreate the yarn dependencies if there was a change to the package.json
| |
| | |
| 1. Update the Dockerfile to copy in the package.json first, install dependencies, and then copy everything else in
| |
| | |
| <syntaxhighlight lang="Dockerfile" line copy>
| |
| syntax=docker/dockerfile:1
| |
| FROM node:lts-alpine
| |
| WORKDIR /app
| |
| COPY package.json yarn.lock ./
| |
| RUN yarn install --production
| |
| COPY .
| |
| CMD ["node", "src/index.js"]
| |
| </syntaxhighlight>
| |
| | |
| 2. Build a new image using docker build
| |
| | |
| <syntaxhighlight lang="bash" highlight="1" line copy>
| |
| docker build -t getting-started .
| |
| </syntaxhighlight>
| |
| | |
| You should see output like the following
| |
| <syntaxhighlight lang="console">
| |
| [+] Building 16.1s (10/10) FINISHED
| |
| => [internal] load build definition from Dockerfile
| |
| => => transferring dockerfile: 175B
| |
| => [internal] load .dockerignore
| |
| => => transferring context: 2B
| |
| => [internal] load metadata for docker.io/library/node:lts-alpine
| |
| => [internal] load build context
| |
| => => transferring context: 53.37MB
| |
| => [1/5] FROM docker.io/library/node:lts-alpine
| |
| => CACHED [2/5] WORKDIR /app
| |
| => [3/5] COPY package.json yarn.lock ./
| |
| => [4/5] RUN yarn install --production
| |
| => [5/5] COPY .
| |
| => exporting to image
| |
| => => exporting layers
| |
| => => writing image sha256:d6f819013566c54c50124ed94d5e66c452325327217f4f04399b45f94e37d25
| |
| => => naming to docker.io/library/getting-started
| |
| </syntaxhighlight>
| |
| * Now, make a change to the src/static/index.html file
| |
| * For example, change the <title> to "The Awesome Todo App"
| |
| * Build the Docker image now using ''docker build -t getting-started'' again
| |
| * This time, your output should look a little different
| |
| | |
| <syntaxhighlight lang="console">
| |
| [+] Building 1.2s (10/10) FINISHED
| |
| => [internal] load build definition from Dockerfile
| |
| => => transferring dockerfile: 37B
| |
| => [internal] load .dockerignore
| |
| => => transferring context: 2B
| |
| => [internal] load metadata for docker.io/library/node:lts-alpine
| |
| => [internal] load build context
| |
| => => transferring context: 450.43kB
| |
| => [1/5] FROM docker.io/library/node:lts-alpine
| |
| => CACHED [2/5] WORKDIR /app
| |
| => CACHED [3/5] COPY package.json yarn.lock ./
| |
| => CACHED [4/5] RUN yarn install --production
| |
| => [5/5] COPY .
| |
| => exporting to image
| |
| => => exporting layers
| |
| => => writing image sha256:91790c87bcb096a83c2bd4eb512bc8b134c757cda0bdee4038187f98148e2eda
| |
| => => naming to docker.io/library/getting-started
| |
| </syntaxhighlight>
| |
| | |
| First off, you should notice that the build was much faster
| |
| * And, you'll see that several steps are using previously cached layers
| |
| * Pushing and pulling this image and updates to it will be much faster as well
| |
| | |
| == Multi-stage builds ==
| |
| Multi-stage builds are an incredibly powerful tool to help use multiple stages to create an image
| |
| * There are several advantages for them
| |
| :* Separate build-time dependencies from runtime dependencies
| |
| :* Reduce overall image size by shipping only what your app needs to run
| |
| | |
| === Maven/Tomcat example ===
| |
| When building Java-based applications, you need a JDK to compile the source code to Java bytecode
| |
| * However, that JDK isn't needed in production
| |
| * Also, you might be using tools like Maven or Gradle to help build the app
| |
| * Those also aren't needed in your final image
| |
| * Multi-stage builds help
| |
| | |
| <syntaxhighlight lang="Dockerfile" line copy>
| |
| # syntax=docker/dockerfile:1 | |
| FROM maven AS build
| |
| WORKDIR /app
| |
| COPY .
| |
| RUN mvn package
| |
| FROM tomcat
| |
| COPY --from=build /app/target/file.war /usr/local/tomcat/webapps
| |
| </syntaxhighlight>
| |
| | |
| In this example, you use one stage (called build) to perform the actual Java build using Maven
| |
| * In the second stage (starting at FROM tomcat), you copy in files from the build stage
| |
| * The final image is only the last stage being created, which can be overridden using the --target flag
| |
| | |
| === React example ===
| |
| When building React applications, you need a Node environment to compile the JS code (typically JSX), SASS stylesheets, and more into static HTML, JS, and CSS
| |
| * If you aren't doing server-side rendering, you don't even need a Node environment for your production build
| |
| | |
| You can ship the static resources in a static nginx container
| |
| | |
| <syntaxhighlight lang="Dockerfile" line copy>
| |
| # syntax=docker/dockerfile:1
| |
| FROM node:lts AS build
| |
| WORKDIR /app
| |
| COPY package* yarn.lock ./
| |
| RUN yarn install
| |
| COPY public ./public
| |
| COPY src ./src
| |
| RUN yarn run build
| |
| FROM nginx:alpine
| |
| COPY --from=build /app/build /usr/share/nginx/html
| |
| </syntaxhighlight>
| |
| | |
| In the previous Dockerfile example, it uses the node:lts image to perform the build (maximizing layer caching) and then copies the output into an nginx container
| |
| | |
| = Tutorial =
| |
| | |
| | |
| == Docker-Images herunterladen ==
| |
| ; Hochladen von Docker-Images auf Docker-Hub
| |
| | |
| Das ''whalesay''-Image finden Sie, indem Sie die Startseite des Docker-Hubs aufrufen und den Begriff ''whalesay'' in die Suchleiste rechts neben dem Docker-Logo eingeben
| |
| | |
| Klicken Sie in den Suchergebnissen auf die Ressource mit der Bezeichnung ''docker/whalesay'', um das öffentliche Repository für dieses Image aufzurufen
| |
| | |
| Docker-Repositorys sind immer nach demselben Muster aufgebaut: Im Kopfbereich der Seite finden Nutzer die Bezeichnung des Images, die Kategorie des Repositorys sowie den Zeitpunkt des letzten Uploads (''last pushed'')
| |
| | |
| Darüber hinaus bietet jedes Docker-Repository folgende Info-Boxen:
| |
| | |
| {| class="wikitable options big"
| |
| |-
| |
| ! Feld !! Beschreibung
| |
| |-
| |
| || Description || ausführliche Beschreibung, in der Regel inklusive Gebrauchsanweisung
| |
| |-
| |
| | Docker Pull Command || Kommandozeilenbefehl, um das Image aus dem Repository herunterzuladen (pull)
| |
| |-
| |
| | Owner || Information über den Ersteller des Repositorys
| |
| |-
| |
| | Comments || Kommentarbereich am Seitenende
| |
| |}
| |
| | |
| Den Informationsboxen des Repositorys lässt sich entnehmen, dass es sich bei ''whalesay'' um eine Modifikation des quelloffenen Perl-Skripts '''''cowsay''''' handelt
| |
| * Das von Tony Monroe im Jahr 1999 entwickelte Programm generiert in seiner Ursprungsform eine ASCII-Grafik in Form einer Kuh, die zusammen mit einer Nachricht im Terminal des Benutzers erscheint
| |
| | |
| Um ''docker/whalesay'' herunterzuladen, benutzen Sie den Befehl docker pull nach folgendem Grundschema:
| |
| | |
| <syntaxhighlight lang="bash" highlight="1" line copy>
| |
| docker pull [OPTIONS] NAME [:TAG|@DIGEST]
| |
| </syntaxhighlight>
| |
| | |
| Der Befehl docker pull weist den Daemon an, ein Image aus dem Repository zu laden
| |
| * Um welches Image es sich handelt, bestimmen Sie durch die Angabe der Image-Bezeichnung (''NAME'')
| |
| * Darüber hinaus können Sie Docker anweisen, wie der gewünschte Befehl ausgeführt werden soll (''OPTIONS'')
| |
| * Ebenfalls optional ist die Angabe von '''Tags''' ('':TAG'') und eindeutigen '''Identifikationsnummern''' (''@DIGEST''), die es ermöglichen, eine bestimmte Version eines Images herunterzuladen
| |
| | |
| Eine lokale Kopie des ''docker/whalesay''-Images erhalten Sie somit durch folgenden Befehl:
| |
| | |
| <syntaxhighlight lang="bash" highlight="1" line copy>
| |
| docker pull docker/whalesay
| |
| </syntaxhighlight>
| |
| | |
| In der Regel können Sie diesen Schritt jedoch überspringen
| |
| * Möchten Sie einen Container starten, lädt der Docker-Daemon Images, die er auf dem lokalen System nicht finden kann, automatisch aus dem Repository herunter
| |
| | |
| == Docker-Images als Container starten ==
| |
| Um ein Docker-Image zu starten, nutzen Sie den Befehl docker run nach folgendem Grundschema:
| |
| | |
| <syntaxhighlight lang="bash" highlight="1" line copy>
| |
| docker run [OPTIONS] IMAGE [:TAG|@DIGEST] [CMD] [ARG…]
| |
| </syntaxhighlight>
| |
| | |
| Einziger obligatorischer Bestandteil des Befehls docker run ist die Bezeichnung des gewünschten Docker-Images
| |
| * Auch wenn Sie Container starten, haben Sie die Möglichkeit, fakultative Optionen, TAGs und DIGESTs zu definieren
| |
| * Darüber hinaus lässt sich der Befehl docker run mit weiteren Befehlen kombinieren, die ausgeführt werden, sobald der Container startet
| |
| * In diesem Fall wird der vom Image-Ersteller definierte '''CMD''' (COMMAND, ein Befehl, der beim Starten des Containers automatisch ausgeführt wird) überschrieben
| |
| * Weitere optionale Konfigurationen lassen sich durch '''zusätzliche Argumente''' (''ARG…'') definieren
| |
| * Diese ermöglichen es beispielweise, Benutzer hinzuzufügen oder Umgebungsvariablen (''Environment-Variables'') zu übergeben
| |
| | |
| Nutzen Sie den Kommandozeilenbefehl
| |
| <syntaxhighlight lang="bash" highlight="1" line copy>
| |
| docker run docker/whalesay cowsay boo
| |
| </syntaxhighlight>
| |
| um das als Image vorliegende Perl-Skript herunterzuladen und in einem Container auszuführen
| |
| * Sie werden sehen, dass sich ''whalesay'' in einem wesentlichen Punkt vom Ursprungsskript unterscheidet
| |
| | |
| *Wird *docker/whalesay* mit dem Standardbefehl ausgeführt, beschränkt sich der Docker-Wal auf ein kurzes *boo*
| |
| | |
| Wird das Image ''docker/whalesay'' ausgeführt, gibt das Skript eine ASCII-Grafik in Form eines Wals sowie die mit dem ''cowsay''-Befehl übergebene Textnachricht „boo“ im Terminal aus
| |
| | |
| Wie beim Testlauf sucht der Daemon das gewünschte Image zunächst im lokalen Dateiverzeichnis
| |
| * Da sich hier kein gleichnamiges Paket findet, wird ein Pulling aus dem Docker-Repository eingeleitet
| |
| * Anschließend startet der Daemon das modifizierte Cowsay-Programm
| |
| * Ist dieses durchgelaufen, wird der '''Container automatisch beendet'''
| |
| | |
| Wie ''cowsay'' bietet Ihnen auch Dockers ''whalesay'' die Möglichkeit, in den Programmablauf einzugreifen, um die Textausgabe im Terminal zu beeinflussen
| |
| * Testen Sie diese Funktion, indem Sie das „boo“ im Ausgangsbefehl durch eine beliebige Zeichenfolge ersetzen – z. B. durch einen lahmen Wal-Witz.
| |
| | |
| <syntaxhighlight lang="bash" highlight="1" copy line>
| |
| sudo docker run docker/whalesay cowsay What did the shark say to the whale? What are you blubbering about?
| |
| </syntaxhighlight>
| |
| | |
| == Alle Docker-Images auf dem lokalen System anzeigen ==
| |
| Sind Sie sich nicht sicher, ob Sie ein bestimmtes Image bereits heruntergeladen haben, können Sie eine '''Übersicht aller Images auf Ihrem lokalen System''' aufrufen
| |
| * Nutzen sie dazu folgenden Kommandozeilenbefehl:
| |
| | |
| <syntaxhighlight lang="bash" highlight="1" line copy>
| |
| sudo docker images
| |
| </syntaxhighlight>
| |
| | |
| Der Befehl docker images (alternativ docker image ls) gibt Ihnen alle lokalen Images inklusive Dateigröße, Tag und Image-ID aus
| |
| | |
| Starten Sie einen Container, wird das zugrundeliegende Image als Kopie aus dem Repository heruntergeladen und dauerhaft auf Ihrem Computer gespeichert
| |
| * So sparen Sie Zeit, falls Sie zu einem späteren Zeitpunkt erneut auf das betreffende Image zugreifen möchten
| |
| * Ein erneuter Download wird nur dann eingeleitet, wenn sich die Image-Quelle verändert – beispielsweise, wenn im Repository eine aktuellere Version zur Verfügung steht
| |
| | |
| == Docker-Images taggen und ins Docker-Hub hochladen ==
| |
| | |
| Möchten Sie Ihr selbsterstelltes Image ''docker-whale'' ins Hub laden, um es dort der Community oder einer Arbeitsgruppe zur Verfügung zu stellen, müssen Sie es zunächst mit einem gleichnamigen Repository in Ihrem persönlichen Namespace verknüpfen
| |
| * In der Docker-Terminologie wird dieser Schritt '''Tagging''' genannt
| |
| | |
| Um ein Image über das Docker-Hub zu veröffentlichen, gehen Sie folgendermaßen vor:
| |
| | |
| 1. '''Repository erstellen:''' Loggen Sie sich mit Ihrer Docker-ID und dem persönlichen Passwort im Docker-Hub ein und erstellen Sie ein öffentliches Repository mit dem Namen ''docker-whale''
| |
| | |
| 2. '''Image-ID ermitteln:''' Ermitteln Sie die ID Ihres selbsterstellten Images ''docker-whale'' mithilfe des Kommandozeilenbefehls docker images
| |
| :* Diese benötigen wir für das Tagging im nächsten Schritt.
| |
| | |
| 3. '''Image taggen:''' Taggen Sie das Image ''docker-whale'' mithilfe des Kommandozeilenbefehls docker tag nach folgendem Schema:
| |
| | |
| <syntaxhighlight lang="bash" highlight="1" copy line>
| |
| sudo docker tag [Image-ID][Docker-ID]/[Image-Name]:[TAG]
| |
| </syntaxhighlight>
| |
| | |
| Auf das aktuelle Beispiel bezogen lautet der Kommandozeilenbefehl für das Tagging somit:
| |
| <syntaxhighlight lang="bash" highlight="1" copy line>
| |
| sudo docker tag a8f2048c9ab8 [Namespace]/docker-whale:latest
| |
| </syntaxhighlight>
| |
| | |
| Ob Ihr Image korrekt getaggt wurde, überprüfen Sie in der Übersicht via docker images
| |
| * Der Name des Repositorys sollte nun Ihre Docker-ID beinhalten
| |
| | |
| # '''Image hochladen:''' Um das Image hochzuladen, müssen Sie sich zunächst im Docker-Hub anmelden
| |
| * Dies erfolgt über den Kommandozeilenbefehl docker login
| |
| | |
| | |
| <syntaxhighlight lang="bash" highlight="1" copy line>
| |
| sudo docker login
| |
| </syntaxhighlight>
| |
| | |
| Das Terminal fordert Sie auf, Ihren Benutzernahmen (die Docker-ID) sowie ihr Passwort einzugeben
| |
| | |
| | |
| War die Anmeldung erfolgreich, verwenden Sie den Kommandozeilenbefehl docker push, um Ihr Image in das neu erstellte Repository hochzuladen
| |
| | |
| <syntaxhighlight lang="bash" highlight="1" copy line>
| |
| sudo docker push [Namespace]/docker-whale
| |
| </syntaxhighlight>
| |
| | |
| Der Upload-Prozess sollte lediglich einige Sekunden in Anspruch nehmen
| |
| * Der aktuelle Status wird Ihnen über das Terminal ausgegeben
| |
| | |
| Melden Sie sich über den Browser im Docker-Hub an, um sich das hochgeladene Image anzeigen zu lassen
| |
| | |
| Möchten Sie mehr als ein Image pro Repository hochladen, verwenden Sie verschiedene Tags, um Ihre Images in unterschiedlichen Versionen anzubieten
| |
| * Beispielsweise:
| |
| <syntaxhighlight lang="bash">
| |
| [Namespace]/docker-whale:latest
| |
| [Namespace]/docker-whale:version1
| |
| [Namespace]/docker-whale:version2
| |
| </syntaxhighlight>
| |
| Eine Übersicht verschiedener Image-Versionen lässt sich in Docker-Hub-Repositorys über den Reiter „Tags“ abrufen
| |
| | |
| Images verschiedener Projekte hingegen sollten in separaten Repositorys angeboten werden
| |
| | |
| War der Upload erfolgreich, steht Ihr selbsterstelltes Image nun jedem Docker-Nutzer weltweit über das öffentliche Repository zur Verfügung.
| |
| | |
| * '''Testlauf:''' Testen Sie den Erfolg des Uploads, indem Sie das soeben hochgeladene Image herunterladen
| |
| | |
| Beachten Sie, dass Sie die lokale Version des Images zunächst löschen müssen, um eine neue Kopie mit demselben Tag herunterzuladen
| |
| * Andernfalls meldet Docker, dass das gewünschte Image bereits in der aktuellen Version vorliegt
| |
| | |
| Um lokale Docker-Images zu löschen, nutzen Sie den Kommandozeilenbefehl docker rmi in Kombination mit der entsprechenden Image-ID
| |
| * Diese ermitteln Sie wie gehabt via docker images. Meldet Docker Konflikte – z. B. weil eine Image-ID in mehreren Repositorys oder von einem Container verwendet wird –, bekräftigen Sie Ihren Befehl mit der Option --force (''Kurz'': -f), um den '''Löschvorgang zu erzwingen'''
| |
| | |
| <syntaxhighlight lang="bash" highlight="1" copy line>
| |
| sudo docker rmi -f a8f2048c9ab8
| |
| </syntaxhighlight>
| |
| | |
| Lassen Sie sich erneut eine Übersicht aller lokalen Images anzeigen:
| |
| | |
| <syntaxhighlight lang="bash" highlight="1" copy line>
| |
| sudo docker images
| |
| </syntaxhighlight>
| |
| | |
| Die gelöschten Elemente sollten in der Terminal-Ausgabe nicht mehr auftauchen
| |
| * Nutzen Sie nun den im Repository angegebenen Pull-Befehl, um eine '''neue Kopie des Images''' aus dem Docker-Hub herunterzuladen:
| |
| | |
| <syntaxhighlight lang="bash" highlight="1" copy line>
| |
| sudo docker pull [Namespace]/docker-whale
| |
| </syntaxhighlight>
| |
| | |
| == Anhang ==
| |
| === Siehe auch ===
| |
| <div style="column-count:2">
| |
| <categorytree hideroot=on mode="pages">Docker</categorytree>
| |
| </div>
| |
| ----
| |
| {{Special:PrefixIndex/Docker/}}
| |
| | |
| === Dokumentation ===
| |
| <!--
| |
| ; Man-Page
| |
| # [https://manpages.debian.org/stable/procps/pgrep.1.de.html prep(1)]
| |
| | |
| ; Info-Pages
| |
| -->
| |
| | |
| === Links ===
| |
| ==== Projekt ====
| |
| ==== Weblinks ====
| |
| [[Kategorie:Docker]]
| |