Dieses Tutorial konzentriert sich darauf, praktische Erfahrungen mit der Verwendung von ** Dockerfile ** in ** Alibaba Cloud ** zu sammeln.
Dockerfile HEALTHCHECK In diesem Abschnitt wird beschrieben, wie Sie HEALTH CHECK in Ihrer Docker-Datei verwenden.
HEALTHCHECK überprüft automatisch den Zustand des Containers gemäß dem angegebenen Zeitplan.
HEALTHCHECK [OPTIONS] CMD-Befehl
Die vor CMD angezeigten Optionen sind:
--interval=DURATION (default: 30s)
--timeout=DURATION (default: 30s)
--start-period=DURATION (default: 0s)
--retries=N (default: 3)
In diesem Tutorial sind diese Zeiten sehr lang. Ich möchte es sofort testen, um zu sehen, ob die Prüfung funktioniert.
So fügen Sie dies Ihrer Docker-Datei hinzu
nano Dockerfile
FROM alpine:3.8
HEALTHCHECK --interval=3s --timeout=1s \
CMD curl -f http://localhost/ || exit 1
Wichtig: Beachten Sie, dass der Befehl curl -f http: // localhost / health check für diesen bestimmten alpinen Container immer fehlschlägt.
Ein Bild erstellen
docker build --tag tutorial:demo --file Dockerfile .
Lassen Sie uns den Container starten und das Ergebnis sehen.
docker stop -t 0 tutorial ; docker container prune -f
docker run -ti -d --name tutorial tutorial:demo /bin/sh -c 'while true; do sleep 60; done’
Führen Sie nach dem Start des Containers Docker ps -a wiederholt jede Sekunde (10 Sekunden) aus, um den Fortschritt der Integritätsprüfung anzuzeigen.
docker ps -a
Erwartete Ausgabe.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
27134771d5dd tutorial:demo "/bin/sh -c 'while t�" 3 seconds ago Up 1 second (health: starting)
Nach 10 Sekunden sieht es so aus:
docker ps -a
Erwartete Ausgabe.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
27134771d5dd tutorial:demo "/bin/sh -c 'while t�" 12 seconds ago Up 10 seconds (unhealthy) tutorial
(Gesundheit: Start) wird 10 Sekunden lang angezeigt. Da die Überprüfung jedoch alle 3 Sekunden erfolgt (--interval = 3s), wird --timeout = 1s angegeben.
Reduzieren wir dieses Intervall auf 1 Sekunde, damit wir die Gesundheitsergebnisse schneller sehen können.
Versuchen Sie außerdem, die Anzahl der Wiederholungsversuche von 3 auf 1 zu reduzieren. - Wiederholungen = 1
In einer PROD-Umgebung werden Sie selten Wiederholungsversuche = 1 verwenden. 3 ist ein viel realistischerer Wert.
So fügen Sie dies Ihrer Docker-Datei hinzu
nano Dockerfile
FROM alpine:3.8
HEALTHCHECK --interval=1s --timeout=1s --retries=1 \
CMD curl -f http://localhost/ || exit 1
Erstellen Sie das Bild mit.
docker build --tag tutorial:demo --file Dockerfile .
Lassen Sie uns den Container starten und das Ergebnis sehen.
docker stop -t 0 tutorial ; docker container prune -f
docker run -ti -d --name tutorial tutorial:demo /bin/sh -c 'while true; do sleep 60; done';docker ps -a; sleep .4; docker ps -a; sleep .4; docker ps -a; sleep .4; docker ps -a; sleep .4;
Beachten Sie, dass wir den Status des Containers alle 0,4 Sekunden überprüfen.
Erwartete Ausgabe.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1e83c476c2ee tutorial:demo "/bin/sh -c 'while t�" 1 second ago Up Less than a second (health: starting) tutorial
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1e83c476c2ee tutorial:demo "/bin/sh -c 'while t�" 2 seconds ago Up Less than a second (health: starting) tutorial
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1e83c476c2ee tutorial:demo "/bin/sh -c 'while t�" 2 seconds ago Up 1 second (unhealthy) tutorial
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1e83c476c2ee tutorial:demo "/bin/sh -c 'while t�" 3 seconds ago Up 1 second (unhealthy) tutorial
Für 0,8 Sekunden ist der Gesundheitszustand (Gesundheit: Start).
Der Status ändert sich nach 1 Sekunde in (abnormal).
Es liegt an Ihnen, dem Administrator, diese Einstellungen an Ihre tatsächliche Produktumgebung anzupassen.
--interval=DURATION (default: 30s)
--timeout=DURATION (default: 30s)
--start-period=DURATION (default: 0s)
--retries=N (default: 3)
Als Administrator müssen Sie auch den entsprechenden Integritätsprüfungsbefehl in prod env ermitteln. Für Webserver-Container, Datenbank-Container und glücklichere Container gelten unterschiedliche Anforderungen an die Integritätsprüfung.
Ich benutze es hier, um einen schnellen Überblick darüber zu erhalten, wie sich der Status ändert.
Lassen Sie uns eine Stichprobe erfolgreicher Gesundheitsprüfungen durchführen, um festzustellen, wie Ihre Gesundheit aussieht.
So fügen Sie dies Ihrer Docker-Datei hinzu
nano Dockerfile
FROM alpine:3.8
HEALTHCHECK --interval=.1s --timeout=.4s --retries=1\
CMD sleep .1 || exit 1
Erstellen Sie das Bild mit.
docker build --tag tutorial:demo --file Dockerfile .
Lassen Sie uns den Container starten und das Ergebnis sehen.
docker stop -t 0 tutorial ; docker container prune -f
docker run -ti -d --name tutorial tutorial:demo /bin/sh -c 'while true; do sleep 60; done';docker ps -a; sleep .4; docker ps -a; sleep .4; docker ps -a; sleep .4; docker ps -a; sleep .4;
Erwartete Ausgabe.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c83552f66511 tutorial:demo "/bin/sh -c 'while t�" 1 second ago Up Less than a second (health: starting) tutorial
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c83552f66511 tutorial:demo "/bin/sh -c 'while t�" 2 seconds ago Up Less than a second (healthy) tutorial
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c83552f66511 tutorial:demo "/bin/sh -c 'while t�" 2 seconds ago Up 1 second (healthy) tutorial
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c83552f66511 tutorial:demo "/bin/sh -c 'while t�" 3 seconds ago Up 2 seconds (healthy) tutorial
sleep .1 schläft normalerweise eine Zehntelsekunde lang und gibt danach einen Statusrückgabecode zurück.
Leider stimmt der Statusfilter des Docker-Befehls ps -a nicht mit Containern nach Integritätsstatus überein. Nur erstellt, neu gestartet, ausgeführt, entfernt, angehalten, beendet, tot kann gefiltert werden.
Kann nicht ausgeführt werden: Docker ps - Filterstatus = fehlerfrei
Kann nicht ausgeführt werden: Docker ps --filter status = ungesund
unten docker ps -a | grep '(healthy)' Und docker ps -a | grep '(unhealthy)' Muss benutzt werden.
Dockerfile EXPOSE Ports In diesem Abschnitt erfahren Sie, wie die Docker-Datei den Port des Containers mithilfe von EXPOSE verfügbar macht.
Ein Container ist ein isolierter Ausführungsprozess. Der Container muss explizit die Ports angeben, auf die andere Container zugreifen können.
Ein Port ist die offizielle Möglichkeit für einen Prozess, andere Prozesse zu kontaktieren und Befehle zu senden.
Beispielsweise ist der Apache-Port 80 normalerweise geöffnet. Apache ist isoliert und in einem Container versteckt. Die einzige Möglichkeit, etwas zu tun, besteht darin, über Port 80 darauf zuzugreifen.
Der Befehl EXPOSE deklariert den Port, an dem der Container lauscht.
Sie können angeben, ob der Port TCP oder UDP ist. Der Standardwert ist TCP, wenn kein Protokoll angegeben ist.
Der EXPOSE-Befehl macht den Port nicht verfügbar.
EXPOSE dient nur als Dokument. Dies gibt an, welcher Port im Container für die Öffentlichkeit zugänglich sein soll.
Von https://docs.docker.com/engine/reference/builder/#expose
Um die Ports beim Ausführen des Containers tatsächlich verfügbar zu machen, verwenden Sie das Flag -p im Docker-Lauf, um einen oder mehrere Ports verfügbar zu machen und zuzuordnen, oder verwenden Sie das Flag -p, um alle exponierten Ports verfügbar zu machen. Veröffentlichen und Ports höherer Ordnung zuordnen.
Standardmäßig erwartet Expose TCP. Sie können auch UDP angeben.
EXPOSE 80/tcp
EXPOSE 80/UDP
In diesem Tutorial werden die Ports 80, tcp und udp verfügbar gemacht.
Bearbeiten Sie die Docker-Datei wie folgt.
nano Dockerfile
FROM alpine:3.8
EXPOSE 80/tcp
EXPOSE 80/udp
Erstellen Sie das Bild mit.
docker build --tag tutorial:demo --file Dockerfile .
Lassen Sie uns den Container starten und das Ergebnis sehen.
docker run -ti -d --name tutorial tutorial:demo /bin/sh -c 'while true; do sleep 60; done'
Erwartete Ausgabe
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6269a988e1dd tutorial:demo "/bin/sh -c 'while t�" 1 second ago Up Less than a second (health: starting) 80/tcp, 80/udp tutorial
In der Spalte "Ports" werden die öffentlichen Ports angezeigt, sie sind jedoch nicht verfügbar. Sie müssen sie veröffentlichen. Veröffentlichen Sie mit dem Docker-Ausführungsbefehl -p 30000: 80 / tcp.
-p 30000:80/tcp
30000 gibt die Portnummer des Hosts an. 80 / tcp gibt die Portnummer des Containers an.
Lassen Sie uns einen Container erstellen und das Ergebnis sehen.
docker stop -t 0 tutorial; ; docker container prune -f
docker run -p 30000:80/tcp -ti -d --name tutorial tutorial:demo /bin/sh -c '\''while true; do sleep 60; done'\'''
Erwartete Ausgabe.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8b3e43916708 tutorial:demo "/bin/sh -c 'while t�" 1 second ago Up Less than a second 0.0.0.0:30000->80/tcp, 80/udp tutorial
0.0.0.0.0:30000->80/tcp
Port 30000 auf localhost ist Port 80 auf dem Container zugeordnet.
Sie können jetzt sehen, dass Port 30000 auf dem Host geöffnet ist.
Mit dem Befehl ss werden Informationen zu Sockets angezeigt. Der Befehl ss wird verwendet, um Socket-Informationen anzuzeigen. (Der Befehl netstat ist in der Standardinstallation von CentOS nicht mehr vorhanden. Verwenden Sie stattdessen den Befehl service.)
ss -t -a -n
Optionale kurze und lange Versionen.
1, -t, --tcp zeigen nur TCP-Sockets an. 2, -a, --all Alle Steckdosen anzeigen. 3, -n, --numeric lösen den Dienstnamen nicht auf, daher wird die Portnummer numerisch angezeigt.
Erwartete Ausgabe
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
ESTAB 0 0 192.168.56.44:22 192.168.56.11:4118
ESTAB 0 64 192.168.56.44:22 192.168.56.11:2719
LISTEN 0 128 :::30000 :::*
LISTEN 0 128 :::22 :::*
Sie können sehen, dass Port 30000 den Host überwacht.
30000 hat keine besondere Bedeutung. Es wird hier nur als leicht zu findende Portnummer verwendet.
Lassen Sie uns auch udp port 80 veröffentlichen. Versuchen Sie es auszuführen.
docker stop -t 0 tutorial; ; docker container prune -f
docker run -p 40080:80/udp 30000:80/tcp -
Überprüfen Sie, ob die Veröffentlichung erfolgreich war.
ss -u -a -n
Erwartete Ausgabe
State Recv-Q Send-Q Local Address:Port Peer Address:Port
UNCONN 0 0 :::40080 :::*
Diesmal bemerkte ich, dass ich das Argument -u verwendete, um den udp-Port anzuzeigen.
Sie können Umgebungsvariablen verwenden, um Werte an einen laufenden Container zu senden.
Umgebungsvariablen sind Teil der Umgebung, in der der Container betrieben wird. Die Syntax lautet wie folgt:
Syntax: ENV
ENV =
Der ENV-Befehl legt den Wert der Umgebungsvariablen fest.
Zum Beispiel
ENV myVar1=1
ENV myVar42=42
ENV myAlfaVar=alfa value abc
Schauen wir uns die env-Variable in env mit unserer kleinen Alpine Linux-Distribution an.
Erstellen Sie eine Docker-Datei mit diesem Inhalt.
FROM alpine:3.8
ENV myVar1 1
ENV my42 42
ENV myVar42=42
ENV myAlfaVar='alfa abc'
Beachten Sie, dass wir zwei Methoden verwenden, um die env-Variable zu deklarieren.
Ein Bild erstellen
docker build --tag tutorial:demo --file Dockerfile .
Ausführung:
docker stop -t 0 tutorial ; docker container prune -f
docker run -ti -d --name tutorial tutorial:demo /bin/sh -c 'while true; do sleep 60; done'
docker exec -it tutorial /bin/sh
Geben Sie den Befehl printenv unter # (Eingabeaufforderung) ein.
Erwartete Ausgabe
/ # printenv
HOSTNAME=1314796592cf
SHLVL=1
HOME=/root
my42=42
TERM=xterm
myVar1=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
myAlfaVar=alfa abc
myVar42=42
PWD=/
/ # exit
Alle deklarierten env-Variablen sind vorhanden.
Sie können die env-Variable überschreiben, wenn Sie Docker Run verwenden.
Ausführung:
docker stop -t 0 tutorial ; docker container prune -f
docker run -e 'my42=44000' -ti -d --name tutorial tutorial:demo /bin/sh -c 'while true; do sleep 60; done'
Wenn Sie jetzt den Container betreten, können Sie sehen, dass my42 44000 ist.
docker exec -it tutorial /bin/sh
Erwartete Ausgabe
/ # printenv
HOSTNAME=1190753a779e
SHLVL=1
HOME=/root
my42=44000
TERM=xterm
myVar1=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
myAlfaVar=alfa abc
myVar42=42
PWD=/
Jetzt haben Sie praktische Erfahrungen mit dem Deklarieren von ENV-Variablen in Ihrer Docker-Datei und dem Überschreiben von ENV-Variablen mit dem Docker run -e'my-env-var-name = new value '.
Sie können printenv auch verwenden, um den Inhalt der env-Variablen zu überprüfen. (Sie können auch set oder env verwenden, um die env-Variable an der Shell-Eingabeaufforderung anzuzeigen.)
Weitere Informationen finden Sie unter https://en.wikipedia.org/wiki/Environment_variable
https://docs.docker.com/engine/reference/builder/#env
https://docs.docker.com/engine/reference/builder/#environment-replacement
Damit ist Teil 2 von 4 abgeschlossen: Sie können die Anweisungen für alle Docker-Dateien sehen. Weitere Informationen finden Sie unter Teil 3. Bitte gib mir.
Recommended Posts