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 :