SSHのログインごとに独立したコンテナを割り当てる方法を書きます。
手順
まず、適当なユーザを作って公開鍵でログインできるようにしておきます。
sudo useradd -m -G docker newworld sudo -u newworld -i mkdir -m 700 .ssh sudo -u newworld -i tee .ssh/authorized_keys < ~/.ssh/id_rsa.pub sudo -u newworld -i chmod 600 .ssh/authorized_keys
% ssh newworld@localhost [newworld@localhost ~]$
sshd_config
に下記を追記してreload sshdします。
# /etc/ssh/sshd_config Match User newworld ForceCommand [ "$SSH_ORIGINAL_COMMAND" ] && docker run base $SSH_ORIGINAL_COMMAND || docker run -i -t base /bin/bash
ログインして適当なファイルを作ってみます。
% ssh newworld@localhost bash-4.2# touch /tmp/hogehoge bash-4.2# ls -l /tmp total 0 -rw-r--r--. 1 root root 0 Sep 2 09:18 hogehoge bash-4.2# exit
もう一度ログインしてみましょう。
% ssh newworld@localhost bash-4.2# ls -l /tmp total 0 bash-4.2# exit
おや、不思議ですね。先ほど作ったファイルがなくなっています!
まとめ
OpenSSHのForceCommandにdockerコマンドを設定することで、ログインごとに独立したコンテナを割り当てることができます。dockerコマンドに-u
を渡すことで非rootユーザでの実行も可能です。
この方法が何の役に立つかというと・・・集合研修とか?
当初はJenkins Slaveをコンテナで実行してdisposableにするために考えていたのですが、よく考えたらジョブの中でdocker runすればいいだけですね。なのでボツネタです。
known issues
- いったんログアウトすると二度と同じ世界には戻れません。
- scpやsftpが使えません。
- 接続が途中で切れた場合にゴミが残ります。