containers
docker
rocky
tutos
Docker CE sur Rocky Linux 9
Installation de Docker Community Edition sur Rocky Linux 9.
Composant
Version
Rocky Linux
9.x
Docker CE
24.x
Docker Compose
2.x
Durée estimée : 20 minutes
1. Prérequis
# Supprimer les anciennes versions
dnf remove -y docker docker-client docker-client-latest \
docker-common docker-latest docker-latest-logrotate \
docker-logrotate docker-engine podman runc
2. Installation
Ajouter le dépôt Docker
dnf install -y dnf-plugins-core
dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
Installer Docker
dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# Vérifier
docker --version
docker compose version
Démarrer le service
systemctl enable --now docker
systemctl status docker
3. Post-installation
Utiliser Docker sans sudo
# Ajouter l'utilisateur au groupe docker
usermod -aG docker $USER
# Appliquer (se reconnecter ou)
newgrp docker
# Tester
docker run hello-world
mkdir -p /etc/docker
cat > /etc/docker/daemon.json << 'EOF'
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"storage-driver": "overlay2",
"live-restore": true
}
EOF
systemctl restart docker
4. Commandes essentielles
Images
# Télécharger
docker pull nginx:alpine
docker pull python:3.11
# Lister
docker images
# Supprimer
docker rmi nginx:alpine
Conteneurs
# Lancer
docker run -d --name web -p 8080 :80 nginx:alpine
# Lister
docker ps
docker ps -a
# Logs
docker logs -f web
# Exec
docker exec -it web sh
# Stop/Start/Remove
docker stop web
docker start web
docker rm -f web
Volumes
# Créer
docker volume create mydata
# Utiliser
docker run -d --name db \
-v mydata:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD = secret \
mysql:8
# Bind mount
docker run -d --name web \
-v $( pwd ) /html:/usr/share/nginx/html:ro \
-p 80 :80 \
nginx:alpine
Réseaux
# Créer
docker network create mynet
# Utiliser
docker run -d --name web --network mynet nginx
docker run -d --name app --network mynet myapp
# Inspecter
docker network inspect mynet
5. Docker Compose
Fichier compose.yml
version : "3.8"
services :
web :
image : nginx:alpine
ports :
- "80:80"
volumes :
- ./www:/usr/share/nginx/html:ro
depends_on :
- api
restart : unless-stopped
api :
build : ./api
environment :
- DATABASE_URL=mysql://user:pass@db/app
depends_on :
- db
restart : unless-stopped
db :
image : mysql:8
environment :
MYSQL_ROOT_PASSWORD : rootpass
MYSQL_USER : user
MYSQL_PASSWORD : pass
MYSQL_DATABASE : app
volumes :
- db-data:/var/lib/mysql
restart : unless-stopped
volumes :
db-data :
networks :
default :
name : myapp-network
Commandes Compose
# Lancer
docker compose up -d
# Logs
docker compose logs -f
# Status
docker compose ps
# Arrêter
docker compose down
# Arrêter et supprimer volumes
docker compose down -v
6. Build d'images
Dockerfile
FROM python:3.11-alpine
WORKDIR /app
# Dépendances système
RUN apk add --no-cache gcc musl-dev
# Dépendances Python
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Code application
COPY . .
# Utilisateur non-root
RUN adduser -D appuser
USER appuser
EXPOSE 5000
CMD [ "python" , "app.py" ]
Build
docker build -t myapp:1.0 .
docker build -t myapp:latest --no-cache .
# Multi-stage
docker build --target production -t myapp:prod .
7. Registry
Docker Hub
docker login
docker tag myapp:1.0 username/myapp:1.0
docker push username/myapp:1.0
Registry privé
# Lancer un registry local
docker run -d --name registry \
-p 5000 :5000 \
-v registry:/var/lib/registry \
--restart always \
registry:2
# Pousser
docker tag myapp:1.0 localhost:5000/myapp:1.0
docker push localhost:5000/myapp:1.0
8. Firewall
# Docker gère iptables automatiquement
# Pour exposer un port spécifique
firewall-cmd --permanent --add-port= 8080 /tcp
firewall-cmd --reload
# Ou désactiver la gestion par Docker
# Dans /etc/docker/daemon.json: "iptables": false
9. SELinux
# Docker fonctionne avec SELinux
# Pour les volumes, utiliser :z ou :Z
docker run -v /data:/data:z nginx # Shared
docker run -v /data:/data:Z nginx # Private
# Vérifier
getenforce
ls -Z /data
10. Monitoring
# Stats en temps réel
docker stats
# Événements
docker events
# Espace disque
docker system df
11. Nettoyage
# Conteneurs arrêtés
docker container prune
# Images non utilisées
docker image prune -a
# Volumes orphelins
docker volume prune
# Tout nettoyer
docker system prune -a --volumes
# Attention : supprime TOUT
12. Sécurité
Limiter les ressources
docker run -d --name app \
--memory= "512m" \
--cpus= "1.0" \
--pids-limit= 100 \
myapp:latest
Utilisateur non-root
# Dans Dockerfile
RUN adduser -D appuser
USER appuser
Read-only filesystem
docker run --read-only --tmpfs /tmp myapp
Vérification
# Version
docker --version
docker compose version
# Info système
docker info
# Test
docker run --rm hello-world
Dépannage
# Logs Docker
journalctl -u docker -f
# Logs conteneur
docker logs container_name
# Inspecter
docker inspect container_name
# Reset
systemctl restart docker
Problème
Solution
Permission denied
usermod -aG docker $USER + reconnexion
Port already in use
docker ps -a puis docker rm -f
No space left
docker system prune -a
Changelog
Date
Modification
2024-12
Création initiale