Dockerコンテナを無期限に実行する
1. 概要
このチュートリアルでは、Dockerコンテナーを無期限に実行し続ける方法について説明します。
デフォルトでは、コンテナはデフォルトのコマンドが実行されている間だけ実行されますが、一般的なユースケースでは、デバッグとトラブルシューティングの目的でコンテナを無期限に実行します。
2. DockerRunの基本
docker run コマンドの基本と、コンテナーの起動時にコマンドをコンテナーに渡す方法を見てみましょう。
2.1. 実行するコマンドの指定
Dockerfileの作成中に、実行するコマンドを指定する方法は2つあります。
- ENTRYPOINTディレクティブは、containerのコマンドを指定します。 これは、ユーザーが明示的にオーバーライドしない限り、常に実行したいコマンドに役立ちます。
- CMDディレクティブを使用してコマンドを指定することもできます。 これは、コンテナに渡されるデフォルトのコマンドまたは引数を定義するために使用されます。 画像名の後にユーザーが含める引数はすべて、CMDディレクティブ全体を置き換えます。
2.2. デフォルトコマンドのオーバーライド
CMDディレクティブをオーバーライドするには、 docker run[image_name]の後に別のコマンドを追加するだけです。 例えば:
docker run ubuntu echo "Hello World"
ENTRYPOINTディレクティブをオーバーライドするには、 –entrypoint フラグと、イメージ名の前に必要なコマンドを追加し、イメージ名の後に引数を追加する必要があります。 例えば:
docker run --entrypoint echo ubuntu "Hello World"
どちらの例でも、コンテナーの起動時にコマンド echo“ Hello World”が実行されます。
2.3. コマンドで実行するDocker
docker run コマンドのデフォルトの動作は、次のように要約できます。
- コンテナは、 -d フラグを使用して明示的にデタッチされない限り、デフォルトでフォアグラウンドで実行されます。
- 指定されたコマンドが実行を継続し、その後停止する限り、コンテナは実行されます。
この小さな例を見てみましょう:
docker run ubuntu bash
上記のコマンドは、ubuntuイメージでbashコマンドを実行します。 bash コマンドは、コンテナー内のシェルを開始します。
コマンドは実行されますが、コマンドが終了するとコンテナは停止します。これはほぼ即時です。 これは、 dockerpsコマンドを使用してテストできます。
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c8f8f8f8f8f8 ubuntu bash 2 minutes ago Exited (0) 22/tcp mystifying_snyder
3. Dockerコンテナを無期限に実行する
デフォルトでは、コンテナは無期限に実行するように設計されている場合とされていない場合があります。 たとえば、Webサーバーを含むコンテナーは、Webサーバーが実行されている限り実行されます。 ただし、cronジョブなどの1回限りのジョブを含むコンテナーは、短時間しか実行されません。
コンテナを無期限に実行するいくつかの方法を見てみましょう。
3.1. コマンドを終わらせない
コンテナを実行し続ける最も簡単な方法は、決して終了しないコマンドを渡すことです。
次にいくつかの例を示します。
tail -f コマンドを使用して、 / dev /nullファイルを読み取ることができます。 このコマンドは、表示するファイルの新しい変更を探し続けます。 したがって、ファイルが存在する限り、ファイルが終了することはありません。 コマンドを見てみましょう:
docker run ubuntu tail -f /dev/null
以下のコマンドを使用して、何もしない無限ループを実行できます。
docker run ubuntu while true; do sleep 1; done
次のコマンドは、コンテナをアイドル状態に保ち、何もしません。
docker run ubuntu sleep infinity
次のいずれかの方法で、終わりのないコマンドを使用できます。
- DockerfileのENTRYPOINTまたはCMDディレクティブ。
- dockerrunコマンドでENTRYPOINTまたはCMDをオーバーライドします。
さらに、フォアグラウンドで終了しないコマンドを実行して、ターミナルがスタックするのは意味がありません。 この場合、 -dフラグを使用して、バックグラウンドでコンテナを実行できます。
3.2. 疑似TTYの開始
終わりのないコマンドは、他のオプションが存在しなかったずっと前のハックでした。 ただし、Dockerの最新バージョンでは、フォアグラウンドとバックグラウンドの両方でコンテナーとのターミナルセッションを開始することにより、コンテナーを実行し続けることができます。
疑似TTYは、コンテナー内でコマンドを実行するために使用されます。 コンテナとの疑似TTYセッションを開始するには、-tフラグを使用できます。セッションが終了するまでコンテナは終了しません。
コンテナを操作する場合は、これを-iフラグと組み合わせることができます。 これにより、ターミナルを使用してコンテナ内でコマンドを実行できるようになります。 コマンドの例を次に示します。
docker run -it ubuntu bash
または、コンテナを無期限に実行することが目的の場合は、-dフラグを使用できます。
docker run -d -t ubuntu
4. 結論
このチュートリアルでは、Dockerコンテナーを無期限に実行するいくつかの方法について説明しました。 コマンドがコンテナに渡される方法を確認し、問題を解決するためにこれらのコマンドを変更しました。 また、Pseudo-TTYセッションを使用してコンテナーを実行し続ける最新のソリューションについても検討しました。