Dockerfile: installer Docker sur un serveur Linux

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.

Variable ENV dans Dockerfile

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

Dockerfile: installer Docker sur un serveur Linux
Installez la dernière version de Git sur votre serveur Linux
Installer et configurer le serveur TigerVNC sous Linux
5 raisons d'installer Linux sur votre ordinateur portable.
Installer docker sur Fedora31
Installez Docker sur AWS
Installez Python 3.6 sur Docker
Installez Python3 et Django sur Amazon Linux (EC2) et exécutez le serveur Web
Installez Minecraft sur Arch Linux
Installez JDK sur Linux
Installez numba sur Mac
Installez Django sur Mac
Installez tomcat 5.5 sur Amazon Linux.
Installez Docker sur Arch Linux et exécutez-le à distance
Installation de Homebrew sur Amazon Linux 2
Installer Docker sur WSL Ubuntu 18.04
Installez Python Pillow sur Amazon Linux
Installez Python 3 sur le serveur Sakura (FreeBSD)
raspberry pi 4 centos7 installer sur docker
Installer Oracle Java8 sur Amazon Linux2
Installez Arch Linux sur DeskMini A300
Achèvement de la commande docker sous Linux
Exécutez un serveur Linux avec GCP
Comment installer VMware-Tools sur Linux
[Linux] Construction de l'environnement Docker sur Redhat
[Note] Installez Imagick sur Amzon Linux2
J'installe Ruby sur EC2 (Amazon Linux2) 2020
Installez scipy sur Linux sans connexion Internet
Comment installer aws-session-manager-plugin sur Manajro Linux
Installez wsl2 et master linux sous Windows
Créer un serveur NFS sur Arch Linux
Construisez un serveur WebDAV simple sur Linux
Créer un serveur CGI fonctionnant sur Python 3 sur Docker
Installer et lancer k3s sur Manjaro Linux
Comment installer des packages sur Alpine Linux
Construire un serveur Samba sur Arch Linux
Configurons un serveur WEB avec Chromebook
Comment installer php7.4 sur Linux (Ubuntu)
Installer Python3 sur le serveur mixhost [Actuellement NG]
Installez rJava sur Linux dans un environnement R3.6.
Jusqu'à ce que vous installiez Arch Linux sur VMware
Installez Python 3.8, Pip 3.8 sur EC2 (Amazon Linux 2)
Résolution de l'erreur Linux «Install on / dev / sda»
Créez un environnement LAMP sur votre Docker local
Installer Linux Debian sur l'onglet Flèches Q584 / H
pykintone sur Docker
[Note] Installez wxPython 3.x sur Linux Mint (Ubuntu)
Commande de serveur Linux
Comment installer Camunda Modeler sur Manjaro Linux
Installez PHP série 7 sur Amazon Linux 2 avec Amazon Linux Extras
Installez la version 64 bits d'Ubuntu 20.04 LTS (serveur) sur RaspberryPi3B +