はじめに
この実験では、実行中のサービスと対話するためにdocker compose exec
コマンドを効果的に使用する方法を学びます。サービスコンテナ内でコマンドを実行する方法、デタッチモードでコマンドを実行する方法、異なるユーザーとしてコマンドを実行する方法、特定の作業ディレクトリでコマンドを実行する方法について探求します。この実践的な経験を通じて、Docker 化されたアプリケーションのデバッグと管理に必要なスキルを習得できます。
💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください
この実験では、実行中のサービスと対話するためにdocker compose exec
コマンドを効果的に使用する方法を学びます。サービスコンテナ内でコマンドを実行する方法、デタッチモードでコマンドを実行する方法、異なるユーザーとしてコマンドを実行する方法、特定の作業ディレクトリでコマンドを実行する方法について探求します。この実践的な経験を通じて、Docker 化されたアプリケーションのデバッグと管理に必要なスキルを習得できます。
このステップでは、実行中の 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 コンテナのルートファイルシステムにあるbin
、etc
、usr
などのディレクトリとファイルのリストが表示されるはずです。これで実行中のコンテナ内でコマンドを正常に実行できたことが確認できます。
別のコマンドも試してみましょう。コンテナ内で動作している 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.html
やdate.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
フラグを使用してコンテナをデタッチドモードで実行する基本概念にも簡単に触れました。後続のステップは詳細に説明されていませんが、初期のステップで実行中のコンテナ環境内でコマンドを実行する方法を理解するための確かな基礎が提供されました。