先日、アドベントカレンダーとして書いた記事の開発が終わったのでブログを書きます。ソースは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追記)
コメントを残す