新しい疑似 TTY で実行中の Docker コンテナに入る
コンテナーはアプリケーションのバージョンを実行しており、重要な情報はコンテナーが実行されているときにのみアクセスできます。 たとえば、コンテナのログが保存されている場所を知りたい場合があります。
これを実現するには、実行中のコンテナーに入り、この特定のコンテナーに関する情報を取得する必要があります。 このチュートリアルでは、新しい疑似 TTY を使用して実行中の Docker コンテナーに入るために活用できるさまざまなアプローチを学習します。
新しいプロジェクトを作成する
このチュートリアルのすべての例で Nginx アプリケーションを使用して、実行中のコンテナーに入る方法を示します。
WebStorm IDE を開き、File > New > Project
を選択して新しいプロジェクトを作成します。 開いたウィンドウで [空のプロジェクト] を選択し、プロジェクト名を untitled
から docker-enter-container
に変更するか、任意の名前を使用します。
最後に、Create
というラベルの付いたボタンを押して、プロジェクトを生成します。
現在のフォルダーの下に index.html
という名前のファイルを作成し、次のコードをコピーしてファイルに貼り付けます。
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Bootstrap demo</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css"
rel="stylesheet"
integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi"
crossorigin="anonymous">
</head>
<body>
<table class="table table-dark">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">First</th>
<th scope="col">Last</th>
<th scope="col">Handle</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">1</th>
<td>Mark</td>
<td>Otto</td>
<td>@mdo</td>
</tr>
</tbody>
</table>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js"
integrity="sha384-OERcA2EqjJCMA+/3y+gxIOqMEjwtxJY7qPCqsdltbNJuaOe923+mo//f6V8Qbsw3"
crossorigin="anonymous"></script>
</body>
</html>
このファイルでは、Bootstrap を使用して、表を表示する単純な Web ページを作成しています。 これは、コンテナを実行したときに返されるページです。
コードを自由に変更して、他の情報を表示してください。
イメージを定義する
Dockerfile
という名前のファイルを作成し、次の Docker 手順をコピーしてファイルに貼り付けます。
FROM nginx:1.23.1-alpine
COPY . /usr/share/nginx/html
FROM
- 後続の命令を使用してカスタム イメージを作成するベース イメージを設定します。 これは、ファイルの最初の命令でなければなりません。COPY
- 現在のディレクトリにあるすべてのファイルとフォルダをイメージ ファイル システムにコピーします。 この場合、すべてのファイルとフォルダーを/usr/share/nginx/html
にコピーし、このイメージの要件としてこの場所を使用しました。
イメージを構築する
コンピュータのキーボード ショートカット ALT+F12 を押して、新しいターミナル ウィンドウを開きます。 次に、以下のコマンドを実行して、タグ enter-container
を使用してイメージをビルドします。
~/WebstormProjects/docker-enter-container$ docker build --tag enter-container:latest .
このコマンドは、Dockerfile
命令を順番に実行し、以下に示すように、ターミナル ウィンドウで命令が実行されていることを確認できます。
=> CACHED [1/2] FROM docker.io/library/nginx:1.23.1-alpine@sha256:b87c350e6c69e0dc7069093dcda226c4430f3836682af4f649f2af9 0.0s
=> [2/2] COPY . /usr/share/nginx/html
コンテナを実行する
同じターミナル ウィンドウを使用して、enter-container-prod
という名前のコンテナーを実行する次のコマンドを実行します。
~/WebstormProjects/docker-enter-container$ docker run --name enter-container-prod -d -p 3000:80 enter-container:latest
このコマンドはコンテナーを実行し、ホストのポート 3000 を公開して、コンテナーのポート 80 をリッスンします。 アプリケーションを表示するには、ブラウザで localhost:3000
(http://localhost:3000/) にリクエストを発行し、index.html
ページにテーブルを表示します。
次のセクションでは、このコンテナーを使用して、コンテナーに入るために使用できるさまざまなアプローチを示します。
docker exec
コマンドを使用して実行中の Docker コンテナに入る
実行中のコンテナーで新しいコマンドを実行する場合は、exec
コマンドを使用します。 このコマンドは、コンテナーのプライマリ プロセスが実行されているときにのみ実行され、コンテナーを再起動しても再起動されないことに注意してください。
WORKDIR
命令を使用して作業ディレクトリが指定されていない場合、コマンドはデフォルト ディレクトリで実行されます。 同じターミナル ウィンドウで、次のコマンドを実行して、前のセクションで実行したコンテナーに入ります。
~/WebstormProjects/docker-enter-container$ docker exec -it enter-container-prod /bin/sh
出力:
/ #
追加のフラグ -it
も使用していることに注意してください。これは Docker にコンテナー STDIN
に接続された疑似 TTY を割り当て、コンテナー内に対話型シェルを作成するように指示します。
ls
コマンドを実行すると、以下に示すように、コンテナーのルート ディレクトリにいることがわかります。
/ # ls
出力:
bin etc mnt run tmp
dev home opt sbin usr
docker-entrypoint.d lib proc srv var
/bin/sh
シェル コマンドを sh
に置き換えることで、コンテナー内にインタラクティブなシェルを作成できます。 これは覚えやすく、以下に示すように使用できます。
~/WebstormProjects/docker-enter-container$ docker exec -it enter-container-prod sh
sh
コマンドの代わりに bash
コマンドを使用する
bash
という名前の sh
コマンドの代わりに docker exec
コマンドを使用できます。 このコマンドを使用すると、コンテナー内にインタラクティブ シェルを作成することもできます。
bash
コマンドは、前の例で sh
コマンドを使用したのと同じ方法で使用できます。 CTRL+D を使用してシェル セッションを終了し、次のコマンドを実行して、bash
コマンドを使用して Docker コンテナーに入ります。
~/WebstormProjects/docker-enter-container$ docker exec -it enter-container-prod /bin/bash
/bin/bash
シェル コマンドを bash
に置き換えることで、コンテナー内にインタラクティブなシェルを作成できます。 これは覚えやすく、以下に示すように使用できます。
~/WebstormProjects/docker-enter-container$ docker exec -it enter-container-prod bash
シェル コマンドは、コンテナーにインストールされているシェルに依存することに注意してください。 シェル コマンドが 2つあるコンテナもあれば、1つしかないコンテナもあります。
まとめ
このチュートリアルでは、新しい疑似 TTY を使用して Docker コンテナーに入るために活用できるさまざまなアプローチを学びました。 このチュートリアルで取り上げるアプローチには、シェルの bash
または sh
コマンドのいずれかで docker exec
コマンドを使用することが含まれます。
David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.
LinkedIn GitHub