ホームページ > バックエンド開発 > Golang > Docker ボリューム

Docker ボリューム

Linda Hamilton
リリース: 2025-01-21 22:03:10
オリジナル
878 人が閲覧しました

Docker ボリューム: コンテナ内のデータ永続性のための究極のソリューション

コンテナ化されたアプリケーションでは、データの永続性が重要です。 デフォルトでは、Docker コンテナは削除されるとすべてのデータを失います。理想的な解決策は? Docker ボリューム。コンテナーを削除または再起動した後でもデータの存続を保証し、分離性とスケーラビリティを提供します。


Docker ボリュームを選択する理由

  1. 永続性: ボリュームをコンテナにリンクすると、コンテナが破棄または再作成された後でもデータは存続します。
  2. 分離: データ ストレージをコンテナ ロジックから分離すると、整理、置換、更新が簡素化されます。
  3. スケーラビリティ: マルチコンテナ環境では、ボリュームによりデータ共有が容易になります。
  4. 開発の高速化: Bind mounts、特に、ファイルをローカルで編集してコンテナに即座に反映させることができます。

コンテナをレンタカーとして想像してください。車を乗り換えると、中身をすべて失います。このボリュームは、あらゆる乗り物 (コンテナ) に付属する個人のスーツケースです。

Docker Volumes


実践例 1: ファイルアップロードの 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

この 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

によるコンテナの作成と実行
  1. イメージを構築します:
<code class="language-bash">docker build -t go-upload-app:latest .</code>
ログイン後にコピー
  1. コンテナを実行し、ホストの 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:

  • 左: ホスト上のパス。
  • 右: コンテナ内のパス (/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 は、それを使用するコンテナーに関係なく存続します。


セキュリティ: ボリュームの暗号化

機密データの場合は、ファイル システムを暗号化するか、暗号化を備えたボリューム ドライバーを使用することを検討してください。

  • 暗号化されたパーティションに保存します。
  • 保存時の暗号化を備えたクラウド ストレージ ソリューション。
  • 暗号化が組み込まれた特殊なドライバー (rexray、portworx)。

あなたのデータは機密文書です。暗号化してそれらを保護します。


Docker Compose を使用した例

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 で実行

サービスを開始します: 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 downdb_data が持続します。


結論

Docker ボリュームは、コンテナー内のデータの永続化に不可欠です。 Bind mounts は開発に最適ですが、名前付きボリュームは実稼働に推奨されます。 正しく使用すると、回復力と組織力が保証されます。 試してみて、あなたの経験を共有してください!

以上がDocker ボリュームの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート