docker

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

某氏から「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 してしまいがち