序章
一般に、Dockerコンテナーは一時的なものであり、コンテナーで発行されたコマンドが完了するまで実行されます。 デフォルトでは、コンテナー内で作成されたデータは、コンテナー内からのみ、コンテナーの実行中にのみ使用できます。
Dockerボリュームを使用して、ホストシステムとDockerコンテナー間でファイルを共有できます。 たとえば、公式のDocker Nginxイメージを使用し、後で分析するためにNginxのログファイルの永続的なコピーを保持したいとします。 デフォルトでは、nginx
Dockerイメージは/var/log/nginx
ディレクトリinsideDockerNginxコンテナーにログを記録します。 通常、ホストファイルシステムからは到達できません。
このチュートリアルでは、コンテナ内のデータをホストマシンでアクセスできるようにする方法について説明します。
前提条件
この記事をフォローするには、次のUbuntu18.04サーバーが必要です。
- Ubuntu 18.04 の初期サーバー設定ガイドに従って、
sudo
権限を持つ非rootユーザー。 - Dockerは、 Ubuntu18.04にDockerをインストールして使用する方法のステップ1およびステップ2の手順に従ってインストールされます。
Dockerを初めて使用する場合は、 Dockerエコシステムシリーズで、主要な概念の詳細な概要を説明します。
注:前提条件にUbuntu 18.04にDockerをインストールする手順が記載されていますが、この記事のDockerデータボリュームのdocker
コマンドは、Dockerがインストールされている限り他のオペレーティングシステムでも機能します。
ステップ1—ボリュームのバインドマウント
次のコマンドは、現在のユーザーのホームディレクトリにnginxlogs
というディレクトリを作成し、それをコンテナの/var/log/nginx
にバインドマウントします。
docker run --name=nginx -d -v ~/nginxlogs:/var/log/nginx -p 5000:80 nginx
このコマンドを詳しく調べてみましょう。
--name=nginx
はコンテナに名前を付けて、より簡単に参照できるようにします。-d
はプロセスを切り離し、バックグラウンドで実行します。 そうしないと、空のNginxプロンプトを監視しているだけで、Nginxを強制終了するまでこの端末を使用できません。-v ~/nginxlogs:/var/log/nginx
は、/var/log/nginx
ディレクトリをNginxコンテナ内からホストマシンの~/nginxlogs
ディレクトリにリンクするバインドマウントボリュームをセットアップします。 Dockerは:
を使用して、ホストのパスをコンテナーパスから分割し、ホストパスが常に最初に来ます。-p 5000:80
はポートフォワードを設定します。 Nginxコンテナは、デフォルトでポート80
でリッスンしています。 このフラグは、コンテナのポート80
をホストシステムのポート5000
にマップします。nginx
は、コンテナーをNginxイメージから構築する必要があることを指定します。これにより、コマンド nginx -g "daemonoff"が発行されてNginxが起動します。
注:-v
フラグは非常に柔軟です。 構文を少し調整するだけで、ボリュームをバインドマウントまたは名前付けできます。 最初の引数が/
または~/
で始まる場合は、バインドマウントを作成しています。 それを削除すると、ボリュームに名前を付けることになります。
-v /path:/path/in/container
は、ホストディレクトリ/path
を/path/in/container
にマウントします。-v path:/path/in/container
は、ホストとは関係のないpath
という名前のボリュームを作成します。
名前付きボリュームの詳細については、Dockerコンテナ間でデータを共有する方法を参照してください。
ステップ2—ホスト上のデータへのアクセス
これで、マシンのDockerコンテナ内でNginxのコピーが実行され、ホストマシンのポート5000
がNginxのポート80
のコピーに直接マップされます。
サーバーのIPアドレスまたはホスト名とポート番号http://your_server_ip:5000
を使用して、Webブラウザーにアドレスをロードします。 君は見るべきだ:
さらに興味深いことに、ホストの~/nginxlogs
ディレクトリを見ると、コンテナのnginx
によって作成されたaccess.log
が表示され、リクエストが表示されます。
cat ~/nginxlogs/access.log
これは次のように表示されます。
Output203.0.113.0 - - [11/Jul/2018:00:59:11 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36" "-"
~/nginxlogs
フォルダーに変更を加えると、Dockerコンテナー内からもリアルタイムで変更を確認できます。
結論
このチュートリアルでは、コンテナとホストファイルシステム間で情報を共有するためのDockerデータボリュームを作成する方法を示しました。 これは、デバッグのためにログにアクセスする必要がある開発環境で役立ちます。 コンテナー間で永続データを共有する方法の詳細については、Dockerコンテナー間でデータを共有する方法を参照してください。