分散システムとポエム

VPSにDockerでレンタルスペースを自作する[ほぼ完成]

https://blog.koyama.me/archives/1480
先日、アドベントカレンダーとして書いた記事の開発が終わったのでブログを書きます。ソースはGitHubで公開してあります。 https://github.com/tomoyk/ssh-rental-space

変更/工夫した点

DockerComposeでのcpu/ramリソース制限

docker-composeでのリソース制限はv3系からDocker Swarmを使うようになっていました。そのため、v2系で最新のv2.4で mem_limit などを利用して実現しました。

ネットワークのアクセス制御

dockerの機能であるカスタムを利用しました。sshコンテナごとに所属するコンテナを個別に作成し、sshコンテナとsyslogコンテナだけが所属するよう設計しました。 これにより、sshコンテナ同士の相互接続を防ぎ、なおかつsyslogコンテナとの疎通性は確保しています。

docker-compose.ymlの自動生成

sshコンテナの数が5個程度であれば運用コストは低いので問題ありません。しかし、コンテナ数が数十個に増えると認証情報を変えてdocker-compose.ymlを更新するのが手間になります。そこで、docker-composeがYamlであることに注目し、Pythonでdocker-compose.ymlを認証情報ファイルから自動生成するコードを作成しました。 具体的には container-credentials.csv にSSHで使用する「ユーザー名、パスワード、ポート、コンテナ名、ホスト名、マウントするホストパス」を記述します。そして、その内容をPythonで解析してYamlへ変換して出力します。

問題: uidの不一致

sshコンテナの内部に public_html を作成し、そのディレクトリをホストOSのnginxドキュメントルートとバインドしようとしました。しかし、コンテナ内部のuidとホストOSのUIDが一致しないためパーミッションの設定に困りました。 この問題はコンテナにssh接続するユーザのuidをadduserする時に指定し、それと同じuidユーザをホストOSに追加することで解決しました。

課題: コンテナを監視する仕組み

現状では構築できていない為、開発したいと思います。方法としては、container-credentialsを使ってssh接続できるか確認したり、docker execで外部との疎通性を確認したりすることを考えています。

システムアーキテクチャ

構成図を作成したので追加しました。(2019/02/28追記)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です