Dockerコンテナとホスト間でデータを共有する方法
序章
一般に、Dockerコンテナーは一時的なものであり、コンテナーで発行されたコマンドが完了するまで実行されます。 デフォルトでは、コンテナー内で作成されたデータは、コンテナー内からのみ、コンテナーの実行中にのみ使用できます。
Dockerボリュームを使用して、ホストシステムとDockerコンテナー間でファイルを共有できます。 たとえば、公式のDocker Nginxイメージを使用し、後で分析するためにNginxのログファイルの永続的なコピーを保持したいとします。 デフォルトでは、 nginx
Dockerイメージはにログインします /var/log/nginx
DockerNginxコンテナのディレクトリinside。 通常、ホストファイルシステムからは到達できません。
このチュートリアルでは、コンテナ内のデータをホストマシンでアクセスできるようにする方法について説明します。
前提条件
この記事をフォローするには、次のUbuntu18.04サーバーが必要です。
- root以外のユーザー
sudo
Ubuntu 18.04を使用したサーバーの初期設定ガイドに従って、特権を取得します。 - 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
フラグは非常に柔軟です。 構文を少し調整するだけで、ボリュームをバインドマウントまたは名前付けできます。 最初の引数が /
また ~/
、bindmountを作成しています。 それを削除すると、ボリュームに名前を付けることになります。
-v /path:/path/in/container
ホストディレクトリをマウントし、/path
で/path/in/container
-v path:/path/in/container
名前の付いたボリュームを作成しますpath
ホストとは関係ありません。
名前付きボリュームの詳細については、Dockerコンテナ間でデータを共有する方法を参照してください。
ステップ2—ホスト上のデータへのアクセス
これで、マシンのDockerコンテナ内で実行されているNginxのコピーと、ホストマシンのポートができました。 5000
Nginxのポートのそのコピーに直接マップします 80
.
サーバーのIPアドレスまたはホスト名とポート番号を使用して、Webブラウザにアドレスをロードします。 http://your_server_ip:5000
. 君は見るべきだ:
さらに興味深いことに、 ~/nginxlogs
ホスト上のディレクトリ、私たちは見るでしょう access.log
コンテナによって作成された nginx
これは私たちの要求を示します:
- 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コンテナー間でデータを共有する方法を参照してください。