containers
debian
docker
tutos
Docker CE sur Debian 12
Installation de Docker Community Edition sur Debian 12 Bookworm.
Composant
Version
Debian
12 Bookworm
Docker CE
24.x
Docker Compose
2.x
Durée estimée : 20 minutes
1. Prérequis
# Supprimer anciennes versions
apt remove -y docker docker-engine docker.io containerd runc
# Dépendances
apt update
apt install -y ca-certificates curl gnupg
2. Installation
Ajouter le dépôt Docker
# Clé GPG
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
# Dépôt
echo \
"deb [arch= $( dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
$( . /etc/os-release && echo " $VERSION_CODENAME " ) stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null
Installer Docker
apt update
apt 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
usermod -aG docker $USER
newgrp docker
# Tester
docker run hello-world
Configuration daemon
cat > /etc/docker/daemon.json << 'EOF'
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"storage-driver": "overlay2",
"live-restore": true,
"default-address-pools": [
{"base": "172.17.0.0/16", "size": 24}
]
}
EOF
systemctl restart docker
4. Commandes de base
Images
docker pull nginx:alpine
docker images
docker rmi nginx:alpine
Conteneurs
# Lancer
docker run -d --name web -p 8080 :80 nginx:alpine
# Gérer
docker ps
docker logs -f web
docker exec -it web sh
docker stop web
docker rm web
Volumes
docker volume create appdata
docker run -d -v appdata:/data myapp
docker run -d -v $( pwd ) /html:/var/www:ro nginx
Réseaux
docker network create mynet
docker run -d --network mynet --name web nginx
docker run -d --network mynet --name app myapp
5. Docker Compose
# compose.yml
version : "3.8"
services :
frontend :
image : nginx:alpine
ports :
- "80:80"
volumes :
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./www:/usr/share/nginx/html:ro
depends_on :
- backend
restart : unless-stopped
backend :
build :
context : ./backend
dockerfile : Dockerfile
environment :
- DB_HOST=database
- DB_NAME=app
depends_on :
database :
condition : service_healthy
restart : unless-stopped
database :
image : postgres:15
environment :
POSTGRES_DB : app
POSTGRES_USER : user
POSTGRES_PASSWORD : secret
volumes :
- pgdata:/var/lib/postgresql/data
healthcheck :
test : [ "CMD-SHELL" , "pg_isready -U user -d app" ]
interval : 10s
timeout : 5s
retries : 5
restart : unless-stopped
volumes :
pgdata :
docker compose up -d
docker compose logs -f
docker compose ps
docker compose down
6. Build d'images
Dockerfile multi-stage
# Build stage
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Production stage
FROM nginx:alpine AS production
COPY --from= builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
CMD [ "nginx" , "-g" , "daemon off;" ]
docker build -t myapp:1.0 .
docker build --target builder -t myapp:dev .
7. Registry
# Docker Hub
docker login
docker tag myapp:1.0 user/myapp:1.0
docker push user/myapp:1.0
# Registry local
docker run -d -p 5000 :5000 --restart always registry:2
docker tag myapp:1.0 localhost:5000/myapp:1.0
docker push localhost:5000/myapp:1.0
8. Firewall UFW
# Docker modifie iptables directement
# UFW peut être contourné par défaut
# Pour forcer UFW
cat >> /etc/ufw/after.rules << 'EOF'
*filter
:DOCKER-USER - [0:0]
-A DOCKER-USER -j RETURN
COMMIT
EOF
ufw reload
9. Healthchecks
# Dans compose.yml
services :
web :
image : nginx
healthcheck :
test : [ "CMD" , "curl" , "-f" , "http://localhost/" ]
interval : 30s
timeout : 10s
retries : 3
start_period : 40s
docker inspect --format= '{{.State.Health.Status}}' web
10. Ressources et limites
# Limiter mémoire et CPU
docker run -d \
--memory= "256m" \
--memory-swap= "512m" \
--cpus= "0.5" \
--pids-limit= 50 \
myapp
# Dans compose.yml
services:
app:
image: myapp
deploy:
resources:
limits:
cpus: '0.5'
memory: 256M
reservations:
cpus: '0.25'
memory: 128M
11. Logs
# Voir les logs
docker logs container_name
docker logs -f --tail 100 container_name
# Driver de log
docker run -d \
--log-driver= json-file \
--log-opt max-size= 10m \
--log-opt max-file= 3 \
myapp
12. Nettoyage
# Conteneurs arrêtés
docker container prune -f
# Images orphelines
docker image prune -a -f
# Volumes non utilisés
docker volume prune -f
# Tout (attention!)
docker system prune -a --volumes -f
# Vérifier l'espace
docker system df
13. Backup
# Exporter un conteneur
docker export container_name > backup.tar
# Sauvegarder une image
docker save myapp:1.0 > myapp.tar
# Restaurer
docker load < myapp.tar
# Backup volume
docker run --rm \
-v myvolume:/data \
-v $( pwd ) :/backup \
alpine tar czf /backup/volume-backup.tar.gz /data
Comparatif Rocky vs Debian
Aspect
Rocky 9
Debian 12
Dépôt
centos
debian
SELinux
Oui
Non (AppArmor)
Firewall
firewalld
ufw/iptables
Volumes
:z/:Z
Standard
Vérification
docker --version
docker compose version
docker info
docker run --rm hello-world
Dépannage
journalctl -u docker -f
docker logs container_name
docker inspect container_name
docker events
Problème
Solution
Permission denied
usermod -aG docker $USER
Port in use
docker ps -a + docker rm -f
Disk full
docker system prune -a
Network issue
docker network prune
Changelog
Date
Modification
2024-12
Création initiale