Dockerコンテナとホスト間でデータを共有する方法

前書き

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

Dockerボリュームを使用して、ホストシステムとDockerコンテナ間でファイルを共有できます。 たとえば、公式のDocker Nginxイメージを使用し、後で分析するためにNginxのログファイルの永続的なコピーを保持したいとします。 デフォルトでは、nginx Dockerイメージは/var/log/nginxディレクトリinside DockerNginxコンテナにログを記録します。 通常、ホストファイルシステムからは到達できません。

このチュートリアルでは、ホストマシンでアクセス可能なコンテナ内からデータを作成する方法を調べます。

前提条件

この記事を読むには、次のものを備えたUbuntu 18.04サーバーが必要です。

Dockerを初めて使用する場合は、The Docker Ecosystemシリーズで主要な概念の詳細な概要を説明します。

[.note]#Note:前提条件にUbuntu 18.04にDockerをインストールする手順が記載されていますが、この記事のDockerデータボリュームのdockerコマンドは、Dockerがインストールされている限り他のオペレーティングシステムでも機能します。

[[step-1 -—- bindmounting-a-volume]] ==ステップ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 "daemon off"が発行されてNginxが起動します。

[。注意]##

Note:-vフラグは非常に柔軟です。 構文をわずかに調整するだけで、ボリュームをバインドマウントしたり、ボリュームに名前を付けたりできます。 最初の引数が/または~/で始まる場合は、バインドマウントを作成しています。 それを削除すると、ボリュームに名前が付けられます。

  • -v /path:/path/in/containerはホストディレクトリをマウントし、/path/path/in/containerにマウントします

  • -v path:/path/in/containerは、ホストとは関係のないpathという名前のボリュームを作成します。

名前付きボリュームの詳細については、How to Share Data Between Docker Containers
を参照してください。

[[step-2 -—- accessing-data-on-the-host]] ==ステップ2—ホスト上のデータへのアクセス

これで、マシンのDockerコンテナ内でNginxのコピーが実行され、ホストマシンのポート5000がNginxのポート80のコピーに直接マップされます。

サーバーのIPアドレスまたはホスト名とポート番号http://your_server_ip:5000を使用して、Webブラウザーにアドレスをロードします。 君は見るべきだ:

Nginx Start Page

さらに興味深いことに、ホストの~/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データボリュームを作成する方法を示しました。 これは、デバッグのためにログにアクセスする必要がある開発環境で役立ちます。 コンテナ間で永続データを共有する方法の詳細については、How To Share Data between Docker Containersを参照してください。

Related