こちらのチャプターでは、初期設計とAWS上での実装について説明します。
後のチャプターでわかりますが、この実装は後に全てなくなります。
アンチパターンとしてご理解ください。
動的にコンテナを起動させるシステムを実装するので、まずは、Docker
に関する調査から始まりました。
Docker はデフォルトでは UNIXソケット
を利用して操作を可能にしますが、 TCPソケット
も利用できることがわかりました。よって、コンテナを起動するためのサーバーを立て、そこにコンテナの起動や終了のリクエストを出すことで遠隔からコンテナ操作を可能にすることを考えました。
構成図は以下の通りです。
つまり、以下の3つの機構が必要です。
- Webアプリケーション機構
- Dokcerコンテナを起動・停止するAPI(docker-manager)
- Dockerコンテナを動作させるサーバー群 (コンテナサーバー)
ユーザーからのアクセスを通常のWebアプリケーションで受け、その後コンテナオーケストレーションシステムの下位互換のような API
を実装し、API経由で コンテナが立ち上がるサーバー(以後、コンテナサーバー)
上でDockerコンテナを起動する構成を考えました。
docker-manager
の役割は、docker-compose
コマンドとほぼ同じで、コンテナ起動の設定ファイルを読み込み、それに応じたユーザごとの専用コンテナを作ることです。しかし、docker-compose
はAPIとして用意されているわけではないので、自分達で書く必要がありました。
ユーザーは コンテナサーバー
の Global IP
を利用して各コンテナにアクセスすることを想定していました。そのため、ユーザごとに踏み台コンテナを作成し、ユーザごとに別々のポートを介してコンテナにアクセスさせようと考えました。
当時、この場合はユーザは SSHクライアント
を使う必要があるため、現在のウェブブラウザからのアクセスではなく、ユーザーのTerminalやコマンドプロンプトからのアクセスを想定していました。
イメージは、下図です。至ってシンプルな構成です。
ということで、早速、Pythonを利用してオリジナルの docker-manager
を作成しました。
Pythonを利用した理由としては、以下の二つです。
- 自分等がPythonになれていたという超絶安易な理由
- Dockerのクライアントライブラリが便利そうという希望的観測
ちなみに当時の我々は、人に誇れるほどのWebやAPIの開発経験はなく、大学の研究のためにPythonで少しプログラムを書いたり、CTFを解くために必要なプログラムをかける程度の能力でした。そこで、REST API
なるものをググって、いい感じに実装をはじめました。(いい感じってなんだよ。)
重量級フレームワークである必要はなかったので、 Flask
を選定しました。