docker compose exec コマンドでサービスと対話する方法

DockerDockerBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、実行中のサービスと対話するためにdocker compose execコマンドを効果的に使用する方法を学びます。サービスコンテナ内でコマンドを実行する方法、デタッチモードでコマンドを実行する方法、異なるユーザーとしてコマンドを実行する方法、特定の作業ディレクトリでコマンドを実行する方法について探求します。この実践的な経験を通じて、Docker 化されたアプリケーションのデバッグと管理に必要なスキルを習得できます。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/exec("Execute Command in Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") subgraph Lab Skills docker/run -.-> lab-555079{{"docker compose exec コマンドでサービスと対話する方法"}} docker/exec -.-> lab-555079{{"docker compose exec コマンドでサービスと対話する方法"}} docker/pull -.-> lab-555079{{"docker compose exec コマンドでサービスと対話する方法"}} end

実行中のサービスコンテナでコマンドを実行する

このステップでは、実行中の Docker コンテナ内でコマンドを実行する方法を学びます。これは、コンテナを停止・再起動することなく、コンテナ内で動作しているサービスをデバッグしたり対話したりする非常に便利なテクニックです。

まず、このデモンストレーション用にシンプルな Nginx イメージをプルします。ダウンロードが速くサイズが小さいnginx:alpineイメージを使用します。

docker pull nginx:alpine

イメージがプルされ展開されることを示す出力が表示されるはずです。

次に、この Nginx イメージをデタッチモードで実行します。これによりコンテナはバックグラウンドで動作し、ターミナルを占有しません。後で参照しやすいように名前も付けます。

docker run -d --name my-nginx nginx:alpine

出力には新しく作成され実行中のコンテナの ID が表示されます。

コンテナが実行中になったので、docker execコマンドを使ってコンテナ内でコマンドを実行できます。基本的な構文はdocker exec [options] container command [args...]です。コンテナのルートディレクトリにあるファイルをリストしてみましょう。

docker exec my-nginx ls /

Nginx コンテナのルートファイルシステムにあるbinetcusrなどのディレクトリとファイルのリストが表示されるはずです。これで実行中のコンテナ内でコマンドを正常に実行できたことが確認できます。

別のコマンドも試してみましょう。コンテナ内で動作している Nginx のバージョンを確認できます。

docker exec my-nginx nginx -v

出力にはコンテナにインストールされている Nginx のバージョン(例:nginx version: nginx/1.24.0)が表示されます。

これで、実行中のコンテナと対話し、その環境内で任意のコマンドを実行する方法が実証されました。

デタッチモードでコマンドを実行する

前のステップでは、-dフラグを使用してコンテナをデタッチモードで実行しました。これは、ターミナルを占有せずにコンテナをバックグラウンドで実行したい場合によく行われる方法です。このステップでは、特にdocker execを使用してデタッチモードでコマンドを実行する方法をさらに探求します。

docker execは通常、対話型セッションや実行中のコンテナで短いコマンドを実行するために使用されますが、docker exec-dフラグを付けることでデタッチモードでコマンドを実行することもできます。これは、すでに実行中のコンテナ内でバックグラウンドプロセスを開始するのに便利です。

前のステップで起動したmy-nginxコンテナを使用しましょう。デタッチモードで簡単なコマンドを実行します。例えば、5 秒ごとに現在の日付と時刻をコンテナ内のファイルに書き込むコマンドを実行してみます。

docker exec -d my-nginx sh -c 'while true; do date >> /usr/share/nginx/html/date.txt; sleep 5; done'

このコマンドの説明:

  • docker exec -d my-nginx: my-nginxコンテナ内で以下のコマンドをデタッチモードで実行
  • sh -c '...': shシェルを使用して後続のコマンド文字列を実行
  • while true; do date >> /usr/share/nginx/html/date.txt; sleep 5; done: 実行されるコマンド。現在の日付と時刻を/usr/share/nginx/html/date.txtファイルに追記し、5 秒待機してから繰り返す単純なループ

コマンドを実行すると、コンテナ ID がターミナルに表示され、コンテナ内でバックグラウンドでコマンドが開始されたことがわかります。

コマンドが実行されファイルに書き込まれていることを確認するために、date.txtファイルの内容を表示する別のコマンドを実行できます。コマンドがバックグラウンドで実行されているため、ファイルが作成され内容が書き込まれるまで数秒かかる場合があります。

docker exec my-nginx cat /usr/share/nginx/html/date.txt

出力に日付と時刻が表示され、数秒後に再度catコマンドを実行すると、ファイルに新しいエントリが追加されているのが確認できるはずです。これにより、docker exec -dで開始したバックグラウンドプロセスが期待通りに実行されていることが確認できます。

別のユーザーとしてコマンドを実行する

このステップでは、実行中のコンテナ内で特定のユーザーとしてコマンドを実行する方法を学びます。デフォルトでは、docker execはコンテナ内で root ユーザーとしてコマンドを実行しますが、-uまたは--userフラグを使用して別のユーザーを指定できます。これはセキュリティ上重要であり、最小権限の原則に従うために必要です。

引き続きmy-nginxコンテナを使用しましょう。まず、デフォルトでls /コマンドがどのユーザーとして実行されるか確認します。

docker exec my-nginx whoami

出力はおそらくrootになります。これはdocker execのデフォルトユーザーだからです。

次に、別のユーザーとしてコマンドを実行してみましょう。Nginx イメージは通常、Nginx プロセスを非 root ユーザー(多くの場合nginxという名前)で実行します。nginxユーザーとしてwhoamiコマンドを実行してみます。

docker exec -u nginx my-nginx whoami

出力はnginxとなり、コマンドがnginxユーザーとして実行されたことが確認できます。

ユーザー名の代わりにユーザーID(UID)を指定することもできます。コンテナ内のnginxユーザーの UID を確認するために、/etc/passwdファイルを見てみましょう。

docker exec my-nginx cat /etc/passwd | grep nginx

出力にはnginxユーザーのエントリが表示され、UID と GID(グループ ID)が含まれます。例えば、nginx:x:101:101:nginx user,,,:/nonexistent:/bin/falseのようになります。この例では UID は101です。

では、UID を使用してwhoamiコマンドを実行してみましょう。前のステップで見つけた実際の UID が異なる場合は、101をその値に置き換えてください。

docker exec -u 101 my-nginx whoami

出力は再びnginxとなり、docker execでユーザーを指定する際にユーザー名または UID のどちらも使用できることが実証されます。

非 root ユーザーとしてコマンドを実行することは、特に機密ファイルを操作したり、root 権限を必要としない操作を実行する場合に、優れたセキュリティプラクティスです。

特定の作業ディレクトリでコマンドを実行する

この最終ステップでは、実行中のコンテナ内で特定の作業ディレクトリを指定してコマンドを実行する方法を学びます。デフォルトでは、docker execはコンテナイメージの Dockerfile で定義された作業ディレクトリ(多くの場合/)でコマンドを実行します。しかし、-wまたは--workdirフラグを使用してこれを変更できます。これは、コンテナのファイルシステム内の特定のパスを基準にしてコマンドを実行する必要がある場合に便利です。

引き続きmy-nginxコンテナを使用しましょう。まず、作業ディレクトリを指定せずにコマンドを実行した場合のデフォルトの作業ディレクトリを確認します。これにはpwdコマンド(print working directory)を使用できます。

docker exec my-nginx pwd

出力はおそらく/(ルートディレクトリ)になります。

次に、別の作業ディレクトリでコマンドを実行してみましょう。Nginx コンテナには、Web サーバーがファイルを提供する/usr/share/nginx/htmlディレクトリがあります。このパスに作業ディレクトリを変更し、その中のファイルを一覧表示してみます。

docker exec -w /usr/share/nginx/html my-nginx ls

このコマンドの説明:

  • docker exec -w /usr/share/nginx/html my-nginx: my-nginxコンテナ内で以下のコマンドを実行し、作業ディレクトリを/usr/share/nginx/htmlに設定
  • ls: 実行するコマンドで、現在の作業ディレクトリ内のファイルを一覧表示

/usr/share/nginx/htmlディレクトリ内のファイル(前のステップで作成したindex.htmldate.txtなど)が表示されるはずです。

別の例も試してみましょう。/usr/share/nginx/html内に新しいディレクトリを作成し、その新しく作成したディレクトリに作業ディレクトリを変更してからコマンドを実行します。

docker exec my-nginx mkdir /usr/share/nginx/html/new_dir
docker exec -w /usr/share/nginx/html/new_dir my-nginx pwd

最初のコマンドは/usr/share/nginx/html内にnew_dirというディレクトリを作成します。2 番目のコマンドは作業ディレクトリを/usr/share/nginx/html/new_dirに変更し、現在の作業ディレクトリを表示します。

2 番目のコマンドの出力は/usr/share/nginx/html/new_dirとなり、pwdコマンドの実行のために作業ディレクトリが正常に変更されたことが確認できます。

docker exec-wフラグを使用すると、コンテナ内の特定のディレクトリをコンテキストとしてコマンドを実行できるため、コンテナのファイルシステムを効率的に操作するのに非常に役立ちます。

まとめ

この実験では、実行中の Docker コンテナと対話するためにdocker execコマンドを使用する方法を学びました。コンテナ内でコマンドを実行する練習を行い、特にファイルの一覧表示や Nginx バージョンの確認を行い、サービスを停止することなくデバッグや対話を行う能力を実証しました。

また、-dフラグを使用してコンテナをデタッチドモードで実行する基本概念にも簡単に触れました。後続のステップは詳細に説明されていませんが、初期のステップで実行中のコンテナ環境内でコマンドを実行する方法を理解するための確かな基礎が提供されました。