Bei der Arbeit an Docker-Projekten entsprechen die vorhandenen Docker-Images meist nicht Ihren Anforderungen. Deshalb ist es nützlich zu wissen, was Dockerfile ist und wie man ein Docker-Image erstellt.

Mit Dockerfile können Sie eigene Docker-Images erstellen. Daher ist es wichtig, etwas über Dockerfile zu wissen.

Was ist eine Dockerdatei?

Es handelt sich um eine einfache Textdatei mit einer Reihe von Befehlen oder Anweisungen. Diese Befehle/Anweisungen werden nacheinander ausgeführt, um Aktionen am Basis-Image durchzuführen und ein neues Docker-Image zu erstellen.

kommentare und Befehlsargumente sind zwei Arten von Hauptzeilenblöcken in der Dockerfile-Syntax

Kommentare Syntax

#Zeilenblöcke, die für Kommentare verwendet werden

befehl argument argument1 .....

Befehle Argumente Beispiel

#Zeilenblöcke, die zum Kommentieren verwendet werden

befehl argument argument1 .....

Nachfolgend sehen Sie, wie Ihr Arbeitsablauf aussehen wird.

dockerfile workflow
  • Erstellen Sie eine Dockerdatei und erwähnen Sie die Anweisungen zur Erstellung Ihres Docker-Images
  • Führen Sie den Befehl docker build aus, um ein Docker-Image zu erstellen
  • Jetzt ist das Docker-Image einsatzbereit. Verwenden Sie den Befehl docker run, um Container zu erstellen

Schauen wir uns nun die grundlegenden Befehle an.

Grundlegende Befehle

Bei der Verwendung von Dockerfile habe ich diese grundlegenden Befehle als nützlich empfunden:

  • FROM – Legt das zu verwendende Basis-Image fest und startet den Erstellungsprozess.
  • RUN – Nimmt den Befehl und seine Argumente entgegen, um ihn aus dem Image auszuführen.
  • CMD – Ähnliche Funktion wie der RUN-Befehl, aber er wird erst ausgeführt, nachdem der Container instanziiert wurde.
  • ENTRYPOINT – Er zielt auf Ihre Standardanwendung im Image, wenn der Container erstellt wird.
  • ADD – Kopiert die Dateien von der Quelle zum Ziel (innerhalb des Containers).
  • ENV – Legt Umgebungsvariablen fest.

Kopieren Sie diese in eine Datei, damit Sie sie bei Bedarf nachschlagen können, oder besser noch, setzen Sie ein Lesezeichen für meinen Beitrag!

Wie erstellt man ein Docker-Image mit einer Dockerdatei?

Lassen Sie uns zunächst eine Dockerdatei erstellen.

geekflare@geekflare:~$ gedit Dockerfile

Geben Sie die folgenden Befehle/Anweisungen ein und speichern Sie sie.

# Setzen Sie das Basis-Image auf Ubuntu
FROM ubuntu

# Aktualisieren Sie die Liste der Repository-Quellen und installieren Sie gnupg2
RUN apt-get update && apt-get install -y gnupg2

# Fügen Sie den Paketprüfungsschlüssel hinzu
RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10

# Fügen Sie MongoDB zur Liste der Repository-Quellen hinzu
RUN echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' > tee /etc/apt/sources.list.d/mongodb.list

# Aktualisieren Sie die Liste der Repository-Quellen
RUN apt-get update

# Installieren Sie das MongoDB-Paket (.deb)
RUN apt-get install -y mongodb

# Erstellen Sie das Standard-Datenverzeichnis
RUN mkdir -p /data/db

# Geben Sie den Standardport frei
EXPOSE 27017

# Standardport für die Ausführung des Einstiegspunkts (MongoDB)
CMD ["--port 27017"]

# Standard-Container-Befehl festlegen
ENTRYPOINT usr/bin/mongodb

In dieser Dockerdatei wird ubuntu als Basis-Image festgelegt. Dann werden die notwendigen Befehle und Argumente für die Installation von MongoDB angegeben. Port 27017 wird für MongoDB mit dem Standard-Container-Befehl usr/bin/mongodb freigegeben

Als nächstes werde ich es ausführen, um ein Docker-Image zu erstellen.

Ausführen einer Dockerdatei

Der folgende Befehl erstellt nach erfolgreicher Ausführung ein Docker-Image namens geekflare_mongodb.

geekflare@geekflare:~$ docker build -t geekflare_mongodb .

Senden des Build-Kontextes an den Docker-Daemon 667.2MB

Schritt 1/9 : VON ubuntu

aktuell: Ziehen aus library/ubuntu

7413c47ba209: Pull abgeschlossen

0fe7e7cbb2e8: Pull abgeschlossen

1d425c982345: Abruf abgeschlossen

344da5c95cec: Pull komplett

Digest: sha256:c303f19cfe9ee92badbbbd7567bc1ca47789f79303ddcef56f77687d4744cd7a

Status: Heruntergeladenes neueres Image für ubuntu:latest

--->
 3556258649b2

Schritt 2/10 : Führen Sie apt-get update aus && apt-get install -y gnupg2

--->
 Läuft in de3706328761

Get:1 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]

Hole:2 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB]

Abgerufen 16.9 MB in 38s (445 kB/s)

Paketlisten lesen...

Lesen von Paketlisten...

Abhängigkeitsbaum erstellen...

Lesen von Statusinformationen...

Ich brauche 5187 kB an Archiven.

Nach diesem Vorgang werden 15,8 MB zusätzlicher Speicherplatz benötigt.

Get:1 http://archive.ubuntu.com/ubuntu bionic/main amd64 readline-common all 7.0-3 [52.9 kB]

Hole:2 http://archive.ubuntu.com/ubuntu bionic/main amd64 libreadline7 amd64 7.0-3 [124 kB]

Hole:3 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libsqlite3-0 amd64 3.22.0-1ubuntu0.1 [497 kB]

Get:4 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libssl1.1 amd64 1.1.1-1ubuntu2.1~18.04.4 [1300 kB]

debconf: Verzögerung der Paketkonfiguration, da apt-utils nicht installiert ist

Holte 5187 kB in 12s (416 kB/s)

Auswahl des zuvor nicht ausgewählten Pakets readline-common.

(Lesen der Datenbank ... 4040 Dateien und Verzeichnisse sind derzeit installiert.)

Vorbereiten des Entpackens von .../00-readline-common_7.0-3_all.deb ...

Entpacken von readline-common (7.0-3) ...

Auswählen des zuvor nicht ausgewählten Pakets libreadline7:amd64.

Vorbereiten zum Entpacken von .../01-libreadline7_7.0-3_amd64.deb ...

Zuvor nicht ausgewähltes Paket dirmngr auswählen.

Einrichten von libnpth0:amd64 (1.5-3) ...

Einrichten von libksba8:amd64 (1.3.5-2) ...

Einrichten von gnupg-l10n (2.2.4-1ubuntu1.2) ...

Verarbeiten der Auslöser für libc-bin (2.27-3ubuntu1) ...

Entfernen des Zwischencontainers de3706328761

--->
 a32533894ed1

Schritt 3/10 : RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10

--->
 Läuft in 69c4dba38983

Warnung: Die Ausgabe von apt-key sollte nicht geparst werden (stdout ist kein Terminal)

Wird ausgeführt: /tmp/apt-key-gpghome.MuT5BDWwKZ/gpg.1.sh --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10

gpg: Schlüssel 5F8F93707F0CEB10: öffentlicher Schlüssel "Totally Legit Signing Key <mallory@example.org>" importiert

gpg: Schlüssel 9ECBEC467F0CEB10: 1 Signatur nicht geprüft, da Schlüssel fehlt

gpg: Schlüssel 9ECBEC467F0CEB10: öffentlicher Schlüssel "Richard Kreuter <richard@10gen.com>" importiert

gpg: Gesamtzahl verarbeitet: 2

gpg: importiert: 2

Entfernen des Zwischencontainers 69c4dba38983

--->
 cffbe06c1b50

Schritt 4/10 : RUN echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' > tee /etc/apt/sources.list.d/mongodb.list

--->
 Läuft in 40630fd7b0a9

Entfernen des Zwischencontainers 40630fd7b0a9

--->
 a1bd9d8d7e51

Schritt 5/10 : Führen Sie apt-get update aus

--->
 Wird ausgeführt in 750717d9c0ea

Treffer:1 http://archive.ubuntu.com/ubuntu bionic InRelease

Treffer:2 http://archive.ubuntu.com/ubuntu bionic-updates InRelease

Treffer:3 http://security.ubuntu.com/ubuntu bionic-security InRelease

Treffer:4 http://archive.ubuntu.com/ubuntu bionic-backports InRelease

Paketlisten lesen...

Entfernen des Zwischencontainers 750717d9c0ea

--->
 397d6501db58

Schritt 6/10 : Führen Sie apt-get install -y mongodb aus

--->
 Läuft in 88609c005e73

Paketlisten lesen...

Erstellen des Abhängigkeitsbaums...

Lesen von Statusinformationen...

Die folgenden NEUEN Pakete werden installiert:

libboost-filesystem1.65.1 libboost-iostreams1.65.1

libboost-program-options1.65.1 libboost-system1.65.1 libgoogle-perftools4

libpcap0.8 libpcrecpp0v5 libsnappy1v5 libstemmer0d libtcmalloc-minimal4

libunwind8 libyaml-cpp0.5v5 mongo-tools mongodb mongodb-clients

mongodb-server mongodb-server-core

0 upgegradet, 17 neu installiert, 0 zu entfernen und 0 nicht upgegradet.

Sie benötigen 53,7 MB an Archiven.

Nach diesem Vorgang werden 218 MB zusätzlicher Speicherplatz benötigt.

Get:1 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 mongodb-clients amd64 1:3.6.3-0ubuntu1.1 [20.2 MB]

Get:2 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 mongodb-server-core amd64 1:3.6.3-0ubuntu1.1 [20.3 MB]

Hole:3 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 mongodb-server all 1:3.6.3-0ubuntu1.1 [12.6 kB]

Get:4 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 mongodb amd64 1:3.6.3-0ubuntu1.1 [9968 B]

Holte 53,7 MB in 10s (5485 kB/s)

Auswahl des zuvor nicht ausgewählten Pakets libpcap0.8:amd64.

(Lesen der Datenbank ... 4390 Dateien und Verzeichnisse sind derzeit installiert.)

Auswahl des zuvor nicht ausgewählten Pakets mongodb-clients.

Vorbereiten des Entpackens von .../13-mongodb-clients_1:3.6.3-0ubuntu1.1_amd64.deb ...

Entpacken von mongodb-clients (1:3.6.3-0ubuntu1.1) ...

Auswählen des zuvor nicht ausgewählten Pakets mongodb-server-core.

Vorbereiten des Entpackens von .../14-mongodb-server-core_1:3.6.3-0ubuntu1.1_amd64.deb ...

Entpacken von mongodb-server-core (1:3.6.3-0ubuntu1.1) ...

Auswählen des zuvor nicht ausgewählten Pakets mongodb-server.

Vorbereiten des Entpackens von .../15-mongodb-server_1:3.6.3-0ubuntu1.1_all.deb ...

Entpacken von mongodb-server (1:3.6.3-0ubuntu1.1) ...

Auswählen des zuvor nicht ausgewählten Pakets mongodb.

Vorbereiten zum Entpacken von .../16-mongodb_1:3.6.3-0ubuntu1.1_amd64.deb ...

Entpacken von mongodb (1:3.6.3-0ubuntu1.1) ...

Einrichten von mongodb-server-core (1:3.6.3-0ubuntu1.1) ...

Einrichten von mongo-tools (3.6.3-0ubuntu1) ...

Einrichten von mongodb-clients (1:3.6.3-0ubuntu1.1) ...

Einrichten von mongodb-server (1:3.6.3-0ubuntu1.1) ...

invoke-rc.d: konnte den aktuellen Runlevel nicht ermitteln

invoke-rc.d: policy-rc.d verweigert die Ausführung von start.

Einrichten von mongodb (1:3.6.3-0ubuntu1.1) ...

Verarbeitung von Triggern für libc-bin (2.27-3ubuntu1) ...

Entfernen des Zwischencontainers 88609c005e73

--->
 d9c072cb1f84

Schritt 7/10 : RUN mkdir -p /data/db

--->
 Läuft in f817778f69ab

Entfernen des Zwischencontainers f817778f69ab

--->
 a3fbdb3def5c

Schritt 8/10 : EXPOSE 27017

--->
 Läuft in 8d070e2a1e07

Entfernen des Zwischencontainers 8d070e2a1e07

--->
 f770776a538c

Schritt 9/10 : CMD ["--port 27017"]

--->
 Läuft in ab612410df77

Entfernen des Zwischencontainers ab612410df77

--->
 e5830b80934f

Schritt 10/10 : ENTRYPOINT usr/bin/mongod

--->
 Läuft in 95f574727aab

Entfernen des Zwischencontainers 95f574727aab

--->
 095d17727ca0

Erfolgreich gebaut 095d17727ca0

Erfolgreich getaggt geekflare_mongodb:latest

Lassen Sie uns überprüfen, ob das Docker-Image mit dem Namen geekflare_mongodb erstellt wurde.

geekflare@geekflare:~$ docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

geekflare_mongodb latest 095d17727ca0 vor 3 Minuten 325MB

ubuntu aktuell 3556258649b2 vor 4 Tagen 64.2MB

mean_express aktuell 35dcb3df9806 vor 6 Tagen 923MB

mean_angular aktuell 9f8d61db600c vor 6 Tagen 1.29GB

Führen Sie das Docker-Image geekflare_mongodb in einem Container mongo_container aus.

geekflare@geekflare:~$ docker run --name mongo_container -i -t geekflare_mongodb

2019-07-27T19:38:23.734 0000 I CONTROL [initandlisten] MongoDB startet : pid=6 port=27017 dbpath=/data/db 64-bit host=b0095c1e5536

2019-07-27T19:38:23.735 0000 I CONTROL [initandlisten] db version v3.6.3

2019-07-27T19:38:23.735 0000 I CONTROL [initandlisten] git version: 9586e557d54ef70f9ca4b43c26892cd55257e1a5

2019-07-27T19:38:23.736 0000 I CONTROL [initandlisten] OpenSSL Version: OpenSSL 1.1.1 11 Sep 2018

2019-07-27T19:38:23.739 0000 I CONTROL [initandlisten] Zuweiser: tcmalloc

2019-07-27T19:38:23.739 0000 I CONTROL [initandlisten] Module: keine

2019-07-27T19:38:23.739 0000 I CONTROL [initandlisten] Build-Umgebung:

2019-07-27T19:38:23.739 0000 I CONTROL [initandlisten] distarch: x86_64

2019-07-27T19:38:23.739 0000 I CONTROL [initandlisten] target_arch: x86_64

2019-07-27T19:38:23.739 0000 I CONTROL [initandlisten] Optionen: {}

2019-07-27T19:38:23.745 0000 I STORAGE [initandlisten] wiredtiger_open config: create,cache_size=2038M,session_max=20000,eviction=(threads_min=4,threads_max=4),config_base=false,statistics=(fast),log=(enabled=true,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=100000),statistics_log=(wait=0),verbose=(recovery_progress),

2019-07-27T19:38:24.733 0000 I CONTROL [initandlisten]

2019-07-27T19:38:24.734 0000 I CONTROL [initandlisten] ** WARNING: Die Zugriffskontrolle ist für die Datenbank nicht aktiviert.

2019-07-27T19:38:24.735 0000 I CONTROL [initandlisten] ** Der Lese- und Schreibzugriff auf Daten und Konfiguration ist uneingeschränkt möglich.

2019-07-27T19:38:24.736 0000 I CONTROL [initandlisten] ** WARNUNG: Sie führen diesen Prozess als Root-Benutzer aus, was nicht empfohlen wird.

2019-07-27T19:38:24.736 0000 I CONTROL [initandlisten]

2019-07-27T19:38:24.736 0000 I CONTROL [initandlisten] ** WARNUNG: Dieser Server ist an localhost gebunden.

2019-07-27T19:38:24.737 0000 I CONTROL [initandlisten] ** Entfernte Systeme können keine Verbindung zu diesem Server herstellen.

2019-07-27T19:38:24.737 0000 I CONTROL [initandlisten] ** Starten Sie den Server mit --bind_ip <address>, um anzugeben, welche IP

2019-07-27T19:38:24.737 0000 I CONTROL [initandlisten] ** Adressen, von denen er Antworten liefern soll, oder mit --bind_ip_all, um

2019-07-27T19:38:24.737 0000 I CONTROL [initandlisten] ** an alle Schnittstellen binden. Wenn dieses Verhalten erwünscht ist, starten Sie die

2019-07-27T19:38:24.738 0000 I CONTROL [initandlisten] ** Server mit --bind_ip 127.0.0.1, um diese Warnung zu deaktivieren.

2019-07-27T19:38:24.738 0000 I CONTROL [initandlisten]

2019-07-27T19:38:24.739 0000 I STORAGE [initandlisten] createCollection: admin.system.version mit angegebener UUID: 4b8b509d-633a-46c1-a302-cb8c82b0d5d3

2019-07-27T19:38:24.788 0000 I COMMAND [initandlisten] setze featureCompatibilityVersion auf 3.6

2019-07-27T19:38:24.818 0000 I STORAGE [initandlisten] createCollection: local.startup_log mit generierter UUID: 6c1c0366-4b1b-4b92-9fcd-d18acc126072

2019-07-27T19:38:24.862 0000 I FTDC [initandlisten] Initialisierung der Vollzeit-Diagnosedatenerfassung mit Verzeichnis '/data/db/diagnostic.data'

2019-07-27T19:38:24.866 0000 I NETWORK [initandlisten] wartet auf Verbindungen auf Port 27017

Öffnen Sie ein neues Terminal und überprüfen Sie, ob mongo_container läuft.

geekflare@geekflare:~$ docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

b0095c1e5536 geekflare_mongodb "/bin/sh -c usr/bin/..." vor 35 Sekunden Up 33 Sekunden 27017/tcp mongo_container

Wie Sie sehen können, ist der aus dem geekflare_mongodb-Image erstellte Container betriebsbereit.

Ich hoffe, Sie haben jetzt eine Vorstellung von Dockerfile und seinen Vorteilen. Sie können sich auch diese Dokumentation über die besten Praktiken von Dockerfile ansehen, um mehr zu erfahren.

Related Articles