わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

グループワークの前に,サーバの用意を

 月曜のプログラミング科目は,第11回となりました.4人1組で残り5回にわたってグループワークをしてもらう,初回です.
 実施の要領は基本的に昨年度と同じです.初回はグループ決めをしたあと,企画を考えてもらいます.来週は企画面談です.期間中に海の日の祝日が入るのも,変わりません.
 なのですが昨年度と今年度に大きな違いがあります.昨年度までは,演習室(計算機室)のPCのLinuxTomcatを稼働させ,室内ならホスト名を指定すれば,どこからでもアクセスできたのですが,年度末にそれらの機器は撤去され,今年度はBYOD PCを使用しています.相互にアクセスしてもらうわけにはいきません*1
 そこで第10回の授業が終わってから,時間をとって,サーバの用意をしました.自分の部屋に,常時稼働のLinuxサーバがあります.そしてDockerコンテナをグループの数だけ起動して,学生にはSSHでログインしてもらえばいいのです(自分は,docker execを使って管理者権限で入ります).グループごとに,SSHと,Tomcatアクセスのためのポート番号を変えるのはもちろんですが,それに加えてログイン用のパスワードも,それぞれ別にし,推測されないようにしないといけません.
 少し調べると,有用な先例を見つけました.

 「Docker の起動時に環境変数USERNAMEとPASSWORDを指定することで ftpd / sshd で利用するユーザを変更することが出来ます。」とあります.ユーザ設定は,Dockerfileと同じディレクトリに置いておくdocker-endpoint.shで実現しています.同じように,環境変数SSHPORTとTOMCATPORTを指定して獲得すればいいのかなと思いながら,エンドポイントのファイルを編集し,試行錯誤していると,そのファイルに書いても参照されず,docker container runを起動する際のパラメータとなることに気づきました.それとUSERNAMEはグループを問わず同一にしました.
 自分で用意するDockerイメージには,別途,手配すべきものがあります.Tomcatのインストールです.JDKも必要となるので,ベースイメージを,adoptopenjdk/openjdk11 - Docker Hubの中の「adoptopenjdk/jdk-11.0.3_7-slim」に変更し,そこに,apk add openssh-server bash gitなどを実行するようにしました.apache-tomcat-9.0.21.tar.gzのダウンロードと伸張も,加えました.
 docker-endpoint.shの編集に戻ります.Tomcatのbinディレクトリにあるstartup.sh*2を実行することで,Tomcatが使えるようにしました.SSHサーバ起動は最後の実行とし,-Dオプションを指定することでデーモンにさせていません.
 授業前に起動させておきたい,Dockerコンテナは,履修者数をもとにしたグループの数と,あとひとつ,教員デモ用となります.雑多な処理を行うRubyスクリプトに着手したのは,授業当日の午前中でした.このRubyスクリプトはパスワード生成のあと,順にコンテナを起動するためのシェルスクリプトを用意して保存し,サーバの利用方法(グループごとにポート番号やパスワードが違う)と注意事項のマニュアルを作成します.使用する字種に「$」を入れていると,思うようにパスワード設定がなされていないのに気づいたのは授業中のことでした.
 コンテナ稼働後,htopコマンドでプロセス状況を見ると,コンテナの数(の倍?)だけVIRTに20GB超の値が出ますが,実メモリの使用は8GB程度に抑えられていました.
 TAより遅れて,教室入りしました.遅刻者も想定しながら,グループワークの説明をゆっくりアナウンスし,部屋を見回したところ,4人グループが6つと,3人グループが1つ,できていました.グループから1人ずつでいいので,Moodleの所定のところに報告してくださいと指示をしてから,巡回すると,3人グループのところから,あと1人遅刻するので,その学生を加えていいですかと質問があり,認めました.教卓に最も近いグループでは,1人が他のメンバーに,gitの使い方を解説していました.

*1:ペアワークおよびグループワークでのファイル共有の方法については,ペアやグループの中で決めてくださいと指示しました.

*2:このファイルの2行目に,「JRE_HOME=/opt/java/openjdk;export JRE_HOME」を入れています.docker-endpoint.shではなくDockerfileでのコマンド実行です.