Docker Volumes: Die ultimative Lösung für Datenpersistenz in Containern
In Containeranwendungen ist die Datenpersistenz von entscheidender Bedeutung. Docker-Container verlieren standardmäßig alle Daten, wenn sie entfernt werden. Die ideale Lösung? Docker-Volumes. Sie gewährleisten das Überleben der Daten auch nach dem Entfernen oder Neustarten von Containern und bieten Isolation und Skalierbarkeit.
Bind mounts
, insbesondere ermöglichen sie die lokale Bearbeitung von Dateien mit sofortiger Spiegelung im Container.Stellen Sie sich den Container wie einen Mietwagen vor – wenn Sie das Auto wechseln, verlieren Sie alles darin. Das Volumen ist Ihr persönlicher Koffer, der Sie in jedem Fahrzeug (Container) begleitet.
Bind Mount
für den Datei-UploadStellen Sie sich eine Go-Anwendung vor, die Datei-Uploads empfängt. Dieses Beispiel zeigt, wie diese Uploads auf dem lokalen Computer dauerhaft bleiben und Verluste beim Entfernen des Containers vermieden werden.
Dieses vereinfachte Beispiel erstellt einen HTTP-Server zum Hochladen und Speichern von Dateien im Ordner uploads/
. Der vollständige Code ist auf meinem GitHub verfügbar. Hier ist ein Auszug aus 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>
Diese Docker-Datei kompiliert die Binärdatei und konfiguriert die Ausführungsumgebung:
<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/
-Ordner des Hosts dem Container zu:<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>
Bitte beachten Sie -v /caminho/no/host/uploads:/app/uploads
:
Über /upload
gesendete Dateien werden im Container und auf dem Host gespeichert. Durch das Entfernen des Containers bleiben die Dateien auf dem Host erhalten.
Damit Docker Daten in einem benannten Volume verwaltet (ohne auf einen lokalen Ordner angewiesen zu sein), finden Sie hier ein Beispiel mit 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
bleibt bestehen, unabhängig von den Containern, die es verwenden.
Erwägen Sie bei sensiblen Daten die Verschlüsselung des Dateisystems oder die Verwendung von Volume-Treibern mit Verschlüsselung:
Ihre Daten sind vertrauliche Dokumente; Schützen Sie sie mit Verschlüsselung.
Docker Compose erleichtert die Orchestrierung mehrerer Dienste. Dieses Beispiel demonstriert die Datenpersistenz mit einer Datenbank:
<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>
Dienste starten: docker compose up -d
. Status prüfen: docker compose ps
. Testen Sie den 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>
Stoppen und entfernen: docker compose down
. db_data
bleibt bestehen.
Docker-Volumes sind für die Datenpersistenz in Containern unerlässlich. Bind mounts
sind ideal für die Entwicklung, während benannte Bände für die Produktion empfohlen werden. Die richtige Anwendung garantiert Belastbarkeit und Organisation. Probieren Sie es aus und teilen Sie Ihre Erfahrungen!
Das obige ist der detaillierte Inhalt vonDocker-Volumes. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!