Problématique résolue par Docker
Docker résout le problème bien connu du "ça fonctionne sur ma machine, mais pas sur la tienne". Il assure une cohérence de l'environnement d'exécution. Un conteneur encapsule un environnement complet dans une image, permettant un déploiement prêt à l'emploi. Important : un conteneur n'est pas une machine virtuelle ; il partage le noyau avec le système hôte.
Procédure d'Installation
1. Désactivation du Pare-feu et de SELinux
# Arrêter et désactiver le pare-feu
systemctl disable --now firewalld
# Vider les règles iptables existantes
iptables -F
# Désactiver le service de messagerie postfix
systemctl disable --now postfix
# Désactiver SELinux de manière persistante
sed -ri 's#(SELINUX=).*#\1disabled#' /etc/selinux/config
# Désactiver SELinux immédiatement (temporaire)
setenforce 0
2. Activasion du Forwarding Réseau de l'Hôte
Chargement du module noyau br_netfilter
Le module br_netfilter active le filtrage réseau sur les ponts réseau (network bridges).
# Charger le module
modprobe br_netfilter
# Assurer le chargement automatique au démarrage
cat <<eof br_netfilter="" chargement="" eof="" le="" lsmod="" sudo="" tee="" v=""></eof>
# Vérifier les paramètres de pont
ls /proc/sys/net/bridge
bridge-nf-call-arptables bridge-nf-filter-pppoe-tagged
bridge-nf-call-ip6tables bridge-nf-filter-vlan-tagged
bridge-nf-call-iptables bridge-nf-pass-vlan-input-dev
Activation du Forwarding IP
vim /etc/sysctl.d/k8s.conf
# Activer le forwarding IPv4
net.ipv4.ip_forward = 1
# Activer le Proxy ARP pour toutes les interfaces
net.ipv4.conf.all.proxy_arp = 1
# Filtrer les paquets IPv6 via ip6tables
net.bridge.bridge-nf-call-ip6tables = 1
# Filtrer les paquets IPv4 via iptables
net.bridge.bridge-nf-call-iptables = 1
# Nombre maximal de connexions suivies par le noyau netfilter
net.netfilter.nf_conntrack_max=2310720
# Désactiver le swap
vm.swappiness = 0
# Désactiver IPv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
Appliquer la configuration :
sysctl -p
3. Suppression des Anciennes Versions de Docker (si nécessaire)
# Supprimer les anciens paquets
sudo yum -y remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine \
podman \
runc
# Pour les versions récentes
yum -y autoremove docker-ce docker-scan-plugin docker-compose-plugin docker-ce-cli docker-buildx-plugin
# Vérifier
rpm -qa |grep docker
4. Ajout du Dépôt Docker CE (miroir Aliyun)
# Installer yum-utils
yum install -y yum-utils
# Ajouter le dépôt officiel Docker (CentOS)
yum-config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
# Ajouter le miroir Aliyun
yum-config-manager --add-repo=https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Vérifier
yum repolist
Alternative : Dépôt Officiel Docker pour RHEL
# Installer yum-plugins-core
yum -y install yum-plugins-core
# Ajouter le dépôt RHEL
yum-config-manager --add-repo=https://download.docker.com/linux/rhel/docker-ce.repo
5. Suppression du Conflit avec Podman (RHEL 8+)
# Supprimer podman
yum erase podman buildah -y
# Alternative : Utiliser --allowerasing lors de l'installation
# yum -y install docker-ce --allowerasing
6. Installation de Docker CE
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
7. Activation et Démarrage du Service Docker
# Activer au démarrage et démarrer
systemctl enable --now docker
# Vérifier la version
docker --version
Configuration de Docker
Le fichier de configuration principal est /etc/docker/daemon.json.
Paramètres Optionnels du daemon.json
| Paramètre | Description |
|---|---|
"experimental": true |
Active les fonctionnalités expérimentales de Docker |
"features": {"buildkit": true} |
Active BuildKit pour des builds plus rapides |
"exec-opts": ["native.cgroupdriver=systemd"] |
Utilise systemd comme cgroup driver (recommandé par Kubernetes) |
"data-root": "/data/docker" |
Change le répertoire de stockage par défaut (/var/lib/docker) pour éviter de saturer la partition / |
"storage-driver": "overlay2" |
Utilise le driver overlay2 (nécessite noyau 4.0+) |
"registry-mirrors": ["https://isdp30x2.mirror.aliyuncs.com"] |
Configure un miroir pour accélérer le téléchargement des images |
Configuration du Miroir pour les Images
{
"registry-mirrors": [
"https://isdp30x2.mirror.aliyuncs.com"
]
}
Modification du Répertoire de Stockage
Pour éviter de saturer la partition système :
mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<eof eof=""></eof>
Configuration du Proxy via daemon.json (Méthode Recommandée)
{
"proxies": {
"http-proxy": "http://<user>:<password>@<domain>:<port>",
"https-proxy": "http://<user>:<password>@<domain>:<port>",
"no-proxy": "<registry.domain>"
}
}
Vérification :
docker info| grep Proxy
Méthode Alternative pour le Proxy (Méthode systemd)
mkdir -p /etc/systemd/system/docker.service.d
vim /etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80"
Environment="HTTPS_PROXY=https://proxy.example.com:443"
Environment="NO_PROXY=your-registry.com,10.10.10.10,*.example.com"
Redémarrage du Service
# Recharger la configuration systemd (si modifiée)
systemctl daemon-reload
# Redémarrer Docker
systemctl restart docker
Vérification de la Configuration
docker info
# Exemple de sortie :
# Docker Root Dir: /data/docker
Autres Exemples de Configuration
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"experimental": true,
"registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
Test d'Installation
[rhel8 root ~]# docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:37a0b92b08d4919615c3ee023f7ddb068d12b8387475d64c622ac30f45c29c51
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest
Exécution de Docker sans root
# Ajouter l'utilisateur courant au groupe docker
sudo usermod -aG docker $USER
# Alternative
sudo gpasswd -a $USER docker
# Passer au groupe docker
newgrp docker
# Test
docker run hello-world
docker run --rm hello-world