Faire tourner une distribution Debian dans un container docker

Etudier Linux depuis un container docker peut être intéressant pour apprendre en même temps Docker. Nous allons voir comme créer un container docker qui contient Debian, et nous allons commencer par nous familiariser avec Docker.

Téléchargement de l’image Docker officielle Debian

Pour télécharger l’image officielle de Debian faites la commande suivante (démarrer Docker Desktop avant)

docker pull debian

Démarrage de l’image docker debian

Une fois que l’image est téléchargée on peut démarrer le container docker

docker run -it debian


//alternativement démarrage avec un container nommé
docker run -it --name not-ubuntu debian

// voir les dockers en fonctionnement
// depuis un autre terminal, pour visualiser les docker qui tournent
docker ps

CONTAINER ID   IMAGE     COMMAND   CREATED       STATUS          PORTS     NAMES
a3de0ee8e2ba   debian    "bash"    2 hours ago   Up 54 minutes             not-ubuntu

Sortir d’un docker

Pour sortir d’un docker quand vous êtes en mode interactif, c’est à dire que vous êtes dedans, vous pouvez faire la combinaison de touche CTRL + D, ou faire la commande exit.

Quand vous avez démarré votre container docker avec docker run, vous pouvez voir les container actif avec docker ps, mais un fois que vous êtes sorti du container ou que le container est stoppé, docker ps ne donne rien, c’est alors qu’il vous faut faire la commande docker ps -a

Stopper un container

Vous pouvez stopper un container à partir d’un autre terminal

docker stop <ID CONTAINER>

Une fois le container stoppé, il ne sera plus visible avec docker ps, mais avec docker ps -a.

docker ps -a

CONTAINER ID   IMAGE     COMMAND   CREATED       STATUS                       PORTS     NAMES
a3de0ee8e2ba   debian    "bash"    2 hours ago   Exited (137) 5 minutes ago             not-ubuntu

Redémarrer un container « Exited »

Pour redémarrer un container éteint, il faut faire docker start <nom_container>. Le problème c’est que vous ne pouvez pas le redémarrer en mode interactif. Il faut le redémarrer et y entrer avec docker exec.

docker start not-ubuntu

//  entrée dans le docker avec un shell bash
docker exec -it not-ubuntu bash

Construire sa propre image docker de Debian

Pourquoi cette manipulation? L’image officielle de Debian ne contient que Debian. Si vous démarrez cette image, il faut tout installer (Proftpd, curl,wget etc). Nous voudrions une image qui contient tout ces logiciels. Bien sûr vous pouvez démarrer un container nommé afin de persister les installations. Mais votre image n’est pas distribuable car elle sera modifiée. Nous allons donc confectionner une image Docker de Debian customisée avec des logiciel préinstallés, un utilisateur créé. Qu’on va pusher sur le registry gratuit de Docker, qu’on pourra distribuer.

Créer un fichier Dockerfile de configuration

Créer un répertoire où vous allez mettre le fichier Dockerfile, dont voici le contenu:

# Utilise l’image officielle Debian
FROM debian:bullseye

# Évite les questions interactives lors des installations
ENV DEBIAN_FRONTEND=noninteractive

# Mise à jour et installation de paquets de base
RUN apt-get update && \
    apt-get install -y \
    curl \
    wget \
    vim \
    git \
    ca-certificates \
    sudo \
    bash \
    && apt-get clean && rm -rf /var/lib/apt/lists/*

# Crée un utilisateur non-root
RUN useradd -ms /bin/bash devuser && \
    echo "devuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

# Bascule sur l’utilisateur
USER devuser

# Répertoire de travail
WORKDIR /home/devuser

# Commande par défaut (ouvre un terminal interactif)
CMD [ "bash" ]

La commande apt-get clean permet d’effacer les fichier temporaire pour gagner de l’espace, vous aurez une image Docker plus petite.

Ensuite depuis el répertoire où il y a le Dockerfile lancez la commande :

docker build -t debian_custom .

debian_custom est le nom de la nouvelle image, le . est le répertoire où se trouve le fichier Dockerfile (répertoire courant)

Pour tester l'image nous allons démarrer le container:
docker run -it debian_custom

Normalement tout fonctionne normalement, et vous êtes connecté en devuser. Maintenant nous allons pousser cette image dans notre repository Docker, si vous n’avez pas de compte c’est le moment d’en créer un.

docker tag debian_custom refschool/debian_custom:latest

docker push refschool/debian_custom:latest

The push refers to repository [docker.io/refschool/debian_custom]
5f70bf18a086: Preparing 
34d4f9b85dd7: Pushing [==================================================>]  350.7kB
e5f126b4d117: Preparing 
46cd9334c732: Preparing 


puis quand c'est terminé

5f70bf18a086: Mounted from library/wordpress 
34d4f9b85dd7: Pushed 
e5f126b4d117: Pushed 
46cd9334c732: Mounted from library/debian 
latest: digest: sha256:fa443c6962fb73b4863bb10c46e41aef3db2c255604babcf83d89d41f1fbbb size: 1155


Allez sur le site https://hub.docker.com/repositories/refschool pour voir votre image en ligne ou allez dans le Docker Desktop.

Divers commandes docker

Les images qui n’ont plus de container actif peuvent être enlevé si elles ne servent plus. Les volumes de containers stoppés ou enlevés, les caches de builds.

Enlever une image par le nom ou par l’ID

docker images

ebian_custom                                             latest                                                                       48c43ff6050a   34 minutes ago   271MB
refschool/debian_custom                                   latest                                                                       48c43ff6050a   34 minutes ago   271MB
debian                                                    latest                                                                       b2ab84c007fe   4 weeks ago      117MB
<none>                                                    <none>                                                                       9f0461ec704d   3 months ago     53.3MB
<none>                                                    <none>                                                                       eb50ff518c13   3 months ago     47.9MB
test                                                      latest                                                                       d5aa53c2ffcd   3 months ago     47.9MB
evashen                                                   latest                                                                       bc040446118f   3 months ago     53.3MB
hubproxy.docker.internal:5555/docker/desktop-kubernetes   kubernetes-v1.27.2-cni-v1.2.0-critools-v1.27.0-cri-dockerd-v0.3.2-1-debian   c763812a4530   24 months ago    418MB
registry.k8s.io/kube-apiserver                            v1.27.2                                                                      c5b13e4f7806   2 years ago      121MB
registry.k8s.io/kube-scheduler                            v1.27.2                                                                      89e70da428d2   2 years ago      58.4MB
registry.k8s.io/kube-controller-manager                   v1.27.2                                                                      ac2b7465ebba   2 years ago      112MB
registry.k8s.io/kube-proxy                                v1.27.2                                                                      b8aa50768fd6   2 years ago      71.1MB
docker/desktop-vpnkit-controller                          dc331cb22850be0cdd97c84a9cfecaf44a1afb6e                                     556098075b3d   2 years ago      36.2MB
registry.k8s.io/coredns/coredns                           v1.10.1                                                                      ead0a4a53df8   2 years ago      53.6MB
registry.k8s.io/etcd                                      3.5.7-0                                                                      86b6af7dd652   2 years ago      296MB
registry.k8s.io/pause                                     3.9                                                                          e6f181688397   2 years ago      744kB
docker/desktop-storage-provisioner                        v2.0                                                                         99f89471f470   4 years ago      41.9MB


docker rmi 9f0461ec704d  // on enlève par l'ID
docker rmi evashen.   // on enlève par le nom


Pour aller plus vite vous avez la commande:

docker image prune -a

// qui va tout enlever après confirmation 
Retour en haut