序章

一般に、Dockerコンテナーは一時的なものであり、コンテナーで発行されたコマンドが完了するまで実行されます。 デフォルトでは、コンテナー内で作成されたデータは、コンテナー内からのみ、コンテナーの実行中にのみ使用できます。

Dockerボリュームを使用して、ホストシステムとDockerコンテナー間でファイルを共有できます。 たとえば、公式のDocker Nginxイメージを使用し、後で分析するためにNginxのログファイルの永続的なコピーを保持したいとします。 デフォルトでは、nginxDockerイメージは/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にバインドマウントします。

  1. 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ブラウザーにアドレスをロードします。 君は見るべきだ:

Nginx Start Page

さらに興味深いことに、ホストの~/nginxlogsディレクトリを見ると、コンテナのnginxによって作成されたaccess.logが表示され、リクエストが表示されます。

  1. cat ~/nginxlogs/access.log

これは次のように表示されます。

Output
203.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コンテナー間でデータを共有する方法を参照してください。