Docker-Datei: Installieren Sie Docker auf einem Linux-Server

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.

ENV-Variable in Dockerfile

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

Docker-Datei: Installieren Sie Docker auf einem Linux-Server
Installieren Sie die neueste Version von Git auf Ihrem Linux-Server
Installieren und konfigurieren Sie den TigerVNC-Server unter Linux
5 Gründe, Linux auf Ihrem Laptop zu installieren.
Installieren Sie Docker auf Fedora31
Installieren Sie Docker unter AWS
Installieren Sie Python 3.6 auf Docker
Installieren Sie Python3 und Django unter Amazon Linux (EC2) und führen Sie den Webserver aus
Installieren Sie Minecraft unter Arch Linux
Installieren Sie JDK unter Linux
Installieren Sie numba auf dem Mac
Installieren Sie Django auf dem Mac
Installieren Sie tomcat 5.5 unter Amazon Linux.
Installieren Sie Docker unter Arch Linux und führen Sie es remote aus
Installieren von Homebrew unter Amazon Linux 2
Installieren Sie Docker unter WSL Ubuntu 18.04
Installieren Sie Python Pillow unter Amazon Linux
Installieren Sie Python 3 auf dem Sakura-Server (FreeBSD)
Himbeer Pi 4 Centos7 auf Docker installieren
Installieren Sie Oracle Java8 unter Amazon Linux2
Installieren Sie Arch Linux auf DeskMini A300
Abschluss des Docker-Befehls unter Linux
Führen Sie einen Linux-Server mit GCP aus
So installieren Sie VMware-Tools unter Linux
[Linux] Aufbau einer Docker-Umgebung auf Redhat
[Hinweis] Installieren Sie Imagick unter Amzon Linux2
Ich werde Ruby auf EC2 (Amazon Linux2) 2020 installieren
Installieren Sie scipy unter Linux ohne Internetverbindung
So installieren Sie das aws-session-manager-Plugin unter Manajro Linux
Installieren Sie wsl2 und Master Linux unter Windows
Erstellen Sie einen NFS-Server unter Arch Linux
Erstellen Sie einen einfachen WebDAV-Server unter Linux
Erstellen Sie einen CGI-Server, der unter Python 3 in Docker ausgeführt wird
Installieren und starten Sie k3s unter Manjaro Linux
So installieren Sie Pakete unter Alpine Linux
Erstellen Sie einen Samba-Server unter Arch Linux
Lassen Sie uns einen WEB-Server mit Chromebook einrichten
Wie installiere ich php7.4 unter Linux (Ubuntu)
Installieren Sie Python3 auf dem Mixhost-Server [Derzeit NG]
Installieren Sie rJava unter Linux in der R3.6-Umgebung.
Bis Sie Arch Linux auf VMware installieren
Installieren Sie Python 3.8, Pip 3.8 auf EC2 (Amazon Linux 2)
Linux-Fehlerbehebung "Install on / dev / sda"
Erstellen Sie eine LAMP-Umgebung auf Ihrem lokalen Docker
Installieren Sie Linux Debian auf der Registerkarte Pfeile Q584 / H.
Pykintone auf Docker
[Hinweis] Installieren Sie wxPython 3.x unter Linux Mint (Ubuntu)
Linux Server Befehl
So installieren Sie Camunda Modeler unter Manjaro Linux
Installieren Sie PHP der 7er-Serie unter Amazon Linux 2 mit Amazon Linux Extras
Installieren Sie die 64-Bit-Version von Ubuntu 20.04 LTS (Server) auf RaspberryPi3B +