|
|
| (43 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) |
| Zeile 1: |
Zeile 1: |
| '''Docker/Workshop/Image/Erstellung''' - Image-building best practices
| | #WEITERLEITUNG [[Docker/Image]] |
| | |
| == 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
| |
| docker image history getting-started
| |
| | |
| 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
| |
| docker image history --no-trunc getting-started
| |
| | |
| == 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
| |
| # syntax=docker/dockerfile:1
| |
| FROM node:lts-alpine
| |
| WORKDIR /app
| |
| COPY .
| |
| RUN yarn install --production
| |
| CMD ["node", "src/index.js"]
| |
| | |
| 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
| |
| | |
| 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
| |
| # 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"]
| |
| • Build a new image using docker build
| |
| docker build -t getting-started
| |
| | |
| You should see output like the following
| |
| [+] 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
| |
| • 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
| |
| 4. [+] 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
| |
| | |
| 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
| |
| | |
| # 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
| |
| | |
| 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
| |
| # 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
| |
| | |
| 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
| |
| | |
| ; Summary
| |
| In this section, you learned a few image building best practices, including layer caching and multi-stage builds
| |
| Related information
| |
| • Dockerfile reference
| |
| • Dockerfile best practices
| |
| | |
| ; Next steps
| |
| In the next section, you'll learn about additional resources you can use to continue learning about containers
| |
| | |
| == !!! From Tutorial !!! ==
| |
| == Beschreibung ==
| |
| ; Tutorial-Teile
| |
| # [[Docker/Tutorial]]
| |
| # [[Docker/Tutorial/Arbeiten mit Docker]] | |
| # [[Docker/Tutorial/Images und Container]]
| |
| # [[Docker/Tutorial/Links]]
| |
| | |
| == Docker-Images herunterladen ==
| |
| Als erste Anlaufstelle für offizielle Docker-Ressourcen stellt das Docker-Hub den Ausgangspunkt unserer Einführung in den Umgang mit Images und Containern dar. Das Entwicklungsteam stellt hier u. a. das Demo-Image whalesay zur Verfügung, das als Grundlage für das nachfolgende Docker-Tutorial dienen soll.
| |
| | |
| 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
| |
| | |
| [[Image:csm_docker-hub-whalesay-repos_eae5c60dab.webpBild18.png|top|alt="Bild: Die Suchfunktion im Docker-Hub"]]Durchsuchen Sie das Docker-Hub über die Suchleiste oder die Schaltfläche „Explore“ / hub.docker.com
| |
| | |
| 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'')
| |
| | |
| [[Image:csm_docker-hub-official-whalesay-repo_2355257104.webpBild20.png|top|alt="Bild: Webansicht eines Docker-Repositorys"]]Im Repository finden Nutzer in der Regel alle Informationen, die für den Einsatz des Images benötigt werden / Quelle: hub.docker.com
| |
| | |
| Darüber hinaus bietet jedes Docker-Repository folgende Info-Boxen:
| |
| * '''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:
| |
| | |
| docker pull [OPTIONS] NAME [:TAG|@DIGEST]
| |
| | |
| 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:
| |
| | |
| docker pull docker/whalesay
| |
| | |
| 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:
| |
| docker run [OPTIONS] IMAGE [:TAG|@DIGEST] [CMD] [ARG…]
| |
| | |
| 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
| |
| docker run docker/whalesay cowsay boo
| |
| 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
| |
| | |
| [[Image:csm_docker-run-whalesay-boo-deutsch_c91a88c3a4.webpBild22.png|top|alt="Bild: Terminalausgabe des Containers docker/whalesay: Der Wal sagt boo"]]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
| |
| sudo docker run docker/whalesay cowsay What did the shark say to the whale? What are you blubbering about?
| |
| | |
| [[Image:csm_docker-run-whalesay-witz_fe02a8b1be.webpBild24.png|top|alt="Bild: Terminalausgabe des Containers docker/whalesay: ein Wal mit individueller Textnachricht"]]Legen Sie Ihrem Docker-Wal die Worte in den Mund, die Sie hören möchten
| |
| | |
| == 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:
| |
| sudo docker images
| |
| | |
| Der Befehl docker images (alternativ docker image ls) gibt Ihnen alle lokalen Images inklusive Dateigröße, Tag und Image-ID aus
| |
| | |
| [[Image:csm_sudo-docker-images-leer_9c8d186f19.webpBild26.png|top|alt="Bild: Übersicht aller Images auf dem lokalen System"]]Die Übersicht zeigt die Images *hello-world* und *docker/whalesay*
| |
| | |
| 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
| |
| | |
| == Alle Container auf dem lokalen System anzeigen ==
| |
| Möchten Sie sich eine '''Übersicht aller Container''' ausgeben lassen, die auf Ihrem System ausgeführt werden oder in der Vergangenheit ausgeführt wurden, nutzen Sie den Kommandozeilenbefehl docker ps in Kombination mit der Option --all (kurz: -a):
| |
| sudo docker ps -a
| |
| | |
| [[Image:csm_sudo-docker-ps-a-deutsch_b869ac9539.webpBild28.png|top|alt="Bild: Übersicht aller Container auf dem lokalen System"]]Die Übersicht zeigt alle Container, die auf der Docker-Engine gestartet wurden
| |
| | |
| Die Terminalausgabe umfasst Informationen wie die jeweilige '''Container-ID''', das zugrundeliegende '''Image''', den '''Befehl''', der beim Starten des Containers ausgeführt wurde, den '''Zeitpunkt''', an dem der jeweilige Container gestartet wurde, sowie den aktuellen '''Status'''
| |
| | |
| Möchten Sie lediglich die Container anzeigen, die aktuell auf Ihrem System ausgeführt werden, nutzen Sie den Kommandozeilenbefehl docker ps ohne weitere Option:
| |
| sudo docker ps
| |
| | |
| Derzeit sollten sich auf Ihrem System jedoch keine laufenden Container befinden
| |
| | |
| == Docker-Images erstellen ==
| |
| Sie wissen nun, wie man Images im Docker-Hub findet, diese herunterlädt und auf jedem beliebigen System ausführt, auf dem die Docker-Engine installiert wurde
| |
| * Mit Docker steht Ihnen jedoch nicht nur das umfangreiche App-Angebot der Registry zur Verfügung
| |
| * Die Plattform bietet Ihnen darüber hinaus weitreichende Möglichkeiten, '''eigene Images zu erstellen''' und diese mit anderen Entwicklern zu teilen
| |
| | |
| Bereits in den einleitenden Kapiteln dieses Tutorials haben Sie erfahren, dass jedes Docker-Image auf einem '''Dockerfile''' basiert
| |
| * Dockerfiles können Sie sich als eine Art '''Bauanleitung für Images''' vorstellen
| |
| * Es handelt sich um einfache Textdateien, die alle Anweisungen enthalten, die Docker benötigt, um ein Image zu erstellen
| |
| * Lernen Sie in den folgenden Schritten, wie Sie ein solches Dockerfile schreiben und Docker anweisen, dieses als Grundlage für ein eigenes Image zu verwenden.# '''Neues Verzeichnis anlegen:''' Das Docker-Entwicklerteam empfiehlt, für jedes Dockerfile ein eigenes Verzeichnis anzulegen
| |
| * Verzeichnisse erstellen Sie unter Linux bequem über das Terminal
| |
| * Verwenden Sie folgenden Kommandozeilenbefehl, um ein Verzeichnis mit dem Namen ''mydockerbuild'' zu erstellen:
| |
| mkdir mydockerbuild
| |
| | |
| [[Image:csm_mkdir-mydockerbuild-deutsch_594ba92ce8.webpBild30.png|top|alt="Bild: Ubuntu-Terminal: Der Befehl mkdir"]]Neue Verzeichnisse erstellen Sie mit dem Befehl *mkdir*
| |
| | |
| Close# '''In das neue Verzeichnis navigieren:''' Nutzen Sie den Befehl cd, um in das neu erstellte Arbeitsverzeichnis zu navigieren
| |
| | |
| cd mydockerbuild
| |
| | |
| [[Image:csm_cd-mydockerbuild-deutsch_0661f65793.webpBild32.png|top|alt="Bild: Ubuntu-Terminal: der Befehl cd"]]Mithilfe des Befehls *cd* wechseln Sie in ein anderes Arbeitsverzeichnis
| |
| | |
| Close# '''Neue Textdatei erstellen:''' Auch Textdateien erstellen Sie unter Ubuntu bequem über das Terminal
| |
| * Verwenden Sie dazu einen Editor wie Nano oder [https://www.ionos.de/digitalguide/server/tools/linux-editor-effiziente-code-bearbeitung-mit-vim/ Vim]
| |
| * Erstellen Sie im Verzeichnis ''mydockerbuild'' eine Textdatei mit dem Namen ''Dockerfile''
| |
| | |
| nano Dockerfile
| |
| | |
| [[Image:csm_nano-dockerfile-leer_835ad94940.webpBild34.png|top|alt="Bild: Ubuntu-Terminal: Textdateien mit Nano erstellen"]]Der Texteditor Nano ist bei allen Ubuntu-Versionen vorinstalliert
| |
| | |
| <div style="margin-left:0cm;margin-right:0cm;">[[Image:csm_nano-dockerfile-leer_835ad94940.webpBild35.png|top|alt="Bild: Ubuntu-Terminal: Textdateien mit Nano erstellen"]]Der Texteditor Nano ist bei allen Ubuntu-Versionen vorinstalliert </div>
| |
| | |
| Close# '''Dockerfile schreiben:''' Die neu erstellte Textdatei dient als Bauplan für Ihr selbst entwickeltes Image
| |
| * Statt das Image von Grund auf neu zu programmieren, nutzen wir in diesem Docker-Tutorial das Demo-Image ''docker/whalesay'' als Vorlage
| |
| * Dieses binden Sie über den Befehl ''FROM'' in Ihr Dockerfile ein
| |
| * Verwenden Sie das Tag '':latest,'' um auf die neueste Version des Images zu verweisen
| |
| | |
| | |
| | |
| FROM docker/whalesay:latest
| |
| | |
| Bisher arbeitet ''docker/whalesay'' so, dass Sie dem Wal die Worte in den Mund legen müssen
| |
| * Im Terminal erscheint genau der Text, den Sie zuvor in Kombination mit dem Befehl zum Starten des Containers eingegeben haben
| |
| * Interessanter wäre es jedoch, wenn das Skript '''automatisch''' immer wieder neue Textausgaben generieren würde
| |
| * Umsetzen lässt sich dies beispielsweise mithilfe des Programms ''fortunes'', das auf jedem Linux-System zur Verfügung steht
| |
| * Die Grundfunktion von Fortunes besteht darin, Glückskeks-Sprüche und humorvolle Aphorismen zu generieren
| |
| * Nutzen Sie folgenden Befehl, um Ihren lokalen Paket-Index zu aktualisieren und ''fortunes'' zu installieren:
| |
| | |
| RUN apt-get -y update && apt-get install -y fortunes
| |
| | |
| Anschließend definieren Sie ein ''CMD''-Statement
| |
| * Dieses wird nach dem Befehl ''RUN'' 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:
| |
| | |
| CMD /usr/games/fortune -a | cowsay
| |
| | |
| Ihr Dockerfile sollte nun folgendermaßen aussehen:
| |
| | |
| FROM docker/whalesay:latest
| |
| | |
| RUN apt-get -y update && apt-get install -y fortunes
| |
| | |
| CMD /usr/games/fortune -a | cowsay
| |
| | |
| Beachten Sie: '''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
| |
| | |
| [[Image:csm_nano-dockerfile-voll_242ccfc945.webpBild36.png|top|alt="Bild: Der Texteditor Nano im Ubuntu-Terminal"]]Den Texteditor Nano steuern Sie über die in der Fußzeile angegebenen Tastenkombinationen
| |
| | |
| <div style="margin-left:0cm;margin-right:0cm;">[[Image:csm_nano-dockerfile-voll_242ccfc945.webpBild37.png|top|alt="Bild: Der Texteditor Nano im Ubuntu-Terminal"]]Den Texteditor Nano steuern Sie über die in der Fußzeile angegebenen Tastenkombinationen </div>
| |
| | |
| Close# '''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:
| |
| | |
| docker build -t docker-whale
| |
| | |
| bash
| |
| | |
| 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:
| |
| | |
| Successfully built a8f2048c9ab8
| |
| | |
| [[Image:csm_sudo-docker-build-whale-deutsch_af9ac656c1.webpBild38.png|top|alt="Bild: Ubuntu-Terminal: Statusmeldungen während der Image-Erstellung"]]Docker-Images werden in mehreren Layern (Schichten
| |
| | |
| <div style="margin-left:0cm;margin-right:0cm;">[[Image:csm_sudo-docker-build-whale-deutsch_af9ac656c1.webpBild39.png|top|alt="Bild: Ubuntu-Terminal: Statusmeldungen während der Image-Erstellung"]]Docker-Images werden in mehreren Layern (Schichten </div>
| |
| | |
| Close
| |
| | |
| Ihr neu erstelltes Image finden Sie unter dem Namen ''docker-whale'' in der Übersicht ihrer lokal gespeicherten Images
| |
| | |
| sudo docker images
| |
| | |
| bash
| |
| | |
| [[Image:csm_docker-images-neu-docker-whale_f352c6397b.webpBild40.png|top|alt="Bild: Ubuntu-Termal: Übersicht aller Images"]]Das neu erstellte Image in der Image-Übersicht
| |
| | |
| <div style="margin-left:0cm;margin-right:0cm;">[[Image:csm_docker-images-neu-docker-whale_f352c6397b.webpBild41.png|top|alt="Bild: Ubuntu-Termal: Übersicht aller Images"]]Das neu erstellte Image in der Image-Übersicht </div>
| |
| | |
| Close
| |
| | |
| Um einen Container aus Ihrem neu erstellten Image zu starten, verwenden Sie den Kommandozeilenbefehl sudo docker run in Kombination mit dem Namen des Images:
| |
| | |
| sudo docker run docker-whale
| |
| | |
| bash
| |
| | |
| 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:csm_sudo-run-docker-whale-fortunes-deutsch_6aa003bc3d.webpBild42.png|top|alt="Bild: Container auf Basis von docker-whale: Textausgabe im Terminal"]]Dank *fortunes* gibt der ASCII-Wal nun Aphorismen zum Besten
| |
| | |
| <div style="margin-left:0cm;margin-right:0cm;">[[Image:csm_sudo-run-docker-whale-fortunes-deutsch_6aa003bc3d.webpBild43.png|top|alt="Bild: Container auf Basis von docker-whale: Textausgabe im Terminal"]]Dank *fortunes* gibt der ASCII-Wal nun Aphorismen zum Besten </div>
| |
| | |
| Close
| |
| | |
| Tipp
| |
| | |
| Wie Sie [https://www.ionos.de/digitalguide/server/knowhow/docker-images-erstellen/ Docker-Images erstellen] erfahren Sie noch detaillierter in unserem separaten Artikel
| |
| | |
| == 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:# '''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''
| |
| | |
| | |
| | |
| [[Image:csm_docker-hub-docker-whale-repo-anlegen_49944345b7.webpBild44.png|top|alt="Bild: Das Docker-Hub: Eingabemaske zur Erstellung eines Repositorys"]]Legen Sie ein Repository für Ihr selbsterstelltes Image an / Quelle: hub.docker.com
| |
| | |
| <div style="margin-left:0cm;margin-right:0cm;">[[Image:csm_docker-hub-docker-whale-repo-anlegen_49944345b7.webpBild45.png|top|alt="Bild: Das Docker-Hub: Eingabemaske zur Erstellung eines Repositorys"]]Legen Sie ein Repository für Ihr selbsterstelltes Image an / Quelle: hub.docker.com </div>
| |
| | |
| Close# '''Image-ID ermitteln:''' Ermitteln Sie die ID Ihres selbsterstellten Images ''docker-whale'' mithilfe des Kommandozeilenbefehls docker images
| |
| | |
| | |
| | |
| [[Image:csm_sudo-docker-images-id-deutsch_8178d5f0f2.webpBild46.png|top|alt="Bild: Übersicht aller lokalen Images im Ubuntu-Terminal"]]Der Befehl *docker images* listet alle Images auf, die auf Ihrem System gespeichert sind
| |
| | |
| <div style="margin-left:0cm;margin-right:0cm;">[[Image:csm_sudo-docker-images-id-deutsch_8178d5f0f2.webpBild47.png|top|alt="Bild: Übersicht aller lokalen Images im Ubuntu-Terminal"]]Der Befehl *docker images* listet alle Images auf, die auf Ihrem System gespeichert sind </div>
| |
| | |
| Close
| |
| | |
| In unserem Fall lautet die Image-ID ''a8f2048c9ab8''
| |
| * Diese benötigen wir für das Tagging im nächsten Schritt.# '''Image taggen:''' Taggen Sie das Image ''docker-whale'' mithilfe des Kommandozeilenbefehls docker tag nach folgendem Schema:
| |
| | |
| | |
| | |
| sudo docker tag [Image-ID][Docker-ID]/[Image-Name]:[TAG]
| |
| | |
| bash
| |
| | |
| Auf das aktuelle Beispiel bezogen lautet der Kommandozeilenbefehl für das Tagging somit:
| |
| | |
| sudo docker tag a8f2048c9ab8 [Namespace]/docker-whale:latest
| |
| | |
| bash
| |
| | |
| 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:csm_sudo-docker-tag-docker-whale-deutsch_b7967a6175.webpBild48.png|top|alt="Bild: Ubuntu-Terminal: Image-Übersicht vor und nach dem Tagging"]]Mit dem Befehl *docker tag* verknüpfen Sie Images mit Ihrer Docker-ID
| |
| | |
| <div style="margin-left:0cm;margin-right:0cm;">[[Image:csm_sudo-docker-tag-docker-whale-deutsch_b7967a6175.webpBild49.png|top|alt="Bild: Ubuntu-Terminal: Image-Übersicht vor und nach dem Tagging"]]Mit dem Befehl *docker tag* verknüpfen Sie Images mit Ihrer Docker-ID </div>
| |
| | |
| Close# '''Image hochladen:''' Um das Image hochzuladen, müssen Sie sich zunächst im Docker-Hub anmelden
| |
| * Dies erfolgt über den Kommandozeilenbefehl docker login
| |
| | |
| | |
| | |
| sudo docker login
| |
| | |
| bash
| |
| | |
| Das Terminal fordert Sie auf, Ihren Benutzernahmen (die Docker-ID) sowie ihr Passwort einzugeben
| |
| | |
| [[Image:csm_sudo-docker-login-deutsch_cf8c82f05f.webpBild50.png|top|alt="Bild: Anmeldung am Docker-Hub über das Ubuntu-Terminal"]]Bevor Sie ein Image ins Docker-Hub hochladen können, müssen Sie sich anmelden
| |
| | |
| <div style="margin-left:0cm;margin-right:0cm;">[[Image:csm_sudo-docker-login-deutsch_cf8c82f05f.webpBild51.png|top|alt="Bild: Anmeldung am Docker-Hub über das Ubuntu-Terminal"]]Bevor Sie ein Image ins Docker-Hub hochladen können, müssen Sie sich anmelden </div>
| |
| | |
| Close
| |
| | |
| War die Anmeldung erfolgreich, verwenden Sie den Kommandozeilenbefehl docker push, um Ihr Image in das neu erstellte Repository hochzuladen
| |
| | |
| sudo docker push [Namespace]/docker-whale
| |
| | |
| bash
| |
| | |
| Der Upload-Prozess sollte lediglich einige Sekunden in Anspruch nehmen
| |
| * Der aktuelle Status wird Ihnen über das Terminal ausgegeben
| |
| | |
| [[Image:csm_sudo-docker-push-whale-deutsch_6f9621b7f3.webpBild52.png|top|alt="Bild: Ubuntu-Terminal: Statusmeldung nach dem Image-Upload"]]Das Image steht nach dem Upload unter dem gesetzten Tag *latest* im Docker-Hub zur Verfügung
| |
| | |
| <div style="margin-left:0cm;margin-right:0cm;">[[Image:csm_sudo-docker-push-whale-deutsch_6f9621b7f3.webpBild53.png|top|alt="Bild: Ubuntu-Terminal: Statusmeldung nach dem Image-Upload"]]Das Image steht nach dem Upload unter dem gesetzten Tag *latest* im Docker-Hub zur Verfügung. </div>
| |
| | |
| Close
| |
| | |
| Melden Sie sich über den Browser im Docker-Hub an, um sich das hochgeladene Image anzeigen zu lassen
| |
| | |
| [[Image:csm_docker-hub-push-ergebnis_f4f5113f51.webpBild54.png|top|alt="Bild: Docker-Hub: Das Repository [Namespace]/docker-whale in der Detailansicht"]]Die letzte Aktualisierung Ihres Repositorys wird Ihnen in der Detailansicht angezeigt / Quelle: hub.docker.com
| |
| | |
| <div style="margin-left:0cm;margin-right:0cm;">[[Image:csm_docker-hub-push-ergebnis_f4f5113f51.webpBild55.png|top|alt="Bild: Docker-Hub: Das Repository [Namespace]/docker-whale in der Detailansicht"]]Die letzte Aktualisierung Ihres Repositorys wird Ihnen in der Detailansicht angezeigt / Quelle: hub.docker.com </div>
| |
| | |
| Close
| |
| | |
| Möchten Sie mehr als ein Image pro Repository hochladen, verwenden Sie verschiedene Tags, um Ihre Images in unterschiedlichen Versionen anzubieten
| |
| * Beispielsweise:
| |
| | |
| [Namespace]/docker-whale:latest
| |
| | |
| [Namespace]/docker-whale:version1
| |
| | |
| [Namespace]/docker-whale:version2
| |
| | |
| Eine Übersicht verschiedener Image-Versionen lässt sich in Docker-Hub-Repositorys über den Reiter „Tags“ abrufen
| |
| | |
| [[Image:csm_docker-hub-mehrere-versionen-tags_5895e082a9.webpBild56.png|top|alt="Bild: Docker-Hub: Der Reiter „Tags“"]]Im Reiter „Tags“ finden Sie alle Versionen eines Images / Quelle: hub.docker.com
| |
| | |
| <div style="margin-left:0cm;margin-right:0cm;">[[Image:csm_docker-hub-mehrere-versionen-tags_5895e082a9.webpBild57.png|top|alt="Bild: Docker-Hub: Der Reiter „Tags“"]]Im Reiter „Tags“ finden Sie alle Versionen eines Images / Quelle: hub.docker.com </div>
| |
| | |
| Close
| |
| | |
| 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
| |
| | |
| [[Image:csm_sudo-docker-pull-docker-whale-deutsch_71e5c5c84d.webpBild58.png|top|alt="Bild: Statusmeldung: „Image is up to date“ („Die lokale Kopie ist aktuell“)"]]Liegt ein Image lokal vor, wird der Pull-Befehl abgebrochen
| |
| | |
| <div style="margin-left:0cm;margin-right:0cm;">[[Image:csm_sudo-docker-pull-docker-whale-deutsch_71e5c5c84d.webpBild59.png|top|alt="Bild: Statusmeldung: „Image is up to date“ („Die lokale Kopie ist aktuell“)"]]Liegt ein Image lokal vor, wird der Pull-Befehl abgebrochen </div>
| |
| | |
| Close
| |
| | |
| 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'''
| |
| | |
| sudo docker rmi -f a8f2048c9ab8
| |
| | |
| bash
| |
| | |
| [[Image:csm_sudo-docker-rmi-image-entfernen_172288d8a7.webpBild60.png|top|alt="Bild: Befehl docker rmi in Kombination mit der Option -f (force)"]]Nutzen Sie den Befehl *docker rmi* in Kombination mit der Option *-f*, um einen Löschvorgang zu erzwingen
| |
| | |
| <div style="margin-left:0cm;margin-right:0cm;">[[Image:csm_sudo-docker-rmi-image-entfernen_172288d8a7.webpBild61.png|top|alt="Bild: Befehl docker rmi in Kombination mit der Option -f (force)"]]Nutzen Sie den Befehl *docker rmi* in Kombination mit der Option *-f*, um einen Löschvorgang zu erzwingen </div>
| |
| | |
| Close
| |
| | |
| Lassen Sie sich erneut eine Übersicht aller lokalen Images anzeigen:
| |
| | |
| sudo docker Images
| |
| | |
| bash
| |
| | |
| 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:
| |
| | |
| sudo docker pull [Namespace]/docker-whale
| |
| | |
| bash
| |
| | |
| [[Image:csm_sudo-docker-pull-image-neu-herunterladen_6029087c34.webpBild62.png|top|alt="Bild: Ubuntu-Terminal: Download aus dem Docker-Hub"]]Das zuvor veröffentlichte Image wurde erfolgreich heruntergeladen
| |
| | |
| <div style="margin-left:0cm;margin-right:0cm;">[[Image:csm_sudo-docker-pull-image-neu-herunterladen_6029087c34.webpBild63.png|top|alt="Bild: Ubuntu-Terminal: Download aus dem Docker-Hub"]]Das zuvor veröffentlichte Image wurde erfolgreich heruntergeladen </div>
| |
| | |
| Close
| |
|
| |
| == Anhang ==
| |
| === Siehe auch ===
| |
| <div style="column-count:2">
| |
| <categorytree hideroot=on mode="pages">Docker/Workshop</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 ====
| |