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セッションを使用してコンテナーを実行し続ける最新のソリューションについても検討しました。