Objectif: Créer une image Docker simple avec Nginx qui affiche une page personnalisée.
Instructions:
index.html
avec un message de votre choixindex.html
dans le répertoire appropriémkdir nginx-docker-simple
cd nginx-docker-simple
index.html
:<!DOCTYPE html>
<html>
<head>
<title>Mon Premier Docker</title>
</head>
<body>
<h1>Bonjour depuis mon conteneur Docker !</h1>
<p>Cette page est servie par Nginx dans un conteneur Docker.</p>
</body>
</html>
FROM nginx:latest
COPY index.html /usr/share/nginx/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
docker build -t mon-nginx:v1 .
docker run -d -p 8080:80 --name mon-premier-nginx mon-nginx:v1
curl http://localhost:8080
Objectif: Créer une image Docker optimisée pour Nginx qui inclut un HEALTHCHECK et utilise les meilleures pratiques.
Instructions:
nginx:alpine
)<!DOCTYPE html>
<html>
<head>
<title>Nginx Optimisé</title>
<style>
body { font-family: Arial, sans-serif; margin: 40px; }
h1 { color: #2c3e50; }
</style>
</head>
<body>
<h1>Nginx sur Alpine Linux</h1>
<p>Cette page est servie par une image Docker optimisée.</p>
</body>
</html>
FROM nginx:1.27.4-alpine3.21
# Installation des outils pour healthcheck en une seule couche
RUN apk add --no-cache curl && \
rm -rf /var/cache/apk/*
# Définition du répertoire de travail
WORKDIR /usr/share/nginx/html
# Copie du fichier HTML
COPY index.html .
# Exposition du port
EXPOSE 80
# Configuration du healthcheck
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost/ || exit 1
# Commande de démarrage
CMD ["nginx", "-g", "daemon off;"]
docker build -t nginx-optimise:v1 .
docker images nginx-optimise:v1 # Vérifiez la taille
docker run -d -p 8080:80 --name nginx-healthcheck nginx-optimise:v1
# Après quelques secondes pour permettre au healthcheck de s'exécuter
docker ps
# Vous devriez voir "healthy" dans la colonne STATUS
Objectif: Créer une image Docker optimisée pour une application web Go en utilisant un multi-stage build pour réduire drastiquement la taille de l'image finale.
Contexte: Vous devez déployer une application web simple. Le compilateur Go et ses outils sont nécessaires pour construire l'application, mais ils ne doivent pas se retrouver dans l'image finale de production pour des raisons de taille et de sécurité.
Instructions:
go-app/
├── main.go
└── Dockerfile
Contenu des fichiers:
main.go
: Un serveur web simple qui affiche une page d'accueilDockerfile
: Configuration multi-stage pour optimiser l'imageCréez un Dockerfile multi-stage qui:
Construisez l'image et comparez sa taille avec une approche standard à étape unique.
Lancez un conteneur et vérifiez que l'application fonctionne correctement.
1. main.go
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, `
<h1>Mon App GO</h1>
<p>Cette app est légère !</p>
`)
})
fmt.Println("Serveur démarré sur http://localhost:8080")
http.ListenAndServe(":8080", nil)
}
2. Dockerfile (multi-stage)
# ÉTAPE 1: Compilation de l'app Go
FROM golang:1.24-alpine AS builder
WORKDIR /app
COPY main.go .
RUN go build -o monapp main.go
# ÉTAPE 2: Image finale
FROM alpine:latest
COPY --from=builder /app/monapp /monapp
EXPOSE 8080
CMD ["/monapp"]
3. Dockerfile.single (pour comparaison)
FROM golang:1.24-alpine
WORKDIR /app
COPY main.go .
RUN go build -o monapp main.go
EXPOSE 8080
CMD ["/monapp"]
Commandes pour construire et comparer les images:
# Construction de l'image multi-stage
docker build -t go-app:multi-stage .
# Construction de l'image à étape unique
docker build -f Dockerfile.single -t go-app:single .
# Comparaison des tailles
docker images | grep go-app
Résultat attendu de la comparaison:
REPOSITORY TAG IMAGE ID CREATED SIZE
go-app multi-stage xxxxxxxxxx xx minutes ago ~15MB
go-app single xxxxxxxxxx xx minutes ago ~350MB
Lancement et test de l'application:
# Lancement du conteneur
docker run -d -p 8080:8080 --name go-app go-app:multi-stage
# Vérification que l'application répond
curl http://localhost:8080
# ou ouvrir http://localhost:8080 dans le navigateur
# Vérification du statut du conteneur
docker ps
Nettoyage:
# Arrêt et suppression du conteneur
docker stop go-app && docker rm go-app