Dockerコンテナ内で何が起こっているかを確認する必要があったことがありますか?コンテナはべき等であることが意図されています。問題がある場合は、新しいコンテナを再デプロイします。多くの場合、人生はそれほど単純ではありません。問題を特定するには、コンテナでコマンドを実行する必要があります。ここで、docker exec
コマンドが役立ちます。
この記事では、docker exec
を使用して実行中のDockerコンテナでコマンドを実行する方法を説明します。 コマンド。
この記事の例に従うには、以下に従う必要があります。
- Docker Desktopの最近のバージョンはすべて、Windows、Linux、またはmacOSで動作します。このチュートリアルでは、Windows10で実行されているv3.1.0を使用します。
NGINXコンテナの起動
Docker exec
コンテナでコマンドを実行します。ただし、そのためには、最初にこれらのコマンドを実行するためのコンテナーが必要です。まず、Dockerイメージをダウンロードしてデモコンテナーを作成します。
- 新しいディレクトリを作成します。このチュートリアルではC:\ gitrepos \ testを使用します 、コンテナに使用されるファイルを保持します。
2.次のコードを含むdockerfile(拡張子なし)という名前のファイルを作成します。 Dockerfileは、コンテナーを作成するために必要なステップを定義します。
FROM nginx:alpine
COPY index.html /usr/share/nginx/html/index.html
3.次に、同じディレクトリに index.htmlという名前のファイルを作成します。 これには次のコードが含まれています。これは、コンテナが起動したときにHelloWorldメッセージを表示するHTMLファイルです。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Hello World - Nginx Docker</title>
<style>
h1{ font-weight:lighter; font-family: Arial, Helvetica, sans-serif;
}
</style>
</head>
<body>
<h1>
Hello World
</h1>
</body>
</html>
4.次に、NginxDockerコンテナを作成します。 Dockerfileは現在の作業ディレクトリにあるため、.
を指定します。 Dockerエンジンにそこを探すように通知します。また、コンテナには必ずmy-ngnix
のタグを付けてください t
を使用する 将来の参照を容易にするためのパラメータ。
docker build -t my-nginx .
5.コンテナが構築されたので、Dockerrunコマンドを使用してコンテナを起動します。
# rm - Informs Docker to delete the container after it has stopped
# d - Return control of the command-line after the command has been executed
# p - Map the internal container port 80 to an external port 80 docker run --rm -d -p 80:80 my-nginx
6.最後に、Webブラウザーを開き、http://localhost/
に移動します。 以下を参照してください。
DockerExecを使用したコマンドの実行
Dockerコンテナーでコマンドを実行する場合、コマンドを対話形式で実行する必要がある場合があります。コマンドをインタラクティブに実行するということは、コマンドの入力、フィードバックの取得、別のコマンドの入力などを意味します。インタラクティブコマンドはセッションを引き継ぎ、他のことを実行できなくなります。
しかし、事前にコンテナに送信するコマンドをすでに知っていて、バックグラウンドでコマンドを実行したい場合はどうでしょうか。その場合、非対話型コマンドを実行できます。非対話型コマンドを使用すると、Dockerにコマンドを送信して、コンソールの制御を即座に返すことができます。
コンテナが構築されたので、コンテナ内でコマンドを実行できます。コマンドを実行する前に、NGINXコンテナの名前またはIDを見つけてください。名前またはIDのいずれかがDockerコマンドで機能します。そのことを念頭に置いて、IDを覚えるのは名前よりも難しいかもしれません!
実行中のコンテナー情報を表示するには、Docker ps
を実行します 次の情報を出力するコマンド。
docker ps
一意のIDe17e4b6be01a
のいずれかをコピーします 、またはランダムに生成された名前mystifying_chandrasekhar
後で使用するためにクリップボードに保存します。
DockerExecを使用した非対話型コマンドの実行
非対話型コマンドの実行例として、以下のコマンドをコピーして実行し、 / var / log内のファイルのリストを返します。 ls -l
のあるディレクトリ 指図。コンテナ名mystifying_chandrasekhar
の後にすべてを渡します 、Docker exec
へ コマンド。
docker exec mystifying_chandrasekhar ls -l /var/log
Dockerコマンドによるコンソール出力の回避
シェル制御をユーザーに即座に戻すことにより、大規模な操作はコンソールを拘束することを回避します。 d
が切り離されたコンソール出力を無視します オプション。以下のコマンドは、ファイル / tmp / execWorksを作成します touch
経由 コンテナ内のコマンドであり、コンソールに出力を表示しません。
docker exec -d mystifying_chandrasekhar touch /tmp/execWorks
DockerExecを使用したインタラクティブコマンドの実行
これまで、docker exec
を使用してDockerコンテナで非対話型コマンドを実行する方法を学習しました。 。ただし、コンテナにインタラクティブにコマンドを発行する必要がある場合など、コンテナのトラブルシューティングを行う必要がある場合があります。その場合、コマンドをインタラクティブに実行する必要があります。
docker exec
と対話的にコマンドを実行する i
の2つのオプションが必要です およびt
。 i
オプションはSTDINを開いたままにし、コマンドをコンテナに送信できるようにします。t
オプションは、通信チャネルである疑似TTY(PTY)を割り当ててコマンドを入力します。
次のコマンドをコピーして貼り付け、Bourne(sh)シェルを使用して実行中のDockerコンテナーに対話型コマンドプロンプトを開きます。これは、プロンプトが/ #
に変更されたことで示されます。 。
docker exec -it mystifying_chandrasekhar sh
シェルに入ったら、以下のコマンドを実行して、コンテナー内からファイルを一覧表示する方法を示します。最後に、exit
を実行します インタラクティブシェルを終了するコマンド。
ls -l /var/log
exit
特定のディレクトリでインタラクティブプロンプトを開くには、
w
へのパスを渡します 指定されたディレクトリでシェルを開始するようにDockerに指示するオプション。
多くのプログラムは、環境変数を使用して起動時に構成を設定します。たとえば、ほとんどのJavaアプリケーションにはJAVA_HOME
が必要です。 Javaパスに設定する環境変数。
e
を使用して、環境変数をセッションに渡すことができます オプション。たとえば、MYVAR
という環境変数を設定する必要があるかもしれません。 実行中のコンテナに。これを行うには、e
を使用します オプションを選択し、MYVAR="<some value>"
のキーと値のペアを指定します 以下に示すように。
docker exec -it -e MYVAR="hello" mystifying_chandrasekhar sh
echo $MYVAR
多くの環境変数または共有構成がある場合は、それらの変数をファイルに保存する方が簡単な場合があります。 --env-file
を使用して、相対パスまたは絶対パスを介してDockerにファイルを渡します。 オプション。この手法は、コンテナに安全な資格情報を提供するためによく使用されます。クレデンシャルをバージョン管理にコミットしないでください!
env-vars.txt
という名前のテキストファイルを作成します 渡す環境変数とその値を使用します。このファイルは好きなように呼び出すことができ、.txt
は必要ありません。 ファイル拡張子。
env-file
を使用して環境変数をDockerに渡します オプション。変数がecho
で使用可能であることを確認します 以下のスクリーンショットに示すようにコマンド。
# Pass the env-vars.txt file and open an interactive prompt
docker exec -it --env-file env-vars.txt mystifying_chandrasekhar sh
# Verify that the environmental variables are available in the Docker container
echo $MYVAR
echo $FOO
echo $SOMETHING
本番環境では、アプリケーションは多くの場合、アクセスを制限するために特定のユーザーとして実行されます。本番環境で特定のユーザーとしてアプリケーションを実行している場合は、コマンドのテスト中にも実行する必要があります。
この例では、Dockerコンテナはnginx
として実行されます ユーザー。ユーザーをw
に渡します コンテナをnginx
として起動するようにDockerに指示するオプション アカウント。 whoami
コンテナ内から実行するコマンドは、nginx
が ユーザーは実際に使用されています。
docker exec -it -u nginx mystifying_chandrasekhar sh
whoami
docker exec
を使用して、実行中のコンテナー内でコマンドを実行する方法を学習しました。 指図。 exec
を利用する 実行中のコンテナーを入力して問い合わせるコマンドを使用すると、Dockerコンテナーのトラブルシューティングを行うための強力な新しいツールが武器庫にあります。
ここで、学習した内容をさらに一歩進めて、単一のファイルをコピーするのではなく、Gitバージョン管理を使用して静的Webサイトをコンテナーにプルしてみてください。 Gitを初めて使用する場合は、「VisualStudioCodeとGitの初心者向けガイド」の記事から始めるのが最適です。