1. ホーム
  2. docker

[解決済み] Dockerでデータベースなどの永続的なストレージを扱う方法

2022-03-19 02:32:26

質問

Dockerコンテナの永続的なストレージはどのように扱われていますか?

私は現在この方法をとっています。例えばPostgreSQL用のイメージを構築し、コンテナを起動する際に

docker run --volumes-from c0dbc34fd631 -d app_name/postgres

IMHOでは、コンテナ "c0dbc34fd631" を(誤って)削除してはいけないという欠点があります。

もう一つのアイデアは、ホスト・ボリュームをコンテナにマウントすることです。 ユーザーID と一致するとは限りません。 ユーザーID を実行すると、パーミッションがめちゃくちゃになる可能性があります。

注意: --volumes-from 'cryptic_id' を使用することもできます。 --volumes-from my-data-container ここで my-data-container は、データのみのコンテナに割り当てた名前です。 docker run --name my-data-container ... (受理済み回答参照)

どのように解決するのですか?

Docker 1.9.0以上

使用方法 ボリュームAPI

docker volume create --name hello
docker run -d -v hello:/container/path/for/volume container_image my_command

つまり、データ専用のコンテナ・パターンを捨てて、新しいボリュームを採用しなければならないのです。

実はボリュームAPIは、データコンテナ・パターンを実現するためのより良い方法に過ぎないのです。

でコンテナを作成すると -v volume_name:/container/fs/path Dockerは、自動的にそのようなことができる名前付きボリュームを作成します。

  1. を通して一覧表示されます。 docker volume ls
  2. を通じて識別される。 docker volume inspect volume_name
  3. 通常のディレクトリとしてバックアップされる
  4. を経由して従来通りバックアップ。 --volumes-from 接続

新しいボリューム API には、ダングリングボリュームを特定するための便利なコマンドが追加されています。

docker volume ls -f dangling=true

そして、その名前を通して削除します。

docker volume rm <volume name>

コメントで@mpugachが強調しているように、素敵なワンライナーですべてのダングリングボリュームを取り除くことができます。

docker volume rm $(docker volume ls -f dangling=true -q)
# Or using 1.13.x
docker volume prune

Docker 1.8.xおよびそれ以下

実運用に最も適していると思われるアプローチは データ専用コンテナ .

データ専用コンテナはベアボーンイメージで実行され、データボリュームを公開する以外、実際には何も行いません。

その後、他のコンテナを実行すれば、データコンテナのボリュームにアクセスできるようになります。

docker run --volumes-from data-container some-other-container command-to-execute

  • これ をご覧いただくと、コンテナの並べ方がよくわかると思います。
  • ここで ボリュームがどのように機能するかについて、良い洞察があります。

このブログの記事 についての良い説明があります。 ボリュームパターンとしてのコンテナ を持つことの要点を明確にしたものです。 データ専用コンテナ .

Dockerのドキュメントに、DEFINITIVEの記述が追加されました。 コンテナをボリューム/秒 のパターンがあります。

Docker 1.8.x以下でのバックアップ・リストア手順は以下の通りです。

BACKUPを行います。

sudo docker run --rm --volumes-from DATA -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data

  • --rm: 終了時にコンテナを削除する
  • --volumes-from DATA: DATA コンテナによって共有されるボリュームにアタッチします。
  • -v $(pwd):/backup: カレントディレクトリをコンテナにマウントし、tar ファイルを書き込む。
  • busybox: 小さなシンプルなイメージ - クイックメンテナンスに最適
  • tar cvf /backup/backup.tar /data: /data ディレクトリにあるすべてのファイルの圧縮されていない tar ファイルを作成します。

RESTOREを行います。

# Create a new data container
$ sudo docker run -v /data -name DATA2 busybox true
# untar the backup files into the new container᾿s data volume
$ sudo docker run --rm --volumes-from DATA2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
data/
data/sven.txt
# Compare to the original container
$ sudo docker run --rm --volumes-from DATA -v `pwd`:/backup busybox ls /data
sven.txt

ここで、素敵な ブライアン・ゴフ氏による記事 コンテナとデータコンテナに同じ画像を使用することが良い理由を説明しています。