はじめに
コンテナからホスト上のコンテナを操作する「Docker Outdide of Docker」という手法を実際に利用した結果をまとめました。
環境情報
- Debian GNU/Linux 9
- Docker Version:19.03.5
コンテナ内でDockerコマンドを利用する
コンテナ内でDockerコマンドを打つためにはDockerがインストールされている必要があります。
今回はlibrary/docker
のイメージを利用しました。
$ docker inspect docker [ { "Id": "sha256:81f5749c9058a7284e6acd8e126f2b882765a17b9ead14422b51cde1a110b85c", "RepoTags": [ "docker:latest" ], "RepoDigests": [ "docker@sha256:f9a24a777e813e2692920a86530355e3840d0271464fd486bd8708aa018d0ac6" ], ...
ホスト上のコンテナ情報をコンテナ内から取得する
以下のパスにDockerが利用しているソケットファイルがあります。
$ file /var/run/docker.sock /var/run/docker.sock: socket
このdocker.socketファイルをDockerコンテナにマウントすることでコンテナ内からホスト上のDockerエンジンに対してAPIが発行できる状態になります。
例えば、コンテナ内から自分のコンテナプロセスが確認できてしまいます。
$ docker run -it -v /var/run/docker.sock:/var/run/docker.sock docker /bin/sh / # hostname 794f84ba622f / # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 794f84ba622f docker "docker-entrypoint.s…" 48 seconds ago Up 46 seconds
イメージもホスト上で保持しているものがコンテナ内から利用できます。
/ # docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE docker latest 81f5749c9058 3 weeks ago 211MB mongo latest 3f3daf863757 2 months ago 388MB hello-world latest bf756fb1ae65 6 months ago 13.3kB
終わりに
コンテナの中からコンテナを操作することができるので便利な手法ですが、セキュリティの観点ではホスト上のDockerAPIに対してリクエストを発行できるのでホスト側に影響を与えることもできる点は注意が必要です。
以上、ご参考になれば幸いです。