🐳

1台の共用PCを複数人で同時に使うDocker環境構築(SSH + Tailscale)

に公開

はじめに

研究室や家庭に1台だけ高性能なPCがあるけれど、複数人で使いたい時間帯が重なってしまい取り合いになる。そんな経験はありませんか?

この記事では、1台のPC上にDockerを使ってユーザーごとに完全に独立した環境を構築し、各自がいつでもどこからでも安全にSSH接続できるようにする手順を解説します。

これにより、PCの取り合い問題を解決し、全員が快適に作業できる環境を目指します。

この記事で目指すゴール

1台のUbuntuマシン上で、ユーザーごとに専用のDockerコンテナを起動します。各ユーザーは、自分のノートPCなどからTailscale経由で、割り当てられたコンテナにSSH接続して作業ができます。

  • 同時作業:複数人が同時にPCのリソースを使える。
  • 環境分離:各自の環境が完全に独立しており、他のユーザーに影響を与えない。
  • セキュアなリモートアクセス:Tailscaleを使い、面倒なネットワーク設定なしで安全にどこからでも接続できる。

使用する技術

  • Docker:軽量なコンテナ仮想化
  • SSH:セキュアなリモート接続
  • Tailscale:P2PのVPNサービス

STEP1:準備編 - Dockerfileとスクリプトの作成

まず、コンテナの設計図となるDockerfileと、コンテナ起動時にSSHサーバーとTailscaleを同時に起動させるためのスクリプトstart.shを作成します。

作業用のディレクトリを作成し、その中に以下の2つのファイルを作成してください。

1. Dockerfile

コンテナのOSやインストールするソフトウェア、各種設定を記述します。nanoエディタやDNS関連ツールもこの時点でインストールしておきます。

Dockerfile
# Dockerfile (最終版)

# ベースイメージを最新のUbuntuに更新
FROM ubuntu:latest

# nanoとdnsutilsを追加してパッケージをインストール
RUN apt-get update && apt-get install -y curl openssh-server sudo nano dnsutils

# Tailscaleをインストール
RUN curl -fsSL [https://tailscale.com/install.sh](https://tailscale.com/install.sh) | sh

RUN mkdir /var/run/sshd

# ★ビルド時にユーザー名とパスワードを受け取る設定
ARG USERNAME=default_user
ARG PASSWORD=default_pass

# ユーザーを作成しパスワードを設定
RUN useradd -m -s /bin/bash $USERNAME && \
    echo "$USERNAME:$PASSWORD" | chpasswd && \
    adduser $USERNAME sudo

# SSH接続を許可
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config

# 作成した起動スクリプトをコンテナ内にコピー
COPY start.sh /start.sh

# 起動スクリプトに実行権限を付与
RUN chmod +x /start.sh

# コンテナが起動したときに、起動スクリプトを実行
CMD ["/start.sh"]

2. start.sh

このスクリプトは、コンテナが起動したときにSSHサーバーとTailscaleの両方をバックグラウンドで起動させるためのものです。

start.sh
#!/bin/sh

# SSHサーバーをバックグラウンドで起動
/usr/sbin/sshd &

# tailscaled(Tailscale本体)をバックグラウンドで起動
/usr/sbin/tailscaled &

# 環境変数で渡された認証キーを使ってTailscaleに接続
tailscale up --authkey=${TAILSCALE_AUTH_KEY} --hostname="docker-$(hostname)"

# スクリプトが終了しないように待機
wait $!

STEP2:ビルド編 - 安全にユーザー情報を含んだイメージを作成

次に、作成したDockerfileをもとに、コンテナの元となるイメージをビルドします。
このとき、パスワードをコマンド履歴に残さないために、環境変数ファイル.envを使う方法が安全でおすすめです。

1. .envファイルの作成

Dockerfileと同じディレクトリに、ユーザー名とパスワードを記述した.envファイルを作成します。

.env
BUILD_USER="yourname"
BUILD_PASS="yourpassword"

2. ビルドコマンドの実行

.envファイルを読み込んでからdocker buildコマンドを実行し、ユーザー情報をイメージに焼き付けます。

# .envファイルを読み込む
source .env

# 環境変数を使ってビルド
docker build \
  --build-arg USERNAME="$BUILD_USER" \
  --build-arg PASSWORD="$BUILD_PASS" \
  -t yourname-tailscale-image .

これで、yournameというユーザーがパスワードyourpasswordでログインできるyourname-tailscale-imageという名前のイメージが作成されました。

STEP3:起動編 - Tailscaleキーを使ってコンテナを起動

ビルドしたイメージから、実際にコンテナを起動します。

1. Tailscale認証キーの取得

まず、Tailscaleの管理画面にアクセスし、認証キー(Auth Key)を生成します。
Reusable(再利用可能)とEphemeral(一時的)をオンにして生成することをお勧めします。生成されたtskey-...から始まるキーをコピーしておいてください。

2. 起動コマンドの実行

以下のコマンドでコンテナを起動します。Tailscaleを動作させるためのオプションが重要です。

docker run \
  -d \
  --name anata-tailscale-container \
  --cap-add=NET_ADMIN \
  --device=/dev/net/tun \
  -e TAILSCALE_AUTH_KEY="★ここに先ほどコピーした認証キーを貼り付け" \
  yourname-tailscale-image
  • --cap-add=NET_ADMIN:コンテナにネットワーク管理権限を与えます。
  • --device=/dev/net/tun:仮想ネットワークデバイスへのアクセスを許可します。
  • -e TAILSCALE_AUTH_KEY="...":環境変数として認証キーをコンテナに渡します。

これでコンテナがバックグラウンドで起動し、ログイン認証行うことなく、自動的にTailscalに接続できます。

STEP4:接続編 - いつでもどこでもコンテナにアクセス

最後に、自分のクライアントPCから起動したコンテナにSSHで接続します。

  1. TailscaleのIPアドレスを確認
    Tailscaleのマシン一覧ページを開くと、docker-から始まる新しいマシンが追加されているはずです。そこに表示されている100.x.x.x形式のIPアドレスをコピーします。

  2. SSHで接続
    クライアントPCのターミナルから、以下のコマンドを実行します。

    ssh yourname@<TailscaleのIPアドレス>
    

パスワードを聞かれたら、.envファイルで設定したパスワードを入力してください。
これで、コンテナ内にログインして自由に作業を始めることができます。🎉

おわりに

この方法を使えば、1台のPCを複数人で有効活用できます。GPUリソースの共有などにも応用が可能です。ぜひ、快適な開発・研究環境の構築に役立ててください。

Discussion