Ce tutoriel vise à acquérir une expérience pratique de l'utilisation de ** Dockerfile ** sur ** Alibaba Cloud **.
Dockerfile HEALTHCHECK Cette section décrit comment utiliser HEALTH CHECK dans votre Dockerfile.
HEALTHCHECK vérifie automatiquement la santé du conteneur selon le calendrier spécifié.
HEALTHCHECK [OPTIONS] Commande CMD
Les options affichées avant CMD sont:
--interval=DURATION (default: 30s)
--timeout=DURATION (default: 30s)
--start-period=DURATION (default: 0s)
--retries=N (default: 3)
Dans ce tutoriel, ces délais sont très longs. Je veux le tester tout de suite pour voir si le chèque fonctionne.
Pour l'ajouter à votre Dockerfile
nano Dockerfile
FROM alpine:3.8
HEALTHCHECK --interval=3s --timeout=1s \
CMD curl -f http://localhost/ || exit 1
Important: notez que la commande curl -f http: // localhost / health check échoue toujours pour ce conteneur Alpine particulier.
Pour construire une image
docker build --tag tutorial:demo --file Dockerfile .
Commençons le conteneur et voyons le résultat.
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’
Une fois le conteneur démarré, exécutez docker ps -a à plusieurs reprises toutes les secondes (10 secondes) pour vérifier la progression de la vérification de l'état.
docker ps -a
Production attendue.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
27134771d5dd tutorial:demo "/bin/sh -c 'while t�" 3 seconds ago Up 1 second (health: starting)
Après 10 secondes, cela ressemblera à ceci:
docker ps -a
Production attendue.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
27134771d5dd tutorial:demo "/bin/sh -c 'while t�" 12 seconds ago Up 10 seconds (unhealthy) tutorial
(santé: démarrage) s'affiche pendant 10 secondes, mais comme la vérification est effectuée toutes les 3 secondes (--interval = 3s), --timeout = 1s est spécifié.
Réduisons cet intervalle à 1 seconde afin que nous puissions voir les résultats de santé plus rapidement.
Essayez également de réduire le nombre de tentatives par défaut de 3 à 1. --retries = 1
Vous utiliserez rarement retries = 1 dans un environnement PROD. 3 est une valeur beaucoup plus réaliste.
Pour l'ajouter à votre Dockerfile
nano Dockerfile
FROM alpine:3.8
HEALTHCHECK --interval=1s --timeout=1s --retries=1 \
CMD curl -f http://localhost/ || exit 1
Construisez l'image en utilisant.
docker build --tag tutorial:demo --file Dockerfile .
Commençons le conteneur et voyons le résultat.
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;
Notez que nous vérifions l'état du conteneur toutes les 0,4 secondes.
Production attendue.
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
Pendant 0,8 seconde, l'état de santé est (Health: Start).
L'état passe à (anormal) après 1 seconde.
C'est à vous, l'administrateur, de modifier ces paramètres en fonction de votre environnement de production réel.
--interval=DURATION (default: 30s)
--timeout=DURATION (default: 30s)
--start-period=DURATION (default: 0s)
--retries=N (default: 3)
En tant qu'administrateur, vous devez également déterminer la commande de vérification de l'état appropriée dans prod env. Les conteneurs de serveur Web, les conteneurs de base de données et les conteneurs plus performants ont tous des exigences de vérification de l'état différentes.
Je l'utilise ici pour un aperçu rapide de la façon dont l'état change.
Examinons un échantillon de vérifications d'état réussies pour voir à quoi ressemble votre état de santé.
Pour l'ajouter à votre Dockerfile
nano Dockerfile
FROM alpine:3.8
HEALTHCHECK --interval=.1s --timeout=.4s --retries=1\
CMD sleep .1 || exit 1
Construisez l'image en utilisant.
docker build --tag tutorial:demo --file Dockerfile .
Commençons le conteneur et voyons le résultat.
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;
Production attendue.
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 dort normalement pendant un dixième de seconde, après quoi il renvoie un code de retour d'état.
Malheureusement, le filtre d'état de la commande docker ps -a ne correspond pas aux conteneurs par état d'intégrité. Seuls les éléments créés, redémarrés, exécutés, supprimés, mis en pause, sortis, morts peuvent être filtrés.
Impossible d'exécuter: docker ps --filter status = sain
Impossible d'exécuter: docker ps --filter status = malsain
au dessous de docker ps -a | grep '(healthy)' Et docker ps -a | grep '(unhealthy)' Doit être utilisé.
Dockerfile EXPOSE Ports Dans cette section, vous apprendrez comment Dockerfile expose le port du conteneur à l'aide de EXPOSE.
Un conteneur est un processus d'exécution isolé. Le conteneur doit spécifier explicitement les ports auxquels les autres conteneurs peuvent accéder.
Un port est le moyen officiel pour un processus de contacter d'autres processus et d'envoyer des commandes.
Par exemple, le port Apache 80 est généralement ouvert. Apache est isolé et caché dans un conteneur. La seule façon de faire quelque chose est d'y accéder via le port 80.
L'instruction EXPOSE déclare le port sur lequel le conteneur écoute.
Vous pouvez spécifier si le port est TCP ou UDP. La valeur par défaut est TCP si aucun protocole n'est spécifié.
L'instruction EXPOSE n'expose pas réellement le port.
EXPOSE sert uniquement de document. Ceci déclare quel port dans le conteneur est destiné à être ouvert au public.
Depuis https://docs.docker.com/engine/reference/builder/#expose
Pour exposer réellement les ports lorsque le conteneur s'exécute, utilisez l'indicateur -p dans docker run pour exposer et mapper un ou plusieurs ports, ou utilisez l'indicateur -p pour exposer tous les ports exposés. Publiez et mappez vers des ports d'ordre supérieur.
Par défaut, expose attend TCP. Vous pouvez également spécifier UDP.
EXPOSE 80/tcp
EXPOSE 80/UDP
Ce tutoriel expose les ports 80, tcp et udp.
Modifiez le Dockerfile comme suit.
nano Dockerfile
FROM alpine:3.8
EXPOSE 80/tcp
EXPOSE 80/udp
Construisez l'image en utilisant.
docker build --tag tutorial:demo --file Dockerfile .
Commençons le conteneur et voyons le résultat.
docker run -ti -d --name tutorial tutorial:demo /bin/sh -c 'while true; do sleep 60; done'
Production attendue
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
La colonne des ports affiche les ports publics, mais ils ne sont pas disponibles. Vous devez les publier. Publiez à l'aide de la commande d'exécution du docker -p 30000: 80 / tcp.
-p 30000:80/tcp
30000 spécifie le numéro de port de l'hôte. 80 / tcp spécifie le numéro de port du conteneur.
Créons un conteneur et voyons le résultat.
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'\'''
Production attendue.
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
Le port 30000 sur l'hôte local est mappé au port 80 sur le conteneur.
Vous pouvez maintenant voir que le port 30000 est ouvert sur l'hôte.
La commande ss est utilisée pour afficher des informations sur les sockets. La commande ss est utilisée pour afficher les informations de socket. (La commande netstat n'existe plus dans l'installation par défaut de CentOS. Utilisez plutôt la commande service.)
ss -t -a -n
Versions courtes et longues en option.
1, -t, --tcp n'affiche que les sockets TCP. 2, -a, --all Afficher toutes les sockets. 3, -n, --numeric ne résolvent pas le nom du service, le numéro de port est donc affiché numériquement.
Production attendue
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 :::*
Vous pouvez voir que le port 30000 écoute sur l'hôte.
30000 n'a pas de signification particulière. Il n'est utilisé ici que comme numéro de port facile à trouver.
Publions également le port 80 udp. Essayez de l'exécuter.
docker stop -t 0 tutorial; ; docker container prune -f
docker run -p 40080:80/udp 30000:80/tcp -
Vérifiez si la publication a réussi.
ss -u -a -n
Production attendue
State Recv-Q Send-Q Local Address:Port Peer Address:Port
UNCONN 0 0 :::40080 :::*
Cette fois, j'ai remarqué que j'utilisais l'argument -u pour afficher le port udp.
Vous pouvez utiliser des variables d'environnement pour envoyer des valeurs à un conteneur en cours d'exécution.
Les variables d'environnement font partie de l'environnement dans lequel le conteneur fonctionne. La syntaxe est la suivante:
syntaxe: ENV
ENV =
L'instruction ENV définit une valeur dans une variable d'environnement.
Par exemple
ENV myVar1=1
ENV myVar42=42
ENV myAlfaVar=alfa value abc
Jetons un coup d'œil à la variable env dans env en utilisant notre petite distribution Alpine Linux.
Créez un Dockerfile avec ce contenu.
FROM alpine:3.8
ENV myVar1 1
ENV my42 42
ENV myVar42=42
ENV myAlfaVar='alfa abc'
Notez que nous utilisons deux méthodes pour déclarer la variable env.
Pour construire une image
docker build --tag tutorial:demo --file Dockerfile .
Exécution:
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
Entrez la commande printenv à # (invite).
Production attendue
/ # 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
Toutes les variables env déclarées sont là.
Vous pouvez remplacer la variable env lors de l'utilisation de docker run.
Exécution:
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'
Si vous entrez maintenant dans le conteneur, vous pouvez voir que my42 vaut 44000.
docker exec -it tutorial /bin/sh
Production attendue
/ # 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=/
Vous avez maintenant une expérience pratique de la déclaration de variables ENV dans votre Dockerfile et de la substitution des variables ENV avec docker run -e'my-env-var-name = new value '.
Vous pouvez également utiliser printenv pour inspecter le contenu de la variable env. (Vous pouvez également utiliser set ou env pour afficher la variable env à l'invite du shell)
Pour plus de détails, voir https://en.wikipedia.org/wiki/Environment_variable
https://docs.docker.com/engine/reference/builder/#env
https://docs.docker.com/engine/reference/builder/#environment-replacement
Ceci conclut la partie 2 sur 4: Vous pouvez voir les instructions pour tous les Dockerfiles. Pour plus d'informations, lisez Partie 3 S'il te plait donne moi.
Recommended Posts