Part I

Isolation

Le plus simple moyen d’avoir une isolation face aux autres containers et de cette manière d’avoir un surplus sécurité, c’est de créer et utiliser des réseaux différents.

Créer un nouveau réseau :

sudo docker network create rezo1
sudo docker network ls

NETWORK ID     NAME      DRIVER    SCOPE
a5b9a1511100   bridge    bridge    local
0b9cb0189f4f   host      host      local
28409b71080e   none      null      local
14dedd566c0a   rezo1     bridge    local

Créer un container qui va utiliser ce nouveau réseau :

sudo docker container run -it --name centos01 --network rezo1 centos bash

Créer un container sur le réseau hôte :

sudo docker container run -it --name centos02 centos bash

Nous pouvons voir que les machines sont sur des réseaux différentes :

Le ping ne passe pas :

Reconfigurations reseaux

Si nous voulons connecter les machines ?

sudo docker container ls -a

CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS                      PORTS     NAMES
59dd751da7cd   centos    "bash"    12 minutes ago   Exited (1) 42 seconds ago             centos02
4db041e47947   centos    "bash"    14 minutes ago   Up 14 minutes                         centos01

sudo docker network connect rezo1 59dd751da7cd
sudo docker container start -i 59d

Nous pouvons faire cette opération sans arrêter le container:

sudo docker network create rezo2
sudo docker network connect rezo2 59dd

Inspecter les réseaux :

sudo docker network inspect rezo1

Effacer un réseau :

sudo docker network rm rezo2

Volumes

Les volumes permettent la gestion data entre les containers et entre la machine hôte et enter elles.

# Lister les volumes:
sudo docker volume ls

# Creer un noveau volume
sudo docker volume create monvolume

# Attacher le volume a une container (donner un point montage en /etc/volume1):
sudo docker container run --name centos1 -ti --volume monvolume1:/etc/volume1 centos bash

# Atacher le meme volume sur un autre container :
sudo docker container run --name centos2 -ti --volume monvolume1:/etc/volume1

Nous pouvons accéder les donnes sur le volume depuis l’hôte :

sudo docker volume inspect monvolume1
[
    {
        "CreatedAt": "2023-02-10T08:59:36Z",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/monvolume1/_data",
        "Name": "monvolume1",
        "Options": null,
        "Scope": "local"
    }
]

sudo ls -ahl /var/lib/docker/volumes/monvolume1/_data
total 12K
drwxr-xr-x 2 root root 4.0K Feb 10 09:02 .
drwx-----x 3 root root 4.0K Feb 10 08:59 ..
-rw-r--r-- 1 root root   17 Feb 10 09:05 fichier

sudo cat /var/lib/docker/volumes/monvolume1/_data/fichier
centos1 was here

Partager un directeur depuis la machine hôte :

# effacer les containers anciens
sudo docker container rm 97 98 59 4d

# create un noveau container qui partage le director home:
sudo docker container run --name centos1 -ti --volume /home/ubuntu/:/tmp/shared/ centos bash

Fonctions complémentaires

Nous pouvons créer des conteneurs qui roulent comme tache de fond

# L'option ajoute c'est -d = daemon service linux
sudo docker container run -d -ti -p8888:7777 python:2 python -m  SimpleHTTPserver 7777

Creer un dummy container :

# Creer un processus active dans le container 
sudo docker container run --name centos2 -d centos tail -f

# Lister les processus active
sudo docker ps
CONTAINER ID   IMAGE      COMMAND                  CREATED          STATUS          PORTS                                       NAMES
68572b8ba94f   centos     "tail -f"                11 seconds ago   Up 11 seconds                                               centos2
6a9bcf65708b   python:2   "python -m SimpleHTT…"   3 minutes ago    Up 3 minutes    0.0.0.0:8888->7777/tcp, :::8888->7777/tcp   elastic_cori

# Arreter de services actives:
sudo docker stop centos2
centos2

# Demarer des containers existants 
sudo docker start centos2
centos2

Lancer des comandes dans les containers:

# Faire la commande ping depuis la hote
sudo docker container exec centos2 ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=4 ttl=118 time=3.62 ms
^C

# La commande ping roule apres le Control-C
# Le Control-C fait juste deconnecter le container 

# Rentrer sur le container en bash
sudo docker container exec -ti centos2 bash
[root@68572b8ba94f /]# ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.0  23048  1424 ?        Ss   09:35   0:00 /usr/bin/coreutils --coreut
root           7  0.0  0.0  29520  2332 ?        Ss   09:44   0:00 ping 8.8.8.8
root          13  0.6  0.0  12052  3184 pts/0    Ss   09:45   0:00 bash
root          28  0.0  0.0  44668  3312 pts/0    R+   09:45   0:00 ps aux

# Tuer le processus ping dehors le container 
sudo docker container exec centos2 pkill ping

# Imprimer les processus actives depuis la hote, nous pouvons voir que la
# commande ping a ete tue
sudo docker container exec centos2 ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.0  23048  1424 ?        Ss   09:35   0:00 /usr/bin/coreutils --coreutils-prog-shebang=tail /usr/bin/tail -f
root          36  0.0  0.0  44668  3212 ?        Rs   09:48   0:00 ps aux

Site en marche avec une seule ligne

Exercice web : Heberger un site avec une seule ligne de code. Nous allons mètre les fichiers index.html et sytle.css dans le nouveau directeur site :

# Creer le directeur pour le site
mkdir site

Fichier index.html:

<!DOCTYPE html>
<html>
  <head>
    <title>Mon site web</title>
        <link rel="stylesheet" type="text/css" href="style.css">
  </head>
  <body>
    <header>
      <nav>
        <ul>
          <li><a href="#">Accueil</a></li>
          <li><a href="#">A propos</a></li>
          <li><a href="#">Contact</a></li>
        </ul>
      </nav>
    </header>
    <main>
      <h1>Bienvenue sur mon site web</h1>
      <p>Ceci est un exemple de contenu pour mon site web.</p>
    </main>
    <footer>
      <p>Copyright 2021 Mon nom</p>
    </footer>
  </body>
</html>

Fischier style.css

body {
    font-family: Arial, sans-serif;
    margin: 0;
    padding: 0;
}

header {
    background-color: #f0f0f0;
    padding: 20px;
    text-align: center;
}

nav ul {
    list-style-type: none;
    margin: 0;
    padding: 0;
}

nav li {
    display: inline-block;
    margin-right: 10px;
}

nav a {
    color: #000;
    text-decoration: none;
}

main {
    padding: 20px;
}

footer {
    background-color: #f0f0f0;
    padding: 10px;
    text-align: center;
}
# Deplacer les fichiers dans le directeur
mv index.html style.css site/

Nous avons l’image et la documentation officielle Nginx ici

# Nous allons monter le directeur site créé tout à l'heure dans
# /usr/share/nginx/html ainsi que la redirection de ports depuis le 80 container
# vers le 9999 hôte  
sudo docker container run --name web1 -d --volume /home/ubuntu/site:/usr/share/nginx/html -p9999:80 nginx

Nous allons dans notre navigateur, nous tapons ça : http://192.168.100.230:9999

Voila:

Mini Tp

Exercice :

Trois containers dérivés sur l’image centos:

  • frontend
  • backend
  • db

Backend peut dialoguer avec frontend et db, mais frontend et db peut pas dialoguer entre eux. Toutes les trois doivent marcher en tache de fond avec tail -f.

Backend et frontend partage 1 volume nome “partage”.

Ma solution :

# creer les networks
sudo docker network create frontend
sudo docker network create db

# creer le volume
sudo docker volume create partage

# Démarrer les machines avec les options souhaite
sudo docker container run --name frontend -d --network frontend --volume partage:/var/partage centos tail -f
sudo docker container run --name db -d --network db  centos tail -f
sudo docker container run --name backend -d --network frontend --volume partage:/var/partage centos tail -f

# Après une petite recherche, j'ai découvert qu'est impossible de démarrer
# les containers avec plusieurs réseaux, nous laissons un et nous allons
# rajouter les autres après le démarrage. 
sudo docker network connect db backend

Dockerfile

Les images standard ne viennent pas préparée avec l’environnement que nous souhaitons. Le Dockerfile couvre cet aspect en permettant la préparation de notre container avec les applications et configurations souhaite.

mkdir lab1
touch lab1/Dockerfile
touch lab1/tssr.txt

Dockerfile

FROM ubuntu
RUN apt update
RUN apt install iputils-ping nano -y
COPY tssr.txt /home/tssr.conf
WORKDIR /home/
ENTRYPOINT ["/bin/bash"]

La commande pour créer notre image est :


sudo docker build .

Nous pouvons identifier notre noubvellee image en faisant :

# Lister les images existente:
sudo docker image ls
REPOSITORY    TAG       IMAGE ID       CREATED              SIZE
<none>        <none>    fa2abfe75d3f   About a minute ago   121MB
nginx         latest    3f8a00f137a0   32 hours ago         142MB

# Nous allons la tager
sudo docker tag  fa2 ubuntu-perso

# Listons encore une fois
sudo docker image ls
REPOSITORY     TAG       IMAGE ID       CREATED              SIZE
ubuntu-perso   latest    fa2abfe75d3f   About a minute ago   121MB
nginx          latest    3f8a00f137a0   32 hours ago         142MB


# Pour utiliser notre nouvelle image 
sudo docker container run -ti ubuntu-perso 

Maintenant, nous avons notre Ubuntu perso avec nano et ping dans quelque secondes.

Docker Cloud

Docker Hub offre la possibilité d’héberger nos images préparées et le télécharger de n’importe où, mais il faut pas oublier que tout ce qui est téléchargé dans le cloud est public, donc faites attention aux donnes que vous laissez dans vos images.

# Nous devons avoir bien sur un compte chez eux, nous allons fair la connexion 
sudo docker login

# Nous allons tagger l'image a telecharger
sudo docker tag xxx username/image_cree

# Nous allons la telecharger vers le cloud 
sudo docker push username/image_cree

J’ai effacé l’image locale et :