導入
Docker は、開発者が移植可能な Linux 互換コンテナを作成および管理するのに役立つコンテナ化ツールです。.
コンテナの開発やデプロイを行う際には、実行中のコンテナの内部を調べて現在の状態を確認したり、問題をトラブルシューティングしたりする必要があることがよくあります。この目的のために、Docker は実行中のコンテナ内でアプリケーションを実行するための docker exec コマンドを提供しています。.
このチュートリアルでは、docker exec コマンドについて学習し、これを使用してコマンドを実行し、Docker コンテナ内で対話型シェルを取得する方法について説明します。.
前提条件
このチュートリアルでは、Dockerが既にインストールされており、ユーザーがdockerを実行する権限を持っていることを前提としています。dockerをrootとして実行する必要がある場合は、このチュートリアルのコマンドにsudoを追加することを忘れないでください。.
sudo アクセスなしで Docker を使用する方法の詳細については、「Docker のインストール方法」チュートリアルの「sudo なしで Docker コマンドを実行する」セクションを参照してください。.
テストコンテナの起動
docker exec コマンドを使用するには、実行中の Docker コンテナが必要です。まだ実行していない場合は、以下の docker exec コマンドでテストコンテナを起動してください。
docker run -d --name container-name alpine watch "date >> /var/log/date.log"
このコマンドは、公式Alpineイメージから新しいDockerコンテナを作成します。これは、軽量で最小限の機能しか備えていないLinuxディストリビューションであるAlpine Linuxを使用した、人気のLinuxコンテナイメージです。.
-d フラグはコンテナをターミナルからデタッチし、バックグラウンドで実行するために使用します。 --name container-name はコンテナに名前を付けます。ここでは任意の名前を指定することも、省略して新しいコンテナに一意の名前をDockerが自動的に生成するようにすることもできます。.
次に、コンテナに使用するイメージを指定する alpine があります。.
最後に「date >> /var/log/date.log」があります。これはコンテナ内で実行したいコマンドです。デフォルトでは、クロックは2秒ごとに指定されたコマンドを実行します。この場合、クロックが実行するコマンドは「date >> /var/log/date.log」です。dateは現在の日付と時刻を以下のように出力します。
Output
Fri Jul 23 14:57:05 UTC 2021>> /var/log/date.log セクションは、date コマンドの出力をリダイレクトし、ファイル /var/log/date.log に追加します。2秒ごとに新しい行がファイルに追加され、数秒後には次のようになります。
Output
Fri Jul 23 15:00:26 UTC 2021
Fri Jul 23 15:00:28 UTC 2021
Fri Jul 23 15:00:30 UTC 2021
Fri Jul 23 15:00:32 UTC 2021
Fri Jul 23 15:00:34 UTC 2021次に、Dockerコンテナの名前を確認する方法を学びます。これは、対象のコンテナが既に存在するものの、その名前がわからない場合に便利です。.
Dockerコンテナ名を見つける
docker exec に、操作対象のコンテナの名前(またはコンテナID)を指定する必要があります。この情報は docker ps コマンドで確認できます。
docker ps
このコマンドは、サーバー上で実行されているすべての Docker コンテナを一覧表示し、それらに関する概要情報を提供します。
Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
76aded7112d4 alpine "watch 'date >> /var…" 11 seconds ago Up 10 seconds container-nameこの例では、コンテナIDと名前がハイライト表示されています。どちらを使用しても、docker execにどのコンテナを使用するかを伝えることができます。.
コンテナの名前を変更する場合は、docker rename コマンドを使用します。
docker rename container-name new-name
次に、docker exec を使用して Docker コンテナ内でコマンドを実行するいくつかの例を実行します。.
Dockerコンテナで対話型シェルを実行する
Docker コンテナ内で対話型シェルを起動する必要がある場合 (ファイル システムを調査したり、実行中のプロセスをデバッグしたりする場合など)、-i および -t フラグを指定して docker exec を使用します。.
-i フラグはコンテナへの入力をオープンに保ち、-t フラグはシェルが接続できる擬似端末を作成します。これらのフラグは以下のように組み合わせることができます。
docker exec -it container-name sh
指定されたコンテナ内でシェルが実行され、初期シェルプロンプトが表示されます。コンテナを終了するには、exitと入力して 入力 プレス:
exitコンテナ イメージに bash のようなより高度なシェルが含まれている場合は、上記の sh を bash に置き換えることができます。.
Dockerコンテナで非対話型コマンドを実行する
実行中のコンテナ内でコマンドを実行する必要があるが、対話する必要がない場合は、フラグなしで docker exec コマンドを使用します。
docker exec container-name tail /var/log/date.log
このコマンドは、コンテナ名に対して tail /var/log/date.log を実行し、結果を出力します。デフォルトでは、tailコマンドはファイルの最後の10行を出力します。最初のセクションで設定したテストコンテナを実行すると、次のような出力が表示されます。
Output
Mon Jul 26 14:39:33 UTC 2021
Mon Jul 26 14:39:35 UTC 2021
Mon Jul 26 14:39:37 UTC 2021
Mon Jul 26 14:39:39 UTC 2021
Mon Jul 26 14:39:41 UTC 2021
Mon Jul 26 14:39:43 UTC 2021
Mon Jul 26 14:39:45 UTC 2021
Mon Jul 26 14:39:47 UTC 2021
Mon Jul 26 14:39:49 UTC 2021
Mon Jul 26 14:39:51 UTC 2021これは、Dockerコンテナの対話型シェル(前の手順で docker exec -it container-name sh を実行したように)を開いてから tail /var/log/date.log コマンドを実行するのと基本的に同じです。ただし、シェルを開いてコマンドを実行し、シェルを閉じるのではなく、擬似端末を開かずに単一のコマンドで同じ出力を返します。.
Dockerコンテナ内の別のディレクトリでコマンドを実行する
コンテナの特定のディレクトリでコマンドを実行するには、--workdir フラグを使用してディレクトリを指定します。
docker exec --workdir /tmp container-name pwd
この例のコマンドは、/tmp ディレクトリを作業ディレクトリとして設定し、現在の作業ディレクトリを印刷する pwd コマンドを実行します。
Output
/tmp
pwd コマンドは作業ディレクトリが /tmp であることを確認しました。.
Dockerコンテナ内で別のユーザーとしてコマンドを実行する
コンテナ内で別のユーザーとしてコマンドを実行するには、--user フラグを追加します。
docker exec --user guest container-name whoami
これは、コンテナ内でゲストユーザーを使用して whoami コマンドを実行します。whoami コマンドは、ユーザーの現在のユーザー名を出力します。
Output
guestwhoami コマンドは、コンテナの現在のユーザーがゲストであることを確認します。.
Dockerコンテナに環境変数を渡す
コンテナの実行コマンドと一緒に環境変数を渡す必要がある場合があります。-e フラグを使用すると、環境変数を指定できます。
docker exec -e TEST=sammy container-name env
このコマンドは、TEST環境変数をsammyに設定し、コンテナ内でenvコマンドを実行します。envコマンドは、すべての環境変数を出力します。
Output
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=76aded7112d4
TEST=sammy
HOME=/rootTEST 変数は sammy に設定されています。.
複数の変数を設定するには、それぞれに対して -e フラグを繰り返します。
docker exec -e TEST=sammy -e ENVIRONMENT=prod container-name env
環境変数が満載のファイルを渡す場合は、–env-file フラグを使用します。.
まず、テキストエディタでファイルを作成します。ここではnanoコマンドで新しいファイルを開きますが、使い慣れたエディタであればどれでも構いません。
nano .env
ファイル名に .env を使用するのは、バージョン管理外で情報を管理するためにこのタイプのファイルを使用する一般的な標準であるためです。.
次に示すように、ファイルに KEY=value 変数を 1 行に 1 つずつ記述します。
TEST=sammy
ENVIRONMENT=prodファイルを保存して閉じます。ファイルを保存してnanoを終了するには、Ctrl+Oを押し、Enterを押して保存し、Ctrl+Xを押して終了します。.
次に、docker exec コマンドを実行し、–env-file の後に正しいファイル名を指定します。
docker exec --env-file .env container-name env
Output
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=76aded7112d4
TEST=sammy
ENVIRONMENT=prod
HOME=/rootファイルには 2 つの変数が設定されています。.
複数の –env-file フラグを使用して複数のファイルを指定できます。ファイル内の変数が重複している場合、最後のコマンドで指定されたファイルが前のファイルを上書きします。.
よくあるエラー
docker exec コマンドを使用すると、いくつかの一般的なエラーが発生する可能性があります。
Error: No such container: container-name
「No such container」エラーは、指定されたコンテナが存在しないことを意味します。コンテナ名のスペルミスが原因である可能性があります。docker ps を使用して実行中のコンテナを一覧表示し、名前を再確認してください。.
Error response from daemon: Container 2a94aae70ea5dc92a12e30b13d0613dd6ca5919174d73e62e29cb0f79db6e4ab is not running
このメッセージは、コンテナは存在するが停止していることを意味します。docker start container-name でコンテナを起動できます。
Error response from daemon: Container container-name is paused, unpause the container before exec
「コンテナが一時停止しています」というエラーが問題をよく表しています。続行する前に、 docker unpause container-name を実行してコンテナの一時停止を解除する必要があります。.
結果
このチュートリアルでは、実行中の Docker コンテナでコマンドを実行する方法と、その際のいくつかのコマンドライン オプションについて学習しました。.
Docker 全般に関する詳細については、Docker タグ ページをご覧ください。このページには、Docker チュートリアル、Docker 関連の Q&A ページなどへのリンクがあります。.









