Posted at

来客用 (?) サーバ環境を構築した

某氏から「GPU サーバ1貸して」と言われたので、貸すことにした。

ただし物理的に貸すわけにはいかないので、リモートでログインして使ってもらうことにした。


自宅ネットワークまで接続してもらう

既に自宅の EdgeRouter X では VPN サーバが稼働していて、このアカウントを新しく発行するだけで自宅ネットワークまで接続してもらうことができた。

今回はこの話は割愛。


ログインしてもらうためのコンテナを作る

仮想環境に入ってもらえば好き勝手使ってもらって大丈夫やろ、ということで Docker で SSH できるコンテナを作ることにした。


Dockerfile

# GPU を利用する目的で貸し出すので CUDA Toolkit が入ってるイメージをベースにする

FROM nvidia/cuda:9.0-devel-ubuntu16.04

# sshd を入れる
RUN apt update \
&& apt install -y openssh-server \
&& rm -rf /var/lib/apt/lists/*

# このディレクトリを作っておかないと sshd 起動時に怒られる
RUN mkdir -p /var/run/sshd

# 利用する人の公開鍵 URL
ARG SSH_KEY_URL=https://github.com/papix.keys

# 公開鍵を配置する
RUN mkdir -p /root/.ssh \
&& cd /root/.ssh \
&& chmod 700 . \
&& wget ${SSH_KEY_URL} -O authorized_keys -q \
&& chmod 600 authorized_keys

# 何故かこれを書いておかないと nvcc にパスが通らない
RUN echo "export PATH=$PATH" >> /root/.bashrc

# sshd を起動する
CMD ["/usr/sbin/sshd", "-D"]


イメージをビルドする。

$ docker build . -t cuda-sshd:papix

Makefile を書いて簡単に管理できるようにしておく。


Makefile

.PHONY: run start stop sh

USER=papix
IMAGE=cuda-sshd:${USER}
NAME=${USER}-gpu
PORT=10022

run:
docker run -d \
--runtime=nvidia \
-p ${PORT}:22 \
-h ${NAME} \
--name ${NAME} \
${IMAGE}

start:
docker start ${NAME}

stop:
docker stop ${NAME}

sh:
docker exec -it ${NAME} bash


コンテナを起動する。

$ make run


おわり

あとは「我が家の VPN に繋いだら root@<サーバアドレス>:10022 に SSH してくれ、公開鍵は配置しておいたから」と伝えれば終了。

コンテナ内のデータは永続化していないので、誤ってコンテナを削除2してしまわないようにだけ注意が必要。





  1. 機械学習用の GPU マシンを組んだ - ほとラボ 



  2. コンテナ止まってるときにうっかり docker system prune してしまいがち