Images
$docker build -t mon-app:1.0 .
Building image from Dockerfile in current directory
$docker images
REPOSITORY TAG IMAGE ID CREATED SIZE mon-app 1.0 a1b2c3d4e5f6 2 minutes ago 150MB
$docker pull nginx:alpine
$docker tag mon-app:1.0 registry.example.com/mon-app:1.0
$docker push registry.example.com/mon-app:1.0
$docker rmi mon-app:1.0
$docker image prune -a
Supprime toutes les images non utilisées
Conteneurs
$docker run -d --name web -p 8080:80 nginx:alpine
Lance nginx en arrière-plan, port 8080 → 80
$docker ps
CONTAINER ID IMAGE COMMAND STATUS PORTS NAMES f1a2b3c4d5e6 nginx:alpine ... Up 5s 0.0.0.0:8080->80/tcp web
$docker ps -a
Affiche tous les conteneurs (y compris arrêtés)
$docker exec -it web sh
Ouvre un shell interactif dans le conteneur
$docker logs -f web
Suivre les logs en temps réel
$docker stop web && docker rm web
$docker stats
Monitorer CPU, mémoire, I/O en temps réel
Dockerfile — bonnes pratiques
# Multi-stage build pour images légères
FROM node:22-alpine AS builder
WORKDIR /app
COPY package.json pnpm-lock.yaml ./
RUN corepack enable && pnpm install --frozen-lockfile
COPY . .
RUN pnpm build
FROM node:22-alpine AS runner
WORKDIR /app
RUN addgroup -S app && adduser -S app -G app
COPY --from=builder /app/out ./out
USER app
EXPOSE 3000
CMD ["npx", "serve", "out"]Règles d'or :
- Utiliser des images
alpineoudistroless - Multi-stage builds pour réduire la taille
- Copier
package.jsonavant le code (cache layers) - Ne jamais tourner en
root - Un process par conteneur
.dockerignorepour exclurenode_modules,.git, etc.
Volumes
$docker volume create app-data
$docker run -v app-data:/data mon-app
Monte le volume dans /data
$docker run -v $(pwd)/config:/app/config:ro mon-app
Bind mount en lecture seule
$docker volume ls
$docker volume inspect app-data
Réseaux
$docker network create app-net
$docker run -d --name api --network app-net mon-api
$docker run -d --name web --network app-net nginx
web peut atteindre api via http://api:3000
$docker network inspect app-net
Docker Compose
services:
app:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgres://user:pass@db:5432/mydb
depends_on:
db:
condition: service_healthy
db:
image: postgres:17-alpine
volumes:
- pgdata:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: pass
POSTGRES_DB: mydb
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 3s
retries: 5
volumes:
pgdata:$docker compose up -d
Lance tous les services en arrière-plan
$docker compose logs -f app
$docker compose down -v
Arrete et supprime les volumes
Nettoyage
$docker system prune -a --volumes
Supprime TOUT : conteneurs arrêtés, images, volumes orphelins
$docker system df
Voir l'espace disque utilisé par Docker