Docker ボリューム: コンテナ内のデータ永続性のための究極のソリューション
コンテナ化されたアプリケーションでは、データの永続性が重要です。 デフォルトでは、Docker コンテナは削除されるとすべてのデータを失います。理想的な解決策は? Docker ボリューム。コンテナーを削除または再起動した後でもデータの存続を保証し、分離性とスケーラビリティを提供します。
Bind mounts
、特に、ファイルをローカルで編集してコンテナに即座に反映させることができます。コンテナをレンタカーとして想像してください。車を乗り換えると、中身をすべて失います。このボリュームは、あらゆる乗り物 (コンテナ) に付属する個人のスーツケースです。
Bind Mount
ファイルのアップロードを受信する Go アプリケーションを考えてみましょう。 この例では、これらのアップロードをローカル コンピューター上で永続的に保持し、コンテナーの削除時の損失を回避する方法を示します。
この簡略化された例では、uploads/
フォルダーにファイルをアップロードして保存するための HTTP サーバーを作成します。 完全なコードは私の GitHub で入手できます。 以下は 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>
この Dockerfile はバイナリをコンパイルし、実行環境を構成します:
<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/
フォルダをコンテナにマッピングします。<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>
ご注意ください-v /caminho/no/host/uploads:/app/uploads
:
/upload
経由で送信されたファイルはコンテナーとホストに保存されます。 コンテナを削除すると、ファイルはホスト上に保持されます。
Docker で名前付きボリューム内のデータを (ローカル フォルダーに依存せずに) 管理させるには、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
は、それを使用するコンテナーに関係なく存続します。
機密データの場合は、ファイル システムを暗号化するか、暗号化を備えたボリューム ドライバーを使用することを検討してください。
あなたのデータは機密文書です。暗号化してそれらを保護します。
Docker Compose を使用すると、複数のサービスを簡単に調整できます。 この例では、データベースでのデータの永続性を示します。
<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>
サービスを開始します: docker compose up -d
。 ステータスを確認します: docker compose ps
。 アップロードをテストします:
<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>
停止して削除します: docker compose down
。 db_data
が持続します。
Docker ボリュームは、コンテナー内のデータの永続化に不可欠です。 Bind mounts
は開発に最適ですが、名前付きボリュームは実稼働に推奨されます。 正しく使用すると、回復力と組織力が保証されます。 試してみて、あなたの経験を共有してください!
以上がDocker ボリュームの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。