Docker : l'essentiel

Monter un volume de données persistant (option –volume)

Exemple

# Persister les données du conteneur sur l'hôte
docker run -it -v /host-data:/data ubuntu

Exercice

Créer un conteneur ubuntu qui monte le répertoire /etc de l’hôte dans /hack/etc.

  1. Exécutez la commande suivante pour lancer un conteneur Ubuntu en montant le répertoire /etc de l’hôte :

    docker run -it -v /etc:/hack/etc ubuntu
  2. Vérifiez l’accès aux fichiers /etc de l’hôte depuis l’intérieur du conteneur en listant les fichiers du répertoire /hack/etc :

    ls /hack/etc
  3. Vous devriez voir les fichiers et répertoires présents dans /etc de l’hôte.

Publier un port réseau (option –publish)

Exemple

# Mapper le port 80 du conteneur au port 8080 de l'hôte
docker run -it -p 8080:80 ubuntu netcat -l -p 80

Exercice

Créer un conteneur ubuntu qui exécute netcat -l -p 80 et expose le port 808<ID> sur l’hôte.

  1. Remplacez <ID> par un numéro unique (par exemple 1 si vous êtes k8s1) et lancer un conteneur Ubuntu avec Netcat :

    Solution
    docker run --name "netcat<ID>" -d -p 808<ID>:80 -- \
    ubuntu sh -c "apt-get update && apt-get -y install netcat-traditional && echo 'Run netcat' && netcat -l -p 80"
  2. Vérifiez que le conteneur est en cours d’exécution :

    Solution
    docker ps
  3. Testez la connexion depuis l’hôte en utilisant Netcat :

    Solution
    netcat localhost 808<ID>
  4. Si la connexion est établie, tapez quelque chose dans le terminal et vous devriez voir la même chose dans le conteneur (vous pouvez vérifier les logs avec docker logs netcat).

Remarque

Utilisez CtrlẐ puis bg pour mettre la commande netcat précédente en tâche de fond.

Cas pratique

Partie 1: Exécuter un conteneur

  1. Démarrez un conteneur nommé mariadbtest avec le mot de passe root pour MySQL défini sur mypass :

    Solution
    docker run --name mariadbtest<ID> -e MYSQL_ROOT_PASSWORD=mypass -d mariadb
  2. Vérifiez que le conteneur est en cours d’exécution :

    Solution
    docker ps
  3. Optionnellement, vous pouvez ajouter des options pour mysqld comme indiqué dans l’exemple ci-dessous.

    Solution
    docker run --name mariadbtest<ID> -e MYSQL_ROOT_PASSWORD=mypass -d mariadb --log-bin --binlog-format=MIXED

Partie 2: Accéder interactivement à un conteneur

  1. Accédez au conteneur mariadbtest via bash :

    Solution
    docker exec -it mariadbtest bash
  2. Mettez à jour les paquets et installez vim :

    Solution
    apt-get update && apt-get install vim
  3. Vérifiez que vim est installé en tapant vim dans le terminal du conteneur.

Partie 3: Créer une image de conteneur pour exécuter un serveur web python

Création de l’image

Allez dans le répertoire de l’exercice :

git clone https://github.com/k8s-school/k8s-school
cd k8s-school/labs/0_docker/webserver

Trouvez la commande pour construire le conteneur et le taguer avec le label webserver<ID>.

  1. Construisez le conteneur et taguez-le avec le label webserver<ID> (remplacez <ID> par un numéro unique) :

    Solution
    docker build --tag=webserver<ID> .
  2. Utilisez l’exemple de Dockerfile dans le répertoire actuel et mettez-le à jour petit à petit en démarrant par le haut du fichier.

    Solution
    # Utiliser ubuntu comme image de base, elle sera téléchargée automatiquement
    FROM ubuntu:latest
    LABEL org.opencontainers.image.authors "fabrice.jammes@gmail.com"
    
    # Mettre à jour et installer les dépendances système
    RUN apt-get update && apt-get install -y python3
    RUN mkdir -p /home/www
    WORKDIR /home/www
    # Les commandes ci-dessous seront toutes exécutées dans WORKDIR
    
    # Lancer la commande ci-dessous au démarrage du conteneur
    # Elle servira les fichiers situés là où elle a été lancée
    # donc /home/www
    CMD python3 /home/src/hello.py
    
    # Ajouter un fichier local à l'intérieur du conteneur
    # le code peut également être récupéré à partir d'un dépôt git
    COPY index.html /home/www/index.html
    
    # Cette commande est la dernière, donc si hello.py est modifié
    # seule cette couche du conteneur sera modifiée.
    COPY hello.py /home/src/hello.py

Exécution du conteneur

Analyser le programme python hello.py à l’intérieur du conteneur pour trouver le port à exporter.

  1. Lancer le conteneur en tant que daemon et publier le port 800 sur l’hôte :

    Solution
    docker run -d --name k8s<ID>_www -t -p 800<ID>:8000 webserver<ID>
  2. Vérifiez que le conteneur est en cours d’exécution et accédez au site web

    Solution
    docker ps
    curl http://localhost:800<ID>
  3. Supprimez le conteneur :

    Solution
    docker rm -f k8s<ID>_www
  4. Lancez le conteneur en tant que daemon, publiez le port 800 sur l’hôte, et utilisez le fichier html stocké sur la machine hôte :

    Solution
    docker run --name k8s<ID>_www_data -d -p 800<ID>:8000 -v $HOME/k8s-school/labs/0_docker/www:/home/www webserver<ID>
  5. Vérifiez que le conteneur est en cours d’exécution et que le fichier HTML est servi correctement.

    Solution
    # Editer le fichier $PWD/www/index.html
    docker ps
    curl http://localhost:800<ID>