1. 概要

Dockerは、アプリケーションを簡単に作成、デプロイ、実行するための強力なツールであることを私たちは知っています。

イメージとコンテナーのチュートリアルでは、レイヤーを使用してDockerイメージを構築する方法について説明しました。 また、最初のレイヤーは通常オペレーティングシステムであることも説明しました。

では、コンテナのオペレーティングシステムに接続することは可能ですか? はい、そうです。 そして今、私たちはそれを行う方法を学ぶつもりです。

2. 既存のコンテナへの接続

既存のコンテナに接続する場合は、実行中のコンテナが必要です。 そのためには、 dockerpsコマンドを使用してシステムのコンテナステータスを確認する必要があります。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                  PORTS               NAMES
4b9d83040f4a        hello-world         "/hello"            8 days ago          Exited (0) 8 days ago                       dazzling_perlman

実行中のコンテナーがないため、例としてRabbitMQコンテナーを開始しましょう。

$ docker run -d rabbitmq:3

コンテナが起動すると、 dockerpsへの別の呼び出しからコンテナが表示されます。

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                NAMES
b7a9f5eb6b85        rabbitmq:3          "docker-entrypoint.s…"   25 minutes ago      Up 25 minutes       4369/tcp, 5671-5672/tcp, 25672/tcp   trusting_bose

これで、このコンテナへの接続は実行するのと同じくらい簡単です。

$ docker exec -it b7a9f5eb6b85 sh

この時点で、コンテナ内にインタラクティブなシェルがあります。

  • docker exec は、実行中のコンテナーに対してコマンドを実行することをDockerに通知します
  • -it 引数は、インタラクティブモードで実行されることを意味します-それはSTINを開いたままにします
  • b7a9f5eb6b85はコンテナIDです
  • shは実行したいコマンドです

新しく作成したコンテナのオペレーティングシステムを見てみましょう。

$ cat /etc/*-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.4 LTS"
NAME="Ubuntu"
VERSION="18.04.4 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.4 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

バイオニックビーバーUbuntuのようです。 RabbitMQDockerfileFROM[X24X]命令を確認すると、このイメージがUbuntu18.04を使用して構築されていることがわかります。

exit コマンド、または CTRL +dだけでコンテナから切断できます。

この例は簡単でした。RabbitMQコンテナーを開始すると、停止するまで実行を続けるからです。 一方、オペレーティングシステムのコンテナなど、存続しないコンテナを処理する必要がある場合もあります。 それらに入る方法を見てみましょう。

3. インタラクティブモードでのコンテナの実行

新しいオペレーティングシステムコンテナ、たとえば18.04 Ubuntuを起動しようとすると、それが存続しないことがわかります。

$ docker run ubuntu:18.04
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                                NAMES
08c26636709f        ubuntu:18.04        "/bin/bash"              10 seconds ago      Exited (0) 7 seconds ago                                        heuristic_dubinsky
b7a9f5eb6b85        rabbitmq:3          "docker-entrypoint.s…"   About an hour ago   Up About an hour           4369/tcp, 5671-5672/tcp, 25672/tcp   trusting_bose

RabbitMQコンテナがまだ実行されている間、Ubuntuコンテナは停止します。 したがって、 dockerexecコマンドを使用してこのコンテナーに接続することはできません。

これを回避する方法は、このコンテナをインタラクティブモードで実行することです。

$ docker run -it ubuntu:18.04

コンテナ内にいるので、シェルタイプを確認できます。

$ echo $0
/bin/bash

実際、インタラクティブモードでコンテナを起動するときは、 –rm引数を使用すると便利です。 終了するときに、必ずコンテナを削除します。

$ docker run -it --rm ubuntu:18.04

4. コンテナを実行し続ける

コンテナを起動して接続する必要があるという奇妙な状況に遭遇することがありますが、インタラクティブモードは機能しません。

これらの状況のいずれかに遭遇した場合は、おそらく何かが間違っているため、修正する必要があります。

ただし、高速な回避策が必要な場合は、コンテナでtailコマンドを実行できます。

$ docker run -d ubuntu:18.04 tail -f /dev/null

このコマンドを使用して、デタッチ/バックグラウンドモード( -d )で新しいコンテナーを起動し、コンテナー内で tail -f / dev /nullコマンドを実行します。 結果として、これは私たちのコンテナを永久に実行することを強制します。

これで、前に見たのと同じ方法で dockerexecコマンドを使用して接続する必要があります。

$ docker exec -it CONTAINER_ID sh

これは回避策であり、開発環境でのみ使用する必要があることに注意してください。

5. 結論

このチュートリアルでは、実行中のコンテナのシェルに接続する方法と、コンテナをインタラクティブに起動する方法について説明しました。