Docker Volumes : la solution ultime pour la persistance des données dans les conteneurs
Dans les applications conteneurisées, la persistance des données est cruciale. Les conteneurs Docker, par défaut, perdent toutes les données lorsqu'ils sont supprimés. La solution idéale ? Volumes Docker. Ils garantissent la survie des données même après la suppression ou le redémarrage des conteneurs, offrant isolation et évolutivité.
Bind mounts
, ils permettent notamment d'éditer des fichiers localement avec réflexion immédiate dans le conteneur.Imaginez le conteneur comme une voiture de location : lorsque vous changez de voiture, vous perdez tout ce qu'il contient. Le volume est votre valise personnelle, qui vous accompagne dans n'importe quel véhicule (conteneur).
Bind Mount
pour le téléchargement de fichiersEnvisagez une application Go qui reçoit des téléchargements de fichiers. Cet exemple montre comment conserver ces téléchargements persistants sur l'ordinateur local, en évitant les pertes lors de la suppression du conteneur.
Cet exemple simplifié crée un serveur HTTP pour télécharger et stocker des fichiers dans le dossier uploads/
. Le code complet est disponible sur mon GitHub. Voici un extrait de handler
:
<code class="language-go">func UploadHandler(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodPost { writeJSONError(w, http.StatusMethodNotAllowed, "Método não permitido") return } file, header, err := r.FormFile("file") if err != nil { writeJSONError(w, http.StatusBadRequest, "Erro ao ler arquivo do formulário") return } defer file.Close() err = services.SaveUploadedFile(file, header.Filename) if err != nil { writeJSONError(w, http.StatusInternalServerError, fmt.Sprintf("Erro ao gravar arquivo: %v", err)) return } writeJSONSuccess(w, http.StatusOK, "Upload realizado com sucesso!", header.Filename) }</code>
Ce Dockerfile compile le binaire et configure l'environnement d'exécution :
<code class="language-dockerfile"># syntax=docker/dockerfile:1 FROM golang:1.23-alpine AS builder WORKDIR /app COPY go.mod ./ RUN go mod download COPY . . RUN go build -o server ./cmd/image-uploader FROM alpine:3.21 WORKDIR /app COPY --from=builder /app/server /app/server RUN mkdir -p /app/uploads EXPOSE 8080 CMD ["/app/server"]</code>
Bind Mount
<code class="language-bash">docker build -t go-upload-app:latest .</code>
uploads/
de l'hôte au conteneur :<code class="language-bash">docker run -d \ --name meu_container_go \ -p 8080:8080 \ -v /caminho/no/host/uploads:/app/uploads \ go-upload-app:latest</code>
Veuillez noter -v /caminho/no/host/uploads:/app/uploads
:
Les fichiers envoyés via /upload
seront stockés dans le conteneur et sur l'hôte. La suppression du conteneur préserve les fichiers sur l'hôte.
Pour que Docker gère les données dans un volume nommé (sans s'appuyer sur un dossier local), voici un exemple avec PostgreSQL :
<code class="language-bash">docker volume create pg_dados docker run -d \ --name meu_postgres \ -e POSTGRES_PASSWORD=123456 \ -v pg_dados:/var/lib/postgresql/data \ postgres:latest</code>
pg_dados
persiste quels que soient les conteneurs qui l'utilisent.
Pour les données sensibles, envisagez de chiffrer le système de fichiers ou d'utiliser des pilotes de volume avec chiffrement :
Vos données sont des documents confidentiels ; protégez-les avec cryptage.
Docker Compose facilite l'orchestration de plusieurs services. Cet exemple démontre la persistance des données avec une base de données :
<code class="language-go">func UploadHandler(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodPost { writeJSONError(w, http.StatusMethodNotAllowed, "Método não permitido") return } file, header, err := r.FormFile("file") if err != nil { writeJSONError(w, http.StatusBadRequest, "Erro ao ler arquivo do formulário") return } defer file.Close() err = services.SaveUploadedFile(file, header.Filename) if err != nil { writeJSONError(w, http.StatusInternalServerError, fmt.Sprintf("Erro ao gravar arquivo: %v", err)) return } writeJSONSuccess(w, http.StatusOK, "Upload realizado com sucesso!", header.Filename) }</code>
Démarrer les services : docker compose up -d
. Vérifier l'état : docker compose ps
. Testez l'upload :
<code class="language-dockerfile"># syntax=docker/dockerfile:1 FROM golang:1.23-alpine AS builder WORKDIR /app COPY go.mod ./ RUN go mod download COPY . . RUN go build -o server ./cmd/image-uploader FROM alpine:3.21 WORKDIR /app COPY --from=builder /app/server /app/server RUN mkdir -p /app/uploads EXPOSE 8080 CMD ["/app/server"]</code>
Arrêter et supprimer : docker compose down
. db_data
persiste.
Les volumes Docker sont essentiels à la persistance des données dans les conteneurs. Les Bind mounts
sont idéaux pour le développement, tandis que les volumes nommés sont recommandés pour la production. Une utilisation correcte garantit la résilience et l’organisation. Essayez-le et partagez vos expériences !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!