実行中のコンテナでコマンドを実行する docker container exec コマンドの使い方

DockerDockerBeginner
今すぐ練習

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

はじめに

この実験では、実行中の Docker コンテナ内でコマンドを実行するためにdocker container execコマンドを効果的に使用する方法を学びます。まず実行用のコンテナを起動し、実行中のコンテナで単一コマンドを実行する方法や、より複雑な操作のためにインタラクティブシェルを起動する方法を探ります。

さらに、この実験では環境変数を設定したりexecプロセスの作業ディレクトリを指定することで実行環境をカスタマイズする方法もカバーします。これにより、実行中のコンテナを管理し操作するスキルを習得できます。


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/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/exec("Execute Command in Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") subgraph Lab Skills docker/run -.-> lab-555108{{"実行中のコンテナでコマンドを実行する docker container exec コマンドの使い方"}} docker/ps -.-> lab-555108{{"実行中のコンテナでコマンドを実行する docker container exec コマンドの使い方"}} docker/exec -.-> lab-555108{{"実行中のコンテナでコマンドを実行する docker container exec コマンドの使い方"}} docker/pull -.-> lab-555108{{"実行中のコンテナでコマンドを実行する docker container exec コマンドの使い方"}} end

実行用コンテナの起動

このステップでは、Docker コンテナを起動し、その内部でコマンドを実行する方法を学びます。Docker コンテナは、アプリケーションとその依存関係をカプセル化した軽量でポータブルな自己完結型のユニットです。

まず、Docker Hub からubuntuイメージをプルします。このイメージには最小限の Ubuntu オペレーティングシステム環境が含まれています。

docker pull ubuntu:latest

イメージがダウンロードされていることを示す出力が表示されるはずです。ダウンロードが完了したら、このイメージを基にコンテナを起動し、簡単なコマンドを実行できます。ここではechoコマンドを使用してメッセージを表示します。

docker run ubuntu:latest echo "Hello from Docker container!"

このコマンドを分解してみましょう:

  • docker run: 新しいコンテナを作成して起動するコマンド
  • ubuntu:latest: コンテナで使用するイメージを指定。ubuntuがイメージ名、latestは最新バージョンを示すタグ
  • echo "Hello from Docker container!": コンテナ内で実行されるコマンド

ターミナルにHello from Docker container!という出力が表示されるはずです。これにより、コンテナが正常に起動し、コマンドが実行されたことが確認できます。

実行中のコンテナでコマンドを実行する

前のステップでは、コンテナを起動してコマンドを実行し、その後コンテナが終了しました。このステップでは、すでに実行中のコンテナ内でコマンドを実行する方法を学びます。これは、実行中のコンテナの状態を確認したり、管理タスクを実行したりするのに便利です。

まず、実行し続けるコンテナを起動しましょう。再びubuntuイメージを使用し、sleep infinityのようなコンテナを維持するコマンドを実行します。

docker run -d ubuntu:latest sleep infinity

使用したオプションを見てみましょう:

  • -d: このオプションはコンテナをデタッチドモードで実行し、バックグラウンドで動作してターミナルをブロックしません
  • sleep infinity: コンテナ内で実行されるこのコマンドは、コンテナを無期限にスリープ状態に保ちます

次に、実行中のコンテナの Container ID を取得します。docker psコマンドを使用して実行中のコンテナを一覧表示できます。

docker ps

実行中のコンテナを示す次のような出力が表示されるはずです:

CONTAINER ID   IMAGE          COMMAND           CREATED         STATUS         PORTS     NAMES
<container_id>   ubuntu:latest   "sleep infinity"   About a minute ago   Up About a minute             <container_name>

出力からCONTAINER IDをコピーします。次に、docker execコマンドを使用してこの実行中のコンテナ内でコマンドを実行できます。<container_id>を実際にコピーした ID に置き換えてください。

docker exec / < container_id > ls

このコマンドは指定したコンテナ内でls /を実行し、コンテナのファイルシステム内のルートディレクトリの内容を一覧表示します。Linux システムで見られるようなディレクトリとファイルのリストが表示されるはずです。

これにより、コンテナを停止または再起動することなく、実行中のコンテナ内でコマンドを実行する方法が示されました。

実行中のコンテナでインタラクティブシェルを実行する

前のステップでは、実行中のコンテナで単一のコマンドを実行しました。多くの場合、問題のデバッグやファイルシステムの調査など、実行中のコンテナとより広範にやり取りする必要があるでしょう。このステップでは、実行中のコンテナ内でインタラクティブなシェルセッションを開く方法を学びます。

前のステップで起動したubuntuコンテナを引き続き使用します。コンテナが実行されていない場合は、前のステップのコマンドで再起動できます:

docker run -d ubuntu:latest sleep infinity

docker psを使用して実行中のubuntuコンテナの Container ID を取得します:

docker ps

次に、docker execコマンドに-itオプションを付けて、コンテナ内でインタラクティブなターミナルセッションを開きます。<container_id>を実行中のコンテナの実際の ID に置き換えてください。

docker exec -it < container_id > bash

新しいオプションを見てみましょう:

  • -i: このオプションはアタッチされていない場合でもSTDINを開いたままにします。インタラクティブセッションに必要です
  • -t: このオプションは擬似 TTY を割り当てます。シェルセッションに必要です
  • bash: コンテナ内で実行するコマンドで、この場合は Bash シェルです

このコマンドを実行すると、ターミナルのプロンプトが変わり、コンテナの Bash シェル内に入ったことが示されます。これでコンテナの環境内でコマンドを実行できます。例えば、現在のディレクトリのファイルを一覧表示してみましょう:

ls

これでコンテナのファイルシステムと環境と直接やり取りできます。コンテナのシェルを終了してホストマシンのターミナルに戻るには、単にexitと入力します:

exit

これで元のターミナルセッションに戻ります。このインタラクティブシェルアクセスは、コンテナのデバッグや管理に非常に強力なツールです。

exec プロセス用の環境変数を設定する

このステップでは、docker execで実行するコマンド専用に環境変数を設定する方法を学びます。これにより、コンテナの環境を永続的に変更することなく、コンテナ内で実行されるプロセスに設定やその他の情報を渡すことができます。

前のステップで使用した実行中のubuntuコンテナを引き続き使用します。実行されていない場合は次のコマンドで起動します:

docker run -d ubuntu:latest sleep infinity

docker psを使用して実行中のubuntuコンテナの Container ID を取得します:

docker ps

次に、コンテナ内でコマンドを実行し、その実行専用に環境変数を設定します。環境変数を表示するためにprintenvコマンドを使用します。<container_id>をコンテナの ID に置き換えてください。

docker exec -e MY_VARIABLE="Hello from LabEx" MY_VARIABLE < container_id > printenv

新しいオプションを見てみましょう:

  • -e MY_VARIABLE="Hello from LabEx": このオプションは、実行されるprintenvコマンドに対してMY_VARIABLEという名前の環境変数を"Hello from LabEx"という値で設定します

ターミナルにHello from LabExと出力されるはずです。これにより、printenvプロセスに対して環境変数が正常に設定されたことが確認できます。

この環境変数がexecプロセス専用でコンテナのメインプロセスには設定されていないことを確認するため、-eオプションなしで再度printenv MY_VARIABLEを実行してみましょう:

docker exec MY_VARIABLE < container_id > printenv

今度は何も出力されないか、変数が設定されていないことを示すエラーが表示されるはずです。これにより、環境変数が-eフラグ付きで実行されたコマンド専用に利用可能であったことがわかります。

docker exec -eで環境変数を設定することは、コンテナ内で実行されるプロセスに動的な設定を渡す便利な方法です。

exec プロセスの作業ディレクトリを設定する

この最終ステップでは、docker execで実行するコマンドの作業ディレクトリを設定する方法を学びます。デフォルトでは、docker execはコンテナの設定された作業ディレクトリ(通常は/)でコマンドを実行します。-wオプションを使用してこれを上書きできます。

引き続き実行中のubuntuコンテナを使用します。実行されていない場合は次のコマンドで起動します:

docker run -d ubuntu:latest sleep infinity

docker psを使用して実行中のubuntuコンテナの Container ID を取得します:

docker ps

次に、コンテナ内の現在の作業ディレクトリを表示するコマンドを実行します。pwdコマンドを使用します。<container_id>をコンテナの ID に置き換えてください。

docker exec < container_id > pwd

/が出力されるはずです。これはubuntuイメージのデフォルト作業ディレクトリです。

今度はpwdコマンドを再度実行しますが、-wオプションを使用して作業ディレクトリを/tmpに設定します。

docker exec -w /tmp < container_id > pwd

新しいオプションを見てみましょう:

  • -w /tmp: このオプションはpwdコマンドの作業ディレクトリをコンテナ内の/tmpに設定します

今度は/tmpが出力されるはずです。これにより、docker execで実行するコマンドに対して異なる作業ディレクトリを指定できることが示されます。これはコンテナ内の特定の場所にあるファイルを操作するコマンドを実行する必要がある場合に便利です。

これで Docker コンテナでコマンドを実行する実験は終了です。コンテナを実行用に起動する方法、実行中のコンテナでコマンドを実行する方法、インタラクティブシェルセッションを開く方法、環境変数を設定する方法、そしてexecプロセスの作業ディレクトリを設定する方法を学びました。

まとめ

この実験では、docker runを使用して Docker コンテナを起動し、その中でコマンドを実行する方法を学びました。さらに、実行中のコンテナ内でコマンドを実行するdocker container execコマンドの使用方法を習得しました。これは稼働中のコンテナを検査・管理する上で不可欠なスキルです。

また、docker container execの高度な機能として、実行プロセスに対する環境変数の設定や作業ディレクトリの指定についても学びました。これにより、実行中のコンテナとの対話においてより高い制御性と柔軟性を得ることができます。