Docker
Bilder bauen
Suche…
Parameter
Parameter | Einzelheiten |
---|---|
--ziehen | Stellt sicher, dass das Basisimage ( FROM ) aktuell ist, bevor der Rest der Dockerfile erstellt wird. |
Erstellen eines Bildes aus einer Dockerfile
Sobald Sie eine Docker-Datei haben, können Sie mit docker build
ein Image daraus docker build
. Die Grundform dieses Befehls lautet:
docker build -t image-name path
Wenn Ihre Docker-Datei nicht als Dockerfile
, können Sie mit dem Flag -f
den Namen der zu erstellenden Docker-Datei angeben.
docker build -t image-name -f Dockerfile2 .
So erstellen Sie beispielsweise ein Image mit dem Namen dockerbuild-example:1.0.0
aus einer Dockerfile
im aktuellen Arbeitsverzeichnis:
$ ls
Dockerfile Dockerfile2
$ docker build -t dockerbuild-example:1.0.0 .
$ docker build -t dockerbuild-example-2:1.0.0 -f Dockerfile2 .
Weitere docker build
und Einstellungen finden Sie in der docker build
Verwendungsdokumentation .
Ein häufiger Fehler ist das Erstellen einer Docker-Datei im Home-Verzeichnis des Benutzers ( ~
). Dies ist eine schlechte Idee, weil während docker build -t mytag .
Diese Meldung wird für lange Zeit angezeigt:
Kontext hochladen
Die Ursache ist der Docker-Daemon, der versucht, alle Dateien des Benutzers (sowohl das Home-Verzeichnis als auch dessen Unterverzeichnisse) zu kopieren. Vermeiden Sie dies, indem Sie immer ein Verzeichnis für die Docker-Datei angeben.
Das Hinzufügen einer .dockerignore
Datei zum Build-Verzeichnis ist eine gute Vorgehensweise . Die Syntax ähnelt den .gitignore
Dateien und stellt sicher, dass nur gewünschte Dateien und Verzeichnisse als Kontext des .gitignore
hochgeladen werden.
Eine einfache Dockerfile
FROM node:5
Die FROM
Anweisung gibt ein Bild an, von dem aus begonnen werden soll. Es kann eine beliebige gültige Bildreferenz verwendet werden.
WORKDIR /usr/src/app
Die WORKDIR
Direktive legt das aktuelle Arbeitsverzeichnis innerhalb des Containers fest. WORKDIR
entspricht der Ausführung von cd
im Container. (Hinweis: RUN cd
wird nicht das aktuelle Arbeitsverzeichnis geändert werden .)
RUN npm install cowsay knock-knock-jokes
RUN
führt den angegebenen Befehl innerhalb des Containers aus.
COPY cowsay-knockknock.js ./
COPY
kopiert die Datei oder das Verzeichnis in dem ersten Argumente vom Build - Kontext angegeben (der path
weitergegeben docker build path
) zu dem Ort in dem Behälter durch das zweite Argument spezifiziert.
CMD node cowsay-knockknock.js
CMD
gibt einen Befehl auszuführen , wenn das Bild ausgeführt und kein Befehl gegeben wird. Es kann überschrieben werden, indem ein Befehl an das docker run
.
Es gibt viele andere Anweisungen und Optionen. Eine vollständige Liste finden Sie in der Dockerfile-Referenz .
Unterschied zwischen ENTRYPOINT und CMD
Es gibt zwei Dockerfile
Direktiven, um anzugeben, welcher Befehl standardmäßig in erstellten Images ausgeführt werden soll. Wenn Sie nur CMD
angeben, führt Docker diesen Befehl mit der Standardeinstellung ENTRYPOINT
, ENTRYPOINT
/bin/sh -c
. Sie können entweder den Einstiegspunkt und / oder den Befehl überschreiben, wenn Sie das erstellte Image starten. Wenn Sie beides angeben, gibt ENTRYPOINT
die ausführbare Datei Ihres Containerprozesses an, und CMD
wird als Parameter dieser ausführbaren Datei angegeben.
Zum Beispiel, wenn Ihre Dockerfile
enthält
FROM ubuntu:16.04
CMD ["/bin/date"]
Dann verwenden Sie die Standard- ENTRYPOINT
Direktive von /bin/sh -c
und führen /bin/date
mit diesem Standard-Einstiegspunkt aus. Der Befehl Ihres Containerprozesses lautet /bin/sh -c /bin/date
. Sobald Sie dieses Bild ausgeführt haben, wird standardmäßig das aktuelle Datum gedruckt
$ docker build -t test .
$ docker run test
Tue Jul 19 10:37:43 UTC 2016
Sie können CMD
in der Befehlszeile überschreiben. In diesem Fall wird der von Ihnen angegebene Befehl ausgeführt.
$ docker run test /bin/hostname
bf0274ec8820
Wenn Sie eine ENTRYPOINT
Direktive angeben, verwendet Docker diese ausführbare Datei, und die CMD
Direktive gibt die Standardparameter des Befehls an. Wenn Ihre Dockerfile
enthält:
FROM ubuntu:16.04
ENTRYPOINT ["/bin/echo"]
CMD ["Hello"]
Dann wird es laufen
$ docker build -t test .
$ docker run test
Hello
Sie können andere Parameter angeben, wenn Sie möchten, aber alle laufen mit /bin/echo
$ docker run test Hi
Hi
Wenn Sie den in Ihrem Dockerfile aufgeführten Eingangspunkt überschreiben möchten (dh, wenn Sie einen anderen Befehl als das echo
in diesem Container ausführen möchten), müssen Sie den Parameter --entrypoint
in der Befehlszeile angeben:
$ docker run --entrypoint=/bin/hostname test
b2c70e74df18
Im Allgemeinen verwenden Sie die ENTRYPOINT
Direktive, um auf Ihre Hauptanwendung zu zeigen, die Sie ausführen möchten, und CMD
auf die Standardparameter.
Freilegen eines Ports in der Dockerfile
EXPOSE <port> [<port>...]
Aus der Dokumentation von Docker:
Die Anweisung
EXPOSE
informiert Docker darüber, dass der Container zur Laufzeit die angegebenen Netzwerkports abhört.EXPOSE
macht die Ports des Containers für den Host nicht zugänglich. Dazu müssen Sie entweder das-p
Flag zum Veröffentlichen eines-P
oder das-P
Flag zum Veröffentlichen aller freigelegten Ports verwenden. Sie können eine Portnummer freigeben und extern unter einer anderen Nummer veröffentlichen.
Beispiel:
In Ihrem Dockerfile:
EXPOSE 8765
Um auf diesen Port vom Host-Computer aus zuzugreifen, fügen Sie dieses Argument in Ihren docker run
Befehl ein:
-p 8765:8765
ENTRYPOINT und CMD werden als Verb und Parameter betrachtet
Angenommen, Sie haben eine Dockerfile, die mit endet
ENTRYPOINT [ "nethogs"] CMD ["wlan0"]
wenn Sie dieses Bild mit einem erstellen
docker built -t inspector .
Starten Sie das mit einer solchen Docker-Datei erstellte Image mit einem Befehl wie
docker run -it --net=host --rm inspector
wird das Interface mit dem Namen wlan0 überwacht
Wenn Sie nun die Schnittstelle eth0 (oder wlan1 oder ra1 ...) überwachen möchten, müssen Sie Folgendes tun
docker run -it --net=host --rm inspector eth0
oder
docker run -it --net=host --rm inspector wlan1
Pushing und Ziehen eines Bildes an Docker Hub oder eine andere Registry
Lokal erstellte Bilder können an Docker Hub oder einen anderen Docker-Repo-Host, der als Registrierung bezeichnet wird, übertragen werden. Verwenden Sie die docker login
, um sich bei einem vorhandenen Docker-Hub-Konto anzumelden.
docker login
Login with your Docker ID to push and pull images from Docker Hub.
If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: cjsimon
Password:
Login Succeeded
Durch Angabe eines Servernamens kann eine andere Docker-Registry verwendet werden. Dies funktioniert auch für private oder selbst gehostete Registries. Darüber hinaus ist die Verwendung eines externen Speichers für Berechtigungsnachweise zur Sicherheit möglich.
docker login quay.io
Sie können dann Bilder markieren und in die Registrierung verschieben, bei der Sie angemeldet sind. Ihr Repository muss als server/username/reponame:tag
. Das Auslassen des Servers ist standardmäßig auf Docker Hub festgelegt. (Die Standardregistrierung kann nicht in einen anderen Anbieter geändert werden, und es ist nicht geplant , diese Funktion zu implementieren.)
docker tag mynginx quay.io/cjsimon/mynginx:latest
Verschiedene Tags können verwendet werden, um verschiedene Versionen oder Zweige desselben Bildes darzustellen. Ein Bild mit mehreren verschiedenen Tags zeigt jedes Tag im selben Repo an.
Verwenden Sie docker images
, um eine Liste installierter Images anzuzeigen, die auf Ihrem lokalen Computer installiert sind, einschließlich des neu gekennzeichneten Images. Verwenden Sie dann Push, um es in die Registry hochzuladen, und ziehen Sie, um das Bild herunterzuladen.
docker push quay.io/cjsimon/mynginx:latest
Alle Tags eines Bildes können durch Angabe der Option -a
abgerufen werden
docker pull quay.io/cjsimon/mynginx:latest
Erstellen mit einem Proxy
Oft , wenn ein Bild Docker Gebäude enthält die Dockerfile Anweisungen , die Programme ausführt Ressourcen aus dem Internet zu holen ( wget
zum Beispiel ein Programm binären Build auf GitHub zum Beispiel ziehen).
Es ist möglich, Docker anzuweisen, festgelegte Umgebungsvariablen zu übergeben, damit solche Programme diese Abrufe über einen Proxy durchführen:
$ docker build --build-arg http_proxy=http://myproxy.example.com:3128 \
--build-arg https_proxy=http://myproxy.example.com:3128 \
--build-arg no_proxy=internal.example.com \
-t test .
build-arg
sind Umgebungsvariablen, die nur zur Erstellungszeit verfügbar sind.