序章

Docker は、開発者がポータブルで一貫性のあるLinuxコンテナーを作成および管理するのに役立つコンテナー化ツールです。

コンテナを開発またはデプロイするときは、実行中のコンテナの内部を調べて、現在の状態を調べたり、問題をデバッグしたりする必要があります。 この目的のために、Dockerは docker exec すでに実行されているコンテナでプログラムを実行するコマンド。

このチュートリアルでは、 docker exec コマンドと、それを使用してコマンドを実行し、実行中のDockerコンテナでインタラクティブシェルを取得する方法。

前提条件

このチュートリアルでは、Dockerが既にインストールされており、ユーザーに実行権限があることを前提としています。 docker. 実行する必要がある場合 docker root ユーザーとして、先頭に追加することを忘れないでください sudo このチュートリアルのコマンドに。

なしでDockerを使用する方法の詳細については sudo アクセスするには、Dockerチュートリアルのインストール方法のSudoを使用せずにDockerコマンドを実行するセクションを参照してください。

テストコンテナの開始

を使用するには docker exec コマンドを実行するには、実行中のDockerコンテナが必要です。 コンテナがまだない場合は、次のコマンドでテストコンテナを開始します docker run 指図:

  1. docker run -d --name container-name alpine watch "date >> /var/log/date.log"

このコマンドは、公式アルパインイメージから新しいDockerコンテナを作成します。 これは、軽量で最小限のLinuxディストリビューションである AlpineLinuxを使用する人気のあるLinuxコンテナーイメージです。

を使用します -d コンテナをターミナルからデタッチしてバックグラウンドで実行するには、フラグを立てます。 --name container-name コンテナに名前を付けます container-name. ここで好きな名前を選択するか、これを完全に省略して、Dockerに新しいコンテナーの一意の名前を自動的に生成させることができます。

次に alpine、コンテナに使用するイメージを指定します。

そして最後に watch "date >> /var/log/date.log". これは、コンテナで実行するコマンドです。 watch デフォルトでは2秒ごとに、指定したコマンドを繰り返し実行します。 そのコマンド watch この場合に実行されます date >> /var/log/date.log. date 次のように、現在の日付と時刻を出力します。

  1. Output
    Fri Jul 23 14:57:05 UTC 2021

The >> /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 指図:

  1. 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 指図:

  1. docker rename container-name new-name

次に、使用例をいくつか紹介します。 docker exec 実行中のDockerコンテナでコマンドを実行します。

Dockerコンテナでのインタラクティブシェルの実行

Dockerコンテナー内で対話型シェルを開始する必要がある場合、おそらくファイルシステムを探索したり、実行中のプロセスをデバッグしたりするために、 docker exec とともに -i-t フラグ。

The -i フラグは、コンテナへの入力を開いたままにし、 -t flagは、シェルが接続できる疑似端末を作成します。 これらのフラグは、次のように組み合わせることができます。

  1. docker exec -it container-name sh

これにより、 sh 指定されたコンテナ内のシェル。基本的なシェルプロンプトが表示されます。 コンテナを終了するには、次のように入力します exit 次にを押します ENTER:

  1. exit

コンテナイメージに次のようなより高度なシェルが含まれている場合 bash、あなたは置き換えることができます shbash その上。

Dockerコンテナでの非対話型コマンドの実行

実行中のDockerコンテナー内でコマンドを実行する必要があるが、対話性は必要ない場合は、 docker exec フラグなしのコマンド:

  1. docker exec container-name tail /var/log/date.log

このコマンドは実行されます tail /var/log/date.logcontainer-name コンテナ、および結果を出力します。 デフォルトでは、 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 指図。 ただし、このコマンドは、シェルを開いてコマンドを実行してからシェルを閉じるのではなく、疑似端末を開かずに1つのコマンドで同じ出力を返します。

Dockerコンテナの代替ディレクトリでコマンドを実行する

コンテナの特定のディレクトリでコマンドを実行するには、 --workdir ディレクトリを指定するフラグ:

  1. docker exec --workdir /tmp container-name pwd

このコマンド例は、 /tmp ディレクトリを作業ディレクトリとして実行し、 pwd 現在の作業ディレクトリを出力するコマンド:

Output
/tmp

The pwd コマンドは、作業ディレクトリが /tmp.

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

コンテナ内で別のユーザーとしてコマンドを実行するには、 --user 国旗:

  1. docker exec --user guest container-name whoami

これにより、guestユーザーを使用して whoami コンテナ内のコマンド。 The whoami コマンドは、現在のユーザーのユーザー名を出力します。

Output
guest

The whoami コマンドは、コンテナの現在のユーザーがguestであることを確認します。

Dockerコンテナへの環境変数の受け渡し

実行するコマンドとともに、環境変数をコンテナに渡す必要がある場合があります。 The -e フラグを使用すると、環境変数を指定できます。

  1. docker exec -e TEST=sammy container-name env

このコマンドは、 TEST 等しい環境変数 sammy、次に実行します env コンテナ内のコマンド。 The env 次に、コマンドはすべての環境変数を出力します。

Output
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=76aded7112d4 TEST=sammy HOME=/root

The TEST 変数はに設定されます sammy.

複数の変数を設定するには、 -e それぞれのフラグ:

  1. docker exec -e TEST=sammy -e ENVIRONMENT=prod container-name env

環境変数でいっぱいのファイルを渡したい場合は、 --env-file 国旗。

まず、テキストエディタでファイルを作成します。 新しいファイルを開きます nano ここでは、使い慣れた任意のエディターを使用できます。

  1. nano .env

使用しています .env ファイル名として、これはバージョン管理外の情報を管理するためにこれらの種類のファイルを使用するための一般的な標準です。

あなたの KEY=value 次のように、1行に1つずつファイルに変数を追加します。

.env
TEST=sammy
ENVIRONMENT=prod

ファイルを保存して閉じます。 ファイルを保存して終了するには nano、 押す CTRL+O、 それから ENTER 保存してから CTRL+X 出る。

今実行します docker exec コマンド、後に正しいファイル名を指定 --env-file:

  1. 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

The No such container エラーは、指定されたコンテナーが存在しないことを意味し、コンテナー名のスペルが間違っている可能性があります。 使用する docker ps 実行中のコンテナを一覧表示し、名前を再確認します。

Error response from daemon: Container 2a94aae70ea5dc92a12e30b13d0613dd6ca5919174d73e62e29cb0f79db6e4ab is not running

これ not running メッセージは、コンテナーが存在するが停止していることを意味します。 コンテナを開始できます docker start container-name

Error response from daemon: Container container-name is paused, unpause the container before exec

The Container is paused エラーは問題をかなりよく説明します。 コンテナの一時停止を解除する必要があります docker unpause container-name 先に進む前に。

結論

このチュートリアルでは、実行中のDockerコンテナーでコマンドを実行する方法と、実行時に使用できるいくつかのコマンドラインオプションについて学習しました。

Docker全般の詳細については、 Dockerタグページ 、Dockerチュートリアル、Docker関連のQ&Aページなどへのリンクがあります。

Dockerのインストールについては、 Ubuntu20.04にDockerをインストールして使用する方法をご覧ください。