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のようです。 RabbitMQDockerfileのFROM[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. 結論
このチュートリアルでは、実行中のコンテナのシェルに接続する方法と、コンテナをインタラクティブに起動する方法について説明しました。