はじめに
Dockerデータボリュームは、アプリケーションをコンテナ化する際に重要な概念です。この概念を理解することは、コンテナ化されたアプリケーションの最高の体験を保証するとともに、信頼性の高い永続化とデータ管理を実現するために不可欠です。しかし、この概念は重要である一方で、多くの開発者にとって混乱しやすく複雑なものでもあります。開発者やDevOpsスペシャリストにとって、Dockerデータボリュームのセットアップ方法を理解し、その正しい使用方法を把握し、さまざまな種類のボリュームと、アプリケーションにどのタイプを選択すべきかを知ることは重要です。
このチュートリアルでは、Dockerデータボリュームの概念と使用方法の解説に焦点を当てています。このチュートリアルを完了すると、あらゆるタイプのDockerデータボリュームのセットアップと操作をマスターできるようになります。
前提条件
このチュートリアルを進めるには、以下のアイテムが必要です。
- Ubuntuがインストールされていること。当社のUbuntu 18.04サーバーのセットアップ方法チュートリアルをクイックリファレンスとして参照してください。
- sudo権限を持つUbuntuユーザー。Linuxに慣れていない場合、このステップは特に複雑に感じられるかもしれません。詳細なガイドについては、Linux Sudoersファイルの構成を参照してください。
- DockerがUbuntuにインストールされていること。UbuntuにDockerをインストールするには、当社のパブリッククラウド上のUbuntuでDockerをインストール&操作する方法ブログに従ってください。
このチュートリアルではUbuntu上でのDockerの管理に焦点を当てていますが、 docker コマンドは、Dockerがインストールされているすべてのオペレーティングシステムに適用できます。
Dockerコンテナの仕組みを理解する
Dockerデータボリュームを完全に理解するには、Dockerコンテナがどのように機能するかを知る必要があります。このセクションでは、Dockerの新規ユーザー向けに基本事項を説明します。Dockerの仕組みをすでにご存知の方や、Dockerの経験豊富なユーザーの方は、このセクションをスキップしてデータボリュームから始めていただいて構いません。
Dockerコンテナは、Dockerプラットフォームをインストールすることで、ホストオペレーティングシステム上でアプリケーションを実行できるようにします。Dockerプラットフォームがホストオペレーティングシステムにインストールされるため、ホストマシンとゲストアプリケーションの間に抽象化が形成されます。仮想マシンとは異なり、DockerコンテナはLinuxカーネルをホストオペレーティングシステムと共有します。Dockerはホストマシンの上に追加のオペレーティングシステムをインストールする必要がないため、Dockerアプリケーションは軽量であり、そのホストマシンにDockerがインストールされている限り、すべてのホストマシンからアクセス可能です。
追加のゲストOSがないため、Dockerプラットフォームはホストマシンとリソースを共有します。Dockerアプリケーションの起動は迅速ですが、リソースを共有する必要がある場合に複雑さが生じます。Dockerには、データ永続化のための独自のメモリやストレージがありません。これらのリソースはホストマシンから提供される必要があります。仮想マシンの使用に慣れている人は、このリソースの共有と管理のプロセスを難しく感じる傾向があります。適切な知識がないと、予期しない望ましくない結果を招く可能性があります。このチュートリアルは読者がDockerエコシステムに精通していることを前提としていますが、簡単な復習として、当社の詳細なチュートリアルであるDockerとは?Dockerエコシステムの概要を自由にご覧ください。
Dockerデータボリュームを使用したデータの永続化
Dockerを使用する場合、その内部に直接ボリュームを作成することはできません。そのため、データを保存するには、ボリュームがアタッチされたDockerボリュームコンテナを作成する必要があります。Dockerアプリケーションをこのデータボリュームコンテナに接続するために、Docker’sの --volume-from コマンドを使用してコンテナを取得し、アプリケーションにアタッチします。
プロセスをステップバイステップで説明します。
- まず、
my-container という名前の新しいコンテナを、以下のコマンドを実行して作成します。
1docker create -v /tmp --name my-container ubuntu
これにより、 /tmp フォルダ内に新しいコンテナが作成されます。必要に応じてフォルダディレクトリを変更できます。 - データコンテナの準備ができたら、
--volume-from フラグを指定して新しいUbuntuコンテナを実行し、次に
bash を実行します。私たちが以下のフォルダに書き込むものはすべて:
tmp ディレクトリは、ホストマシンの
/tmp フォルダに保存されます:
1docker run -t -i --volumes-from my-container ubuntu /bin/bash
The -t コマンドラインオプションは、コンテナ内からターミナルを呼び出します。 -i フラグは接続をインタラクティブにします。Ubuntuコンテナのbashプロンプトで、 /tmp:
1echo "Some sample data" > /tmp/sample_file - 最後に、
exit コマンドを実行してこの bash を終了します。次に、以下のコマンドを実行します:
1docker run -t -i --volumes-from my-container ubuntu /bin/bash
このディレクトリに sample_file が見つかります。指定するボリュームの数に制限はありません。以下の --volumes-from フラグを使用することで、必要な数だけボリュームを追加できます。また、データボリュームコンテナも好きなだけ作成できます。
ホストとDockerコンテナ間でのデータへのアクセス
仮想化の経験がある読者にとって、このオプションは仮想マシンの共有フォルダオプションに似ています。ここでは、 data-only 専用コンテナを作成する代わりに、Dockerイメージを使用してDockerアプリケーションを実行し、そのディレクトリの1つをホストシステム上のディレクトリの内容で上書きします。
一般的なシナリオとしては、ログファイルをホストマシンに保存することが挙げられます。これは、マシン内部に入ることなく、必要に応じてこれらのファイルを分析できるようにするために必要となる場合があります。このシナリオでは、Docker Nginxイメージ を使用しており、そのログファイルをホストマシンに保存したいと仮定します。Nginx Dockerイメージはログを /var/log/nginx ディレクトリに書き込みますが、これはDocker Nginxコンテナ内部の /var/log/nginx です。そのため、この場所にはホストマシンからアクセスできません。
この目的を達成するには、ホストマシンとDocker Nginxイメージの間でログを保存するための共有フォルダを作成する必要があります。以下に、このプロセスを簡単なステップバイステップのガイドで説明します:
- まず、ログを保存するディレクトリをホストマシンに作成します:
次に、以下のコマンドを実行してコンテナを起動します:1mkdir ~/my-nginxlogs
1docker run -d -v ~/my-nginxlogs:/var/log/nginx -p 5000:80 -i nginx
- この
run コマンドはいくつかの引数を受け取るため、よりよく理解するために細かく分解してみましょう:
- -p 5000:80:ポートフォワードを設定します。Nginxコンテナはデフォルトでポート 80 でリッスンしており、これによりNginxコンテナのポート 80 をホストシステムのポート 5000 にマッピングします。
- -d:プロセスをデタッチし、バックグラウンドで実行します。
- -v ~/my-nginxlogs:/var/log/nginx:Nginxコンテナ内部の /var/log/nginx ディレクトリを、ホストマシンの /my-nginxlogs ディレクトリにリンクします。この : はホストのパスとコンテナのパスを分割します。常にホストのパスが最初に来ます。
Nginxコンテナが起動したので、まずWebブラウザを開いてURL: 5000 ポートでNginxサーバーが動作しているか、Webブラウザを開いて次のURLを実行して確認します:http://localhost:5000。ウェルカムページが表示されれば、Nginxサーバーの準備は完了しており、その /var/log/nginx フォルダにログを作成しています。
ホストマシンの /my-nginxlogs フォルダを開くと、ここにDocker Nginxコンテナからのログファイルが表示されます。Nginxコンテナの実行中にホストマシンの /my-nginxlogs フォルダに変更を加えると、その変更はコンテナの /var/log/nginx フォルダにも反映されます。
まとめ
このチュートリアルでは、Dockerデータボリュームを理解するために包括的なアプローチをとりました。アプリケーション用のボリュームの作成、ホストとDockerコンテナ間でのデータ共有、データの種類、およびデータの永続化について説明しました。これにより、コンテナ化されたアプリケーションでのデータの永続化や、アプリケーションの状態と設定の管理に役立ちます。
Dockerについてのさらなる学習には、当ブログ:
- の「Ubuntu 20.04上のGitLabセルフマネージドインスタンスでDockerイメージリポジトリをホストし、Dockerイメージをビルドする方法」をご覧ください。
- Ubuntu 20.04でDockerを使用してFlaskアプリケーションをビルドおよびデプロイする方法
- Ubuntu 18.04でプライベートDockerレジストリをセットアップする方法
- Dockerコンテナとホストの間でデータを共有する方法
- Dockerリソース(イメージ、コンテナ、ボリューム)のクリーンアップ
ハッピーコンピューティング!
コメント
コメントはまだありません。最初のコメントを投稿しましょう。