GNU/Linux >> Linux の 問題 >  >> Panels >> Docker

DockerコンテナデータをDockerボリュームに保存する方法

データを含むコンテナを自動化するための1つのオプションは、コンテナイメージ内にデータを保存することです。ただし、これには、実行する各コンテナーにデータのコピーが含まれている必要があります。これにより、コンテナーをスケールアップすると、リソースが無駄になる可能性があります。より良いオプションは、データの1つのコピーをDockerボリュームに保存してから、そのボリュームをコンテナー間で共有することです。

Dockerボリュームは、コンテナーファイルシステムの外部に存在するが、同じホストで実行されているコンテナーからアクセスできるフォルダーと考えることができます。新しいコンテナを作成するときは、既存のボリュームをマウントするか、新しいボリュームを作成することができます。新しいボリュームを作成すると、Dockerは基盤となるホストファイルシステムに新しいストレージレイヤーを自動的に作成し、指定したデータで初期化します。

ボリュームを作成すると、それを使用して、静的ファイル、アプリケーションデータ、ログなど、あらゆる種類のデータを保存できます。ボリュームを使用して、コンテナ間でデータを共有することもできます。

たとえば、1つのコンテナーで実行されるWebアプリケーションがある場合、ボリュームを使用してアプリケーションのソースコードを格納し、デプロイメント内の他のコンテナーがそれにアクセスできるようにすることができます。これにより、アプリケーションのソースコードをランタイム環境から分離しておくことができ、アプリケーションの更新と再デプロイが容易になります。

コンテナー間でデータを共有することに加えて、コンテナーを停止および開始するときにボリュームを使用してデータを永続化することもできます。これは、コンテナが誤って削除または停止された場合でも、データを安全に保つための優れた方法です。

このガイドでは、Dockerボリュームがコンテナーとどのように相互作用するかを学習します。これを行うには、新しいコンテナーを作成し、ボリュームを使用してコンテナー間でデータを保存および共有します。次に、コンテナによって自動的に生成される匿名ボリュームによって残されたスペースをクリアする方法を発見します。最後に、Dockerボリュームデータをバックアップする方法を学習します。

始めましょう!

前提条件
  • このガイドに従うには、Dockerコンテナの操作の基本に精通している必要があります。
  • このガイドは、Linuxホストを使用していることを前提としています。このガイドではCentOSを使用していますが、他のLinuxディストリビューションでも同じ手順で機能するはずです。
  • Dockerがホストにインストールされて実行されている必要があります。まだインストールしていない場合は、インストールガイドの手順に従ってください。
  • root権限を持つユーザーアカウント
  • LinuxホストにDockerがインストールされています。
匿名のDockerボリュームの検出

新しいDockerコンテナを作成すると、デフォルトで新しい匿名ボリュームがホストファイルシステムに作成されます。このボリュームは、コンテナに必要なデータを保存するために使用されます。

1.次のコマンドを実行して、dockerが実行されアクティブであるかどうかを確認します。

 sudo systemctl status docker 

2.次のコマンドを実行して、ユーザーアカウントをdockerグループに追加し、sudoを使用せずにdockerコマンドを実行できるようにします。 Dockerグループにユーザーアカウントを追加したら、ログアウトしてから再度ログインし、変更を有効にします。

 sudo usermod -aG docker $(whoami)

3.次のコマンドを実行して、Dockerレジストリからホストにいくつかのイメージをプルします。これらのイメージを使用して、Dockerボリュームの作成と操作を練習します。

 docker pull postgres:12.1 
 docker pull bash 
 docker pull httpd:2.4 

4.次のコマンドを実行して、現在ホスト上にあるイメージを一覧表示し、イメージがプルされたことを確認します。

docker画像

5.次のコマンドを実行して、ホストにアクティブなボリュームがあるかどうかを確認します。次のような出力が表示されます。

 docker volume ls 

空の出力が表示されるはずです。

6.次のコマンドを実行して新しいコンテナを作成し、ホスト上に新しい匿名ボリュームが作成されたことを確認します。 -dフラグを使用して、コンテナーをデタッチモードで実行し、ターミナルでの作業を続行できるようにします。 --nameフラグを使用してコンテナに名前を付け、簡単に識別できるようにします。 Postgresはデータを保存するためにバックグラウンドボリュームを必要とするため、ここではpostgres:12.1イメージを使用します。 2つのコンテナを実行する必要があります。1つはPostgresデータベースごとに1つで、適切な測定と詳細情報を確認できます。

 docker run -d --name db1 postgres:12.1 
 docker run -d --name db2 postgres:12.1 

7.以下のdockerコマンドを実行して、ホストで現在実行されているコンテナーを一覧表示します。

 docker ps 

これで、2つのコンテナができました: db1 およびdb2、 以下に示すように。

8.次に、ホスト上に作成されたボリュームを一覧表示します。

 docker volume ls 

次のような出力が表示されます。 Postgresが起動すると、データを保存する場所が必要になります。 Postgresはデータを失いたくないので、Postgresは自動的に匿名ボリュームを作成します。ボリュームには、16進文字のランダムな文字列が追加された名前が付けられます( e9f338 ... およびee3423...

dockerinspectコマンドを使用してボリュームを詳しく見てみましょう。

9.以下のコマンドを実行して、人間が読める形式でdb1コンテナーに関する詳細情報を取得します。

 docker inspect db1 -f'{{json .Mounts}}' | python -m json.tool 

以下に示すように、 e9f338 名前 行は、上記のdockervolumelsコマンド出力の出力と一致します。この行は、このボリュームが db1 に関連付けられ、マウントされていることを示しています。 コンテナ。

10.同じことを行ってdb2を検査します コンテナ。

 docker inspect db2 -f'{{json .Mounts}}' | python -m json.tool 

出力がdb1とまったく同じであることがわかります。 異なるボリューム名を除いて、コンテナ。この出力は、Dockerが作成されたコンテナーごとに新しい匿名ボリュームを作成することを確認します。

11.もう1つのコンテナを実行します。ただし、今回は--rmフラグを使用して、ボリュームで何が発生するかを確認します。このコンテナにdbTmpという名前を付けました。調べてみましょう!

 docker run -d --rm --name dbTmp postgres:12.1 

現在、3つのコンテナがあります: db1 db2、 およびdbTmp 稼働中

 docker ps 

12.ボリュームを再度リストします。

 docker volume ls 

dbTmp用に3番目のボリュームが作成されていることに気付くでしょう。 コンテナ

13.ここで、以下のコマンドを使用して、db2とdbTmpコンテナーを停止します。

docker stop db2 dbTmp

13.コンテナーとボリュームを再度リストします。

docker ps

 docker volume ls 

以下に示すように、実行されたままのコンテナーはdb1コンテナーのみです。ただし、dbTempコンテナーのボリュームはなくなりましたが、db2コンテナーのボリューム( ee3423 ... )はまだあります。

この動作は予想されます。 --rmフラグは、コンテナが停止した後、関連するボリュームとともにコンテナを削除します。 dbTempコンテナを停止したため、dbTmpコンテナのボリュームがなくなりました。 db2コンテナーを作成したときに--rmフラグを指定しなかったため、コンテナーを停止しても、db2コンテナーとそれに関連するボリュームはホスト上に残ります。この例からのポイントは、-rmフラグに注意する必要があるということです。ボリュームが関連付けられているコンテナを停止すると、ボリュームが削除されます。

Dockerボリュームの作成

Dockerボリュームは、dockervolumecreateコマンドを使用して作成する名前付きストレージコンテナーです。次に、ボリュームを使用してデータを保存したり、コンテナ間でデータを共有したりします。

1.次のコマンドを実行して、websiteという名前の新しいボリュームを作成します。

 docker volume create website 

2.ボリュームを一覧表示すると、作成したばかりの新しいボリュームが表示されます。

 docker volume ls 

3.このウェブサイトコードをGitHubから現在の作業ディレクトリにダウンロードします。

4.以下のコマンドを実行して、ダウンロードしたWebサイトコードをWebサイトボリュームにコピーします。

 sudo cp -r / home / cloud_user / widget-factory-inc / web / * / var / lib / docker / bytes / website / _data / 

5.以下のコマンドを実行して、Webサイトボリューム内のファイルを一覧表示します。

 sudo ls -l / var / lib / docker / bytes / website / _data / 

これで、WebサイトコードがWebサイトボリュームに保存されていることがわかります。

6.これで、新しいコンテナを起動して、Webサイトボリュームをそのコンテナにアタッチできます。 -v(ボリューム)フラグを使用して、ボリュームをマウントします。 -p(ポートマッピング)フラグを使用して、ホスト上のポートをコンテナ内のポートにマップします。この例では、ホストのポート80をコンテナのポート80にマッピングしています。 Web1はコンテナの名前です。

 docker run -d --name web1 -p 80:80 -v website:/ usr / local / apache2 / htdocs:ro httpd:2.4 

7.これで、Webサイトはweb1コンテナーから提供されます。 docker psコマンドを実行して、web1コンテナーのステータスを確認します。 Webサイトがweb1コンテナから提供されていることがわかります。以下に示すように、Webサイトが提供されているポート(80)も確認できます。

8. WebブラウザでホストマシンのIPアドレスを開いて、コピーしたばかりのWebサイトを表示できます。

9.次に、-rmフラグを指定してwebTmpという名前のコンテナーをもう1つ実行し、webTmpコンテナーを停止したときにWebサイトのボリュームがどうなるかを確認します。

 docker run -d --name webTmp --rm -v website:/ usr / local / apache2 / htdocs:ro httpd:2.4 

10. docker psコマンドshowを実行して、webTmpコンテナが実行されていることを確認します。

 docker ps 

11.ここで、webTmpコンテナを停止し、ボリュームを一覧表示します。

 docker stop webTmp 

Dockerボリュームls

この記事の冒頭で覚えているように、コンテナーを停止すると、関連付けられているボリュームも削除されます。しかし今回は、以下に示すように、Webサイトのボリュームがまだそこにあることがわかります。では、何が起こったのですか?

この例の重要なポイントは、コンテナーを停止しても、そのコンテナーに関連付けられているボリュームのデータは、ボリュームが別のコンテナーによって使用されている限り削除されないことです。この場合、Webサイトボリュームはまだweb1コンテナによって使用されています。これは、Dockerボリュームを操作するときに覚えておくべき非常に重要なポイントです。

未使用のボリュームを取り除く

ボリュームはデータを保存して整理するための優れた方法ですが、使用されていない場合はディスク容量を大量に消費する可能性もあります。ボリュームを使用していない場合は、システムからボリュームを削除してディスク領域を解放することをお勧めします。幸い、Dockerには、システムから未使用のボリュームを削除するために必要なすべてのツールが用意されています。

1. docker volume pruneコマンドを実行して、ぶら下がっているリソース(イメージ、ネットワーク、ボリューム、およびコンテナー)を削除します。ぶら下がっているリソースは、現在コンテナに関連付けられていないDockerオブジェクトです。ただし、ボリュームを削除する前に、コンテナーがそのボリュームを使用していないことを確認してください。たとえば、db2コンテナーに関連付けられている未使用のボリュームを削除する前に、db2コンテナーを削除する必要があります。

 docker stop db2 
 docker rm db2 
 docker volume prune 

2.ボリュームを一覧表示すると、db2ボリュームがなくなっていることがわかります。

 docker volume ls 

3.以下を実行して、Webサイトのボリュームデータの場所を見つけ、バックアップできるようにします。

 docker volume inspectwebsite 

Webサイトのマウントポイントが表示されます。マウントポイントは、Dockerボリュームがマウントされるホストオペレーティングシステム上のディレクトリです。この例では、マウントポイントは / var / lib / docker / bytes / website / _data 、以下に示すように。

4. tarコマンドを使用して、Webサイトボリュームのコンテンツをバックアップできます。それは長い間存在していて、ほとんどのプラットフォームでサポートされています。 tarコマンドを使用して、すべてのサブディレクトリとファイルを含むディレクトリをバックアップできます。

:このコマンドはrootユーザーとして実行する必要があります。そうしないと、以下に示すように、マウントされたDockerボリュームに書き込む権限がありません。

 tar czf / tmp / website _ $(date +%Y-%m-%d-%H%M).tgz -C/var/lib/docker/volumes/website/_data。

5.以下のコマンドを実行して、tarバックアップファイルが正常に作成されたことを確認します。

 ls -l /tmp/website_*.tgz 

6.以下のコマンドを実行して、バックアップファイルに正しいデータが含まれていることを確認します。 YOUR_BACKUP_FILE_NAMEをバックアップファイルの実際の名前に置き換えます。

 tar tf /tmp/ .tgz 

7.次に、Webサイトボリュームを使用してもう1つのコンテナーを実行しましょう。今回は、-itフラグを使用してコンテナーと対話し、バックアップをテストします。

 docker run -it --rm -v website:/ website -v / tmp:/ backup bash tar czf / backup / website _ $(date +%Y-%m-%d-%H-%M)。 tgz -C/website。

8.ボリュームディレクトリに移動し、すべてのWebサイトデータを削除します。

9.ディレクトリの内容を一覧表示して、Webサイトのデータがなくなっていることを確認します。

 ls -l <​​/ pre> 

10.以下のコマンドを実行して、Webサイトのデータを復元します。 をバックアップファイルの実際の名前に置き換えます。

 tar xf.tgz。

11.ディレクトリの内容を一覧表示して、Webサイトのデータが復元されたことを確認します。

 ls -l <​​/ pre> 

結論

このガイドでは、Dockerボリュームを作成、バックアップ、およびデータを復元する方法を学習しました。 Dockerボリュームのマウントポイントの場所も学びました。

Dockerは、アプリケーションのデプロイを容易にするため、最近多くの人気を集めています。しかし、大きな力には大きな責任が伴います。災害が発生した場合のデータ損失を防ぐために、Dockerボリュームをバックアップすることが重要です。

Dockerについて学ぶことはたくさんあります。 Dockerについてさらに詳しく知りたい場合は、Dockerのドキュメントを確認することをお勧めします。このドキュメントには、dockerを起動して実行するために必要なすべての情報が記載されています。


Docker
  1. Dockerを使用してWordPressをインストールする方法

  2. DockerコンテナでMySQLを実行する方法

  3. DockerコンテナにSSHで接続する方法

  1. Anaconda Python DataScienceDockerコンテナを構築する方法

  2. DockerコンテナにVimをインストールする方法

  3. Dockerコンテナを一覧表示する方法

  1. Dockerコンテナ内でプログラムを実行する方法は?

  2. 実行中のDockerコンテナでコマンドを実行する方法

  3. Dockerコンテナに静的IPを割り当てる方法