1. 概要

このチュートリアルでは、新しいまたは実行中のAlpineDockerコンテナーでシェルを開始する方法を検討します。

2. 序章

Dockerコンテナは通常、バックグラウンドでサービスとして実行され、Dockerデーモンによって管理されます。 ただし、設定ファイルの変更や追加ツールのインストールなど、コンテナ環境で何かを行う必要がある場合があります。 コンテナ内のインタラクティブなシェルプロセスを使用して、これらのタスクを実行できます。

docker rundocker execなどのDockerコマンドを使用してこれを実現する方法を示します。

3. アルパインコンテナでシェルを開始する

Alpineは最も軽量なLinuxディストリビューションです。 サイズが小さいため、多くの人がアルパインをベースイメージとして使用しています。 この記事ではAlpineコンテナーを使用していますが、このメソッドは他のDockerコンテナーにも適用されます。

3.1. 新しいコンテナでシェルを開始する

新しいAlpineコンテナでシェルセッションを開始するには、ターミナルに次のコマンドを入力してみましょう。

$ docker run -it alpine /bin/sh

コマンドを分解してみましょう。

まず、 docker run はDockerコマンドであり、Dockerコンテナーを作成するために使用され、次の構文があります。

docker run [OPTIONS] IMAGE[:tags] [COMMAND]

この例では、イメージ alpine に基づいてコンテナーを作成し、-itフラグを指定してコマンド/bin /shを実行するようにDockerに指示しました。

3.2. -itフラグ

-itフラグなしでシェルプロセスを開始した場合、コンテナは開始し、ステータス0でほぼ即座に終了します。 先に進む前に、Dockerがコンテナの標準I/Oストリームをどのように処理するかを知っておくと便利です。

ドキュメントによると、フォアグラウンドモードで実行されるDockerコンテナーには、-aオプションを追加しない場合、標準出力ストリーム(STDOUT)と標準エラーストリーム(STDERR)のみがアタッチされます。 それに加えて、いくつかの事実も認識しなければなりません。

  • Dockerコンテナーは、そのコンテナー内にアクティブなプロセスがなくなると、ステータス0で終了します
  • インタラクティブモードまたは非インタラクティブモードでシェルプロセスを実行できます。 インタラクティブモードでは、シェルは端末の標準入力ストリーム(STDIN)を介してコマンドをリッスンします。 一方、非対話型モードでは、シェルは渡されたスクリプトを実行して終了します

docker runコマンドのドキュメントから、フラグ-iが「接続されていなくてもSTDINを開いたままにする」ことがわかります。 一方、フラグ -t は、そのコンテナプロセスに疑似端末を割り当てます。 -itを使用して、STDINをリッスンしているインタラクティブシェルプロセスを起動できます。 割り当てられた疑似端末により、シェルプロセスのSTDINにコマンドを送信できるようになります。

3.3. 実行中のコンテナでシェルを開始する

実行中のコンテナでシェルプロセスを開始するには、次のコマンドを使用できます。

$ docker exec -it <container-name> /bin/sh

どこコンテナ名またはコンテナIDのいずれかに置き換える必要があります。 同様に、ここでは -it フラグを使用して、シェルプロセスをインタラクティブモードで開始しています。

実行中のコンテナーでシェルプロセスを開始するには、dockerrunの代わりにdockerexecを使用することに注意してください。

3.4. シェルを終了する

最後に、 exitコマンドを使用してシェルを終了できます。これにより、コンテナー内のシェルプロセスが終了します。

/# exit

4. 結論

このチュートリアルでは、 dockerrunを使用して新しいAlpineコンテナーでシェルを開始する方法を示しました。 さらに、 dockerexecを使用して実行中のコンテナーでシェルプロセスを開始することも検討しました。 最後に、シェルプロセスをインタラクティブにする-itフラグを調べました。