SSH接続可能なDockerコンテナの作成方法

2022/12/11に公開

1. 概要

以下の理由から、ユーザーを作成してSSHでDockerに入れるコンテナを作成する。

  1. Docker内のrootユーザーでマウントしたディレクトリを編集するとホストのディレクトリの権限がrootになってしまい、管理者権限なしで編集できなくなってしまう
  2. 他人が使用する際にDocker環境を通常のLinuxマシンのように使用できるようにしたい
  3. VS Codeから使用する際に、リモートPCのDockerコンテナにユーザーを指定して入る方法がわからない

Deep Learningの学習に使用したいのでNvidia Dockerを使用してGPUを使用できる環境を作り、Anacondaをインストール済みのDockerイメージを作成する。

2. 環境準備

Ubuntu

以下の環境で検証

  • OS : Ubuntu 22.04LTS
  • GPU : NVIDIA Geforce RTX 2070 Super

Nvidia Driver

「Nvidia driver install Ubuntu」等で調べると以下の方法が見つかる。

  1. NVIDIAドライバダウンロードページからShell Scriptをダウンロードしてnouveauを無効化してインストールする
  2. CUDA Toolkitをインストールする際に最後にcuda-driversも一緒にインストールすることでNVIDIAドライバをインストールする
  3. sudo ubuntu-drivers installのコマンドでインストールする方法
  4. NVIDIA Driver Installation Quickstart Guideのページを参考にインストールする。

1と3の方法はインストールに失敗することが多かった。4の方法はUbuntu 16.04LTSとUbuntu18.04LTSの記述があり、Ubuntu 20.04LTS以上については記述がないがインストールはできた。なので、2の方法をよく使用する。(どれを使用するのが好ましいのか教えてください…)

Docker

公式サイトの記述通りにDockerをインストールする。GPUを使用したいのでnvidia-dockerもインストールする。dockerを実行するたびsudoを打ちたくない場合は3も設定する。VS Codeで使用する場合も3の設定が必要。

  1. Install Docker Engine on Ubuntu
  2. Nvidia Docker InstallatiNvidiaon Guide
  3. Manage Docker as a non-root user

Windows

以下の環境で検証

  • OS : Windows 11 Home
  • GPU : NVIDIA Geforce RTX 2070 Super

公式サイトからインストーラをダウンロードして実行するだけ。NVIDIAドライバは普段PCを使っていれば入っているので、だいたいはDocker Desktopをインストールすればよい。

  1. Nvidia Driver
  2. Docker Desktop

3. Dockerコンテナの作成

Dockerfile

Dockerfileに以下を記述する。

FROM nvidia/cuda:11.3.1-cudnn8-devel-ubuntu20.04

ARG USERNAME=hoshi
ARG PASSWORD=password
ARG UID=1000
ARG GID=1000

# Setup timezone.
ENV TZ=Asia/Tokyo
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN apt-get update
RUN apt-get upgrade -y

# Softwares.
RUN apt-get install -y wget git emacs tmux less

# Install anaconda.
RUN apt-get install -y libgl1-mesa-glx libegl1-mesa libxrandr2 libxrandr2 libxss1 \
    libxcursor1 libxcomposite1 libasound2 libxi6 libxtst6
RUN wget -P /opt https://repo.anaconda.com/archive/Anaconda3-2020.02-Linux-x86_64.sh && \
    bash /opt/Anaconda3-2020.02-Linux-x86_64.sh -b -p /opt/anaconda3 && \
    rm /opt/Anaconda3-2020.02-Linux-x86_64.sh

# SSH
RUN apt-get update && apt-get install openssh-server sudo -y
RUN groupadd -g ${GID} developer
RUN useradd -rm -d /home/${USERNAME} -s /bin/bash -g developer -u ${UID} ${USERNAME} 
RUN gpasswd -a ${USERNAME} sudo
RUN echo "${USERNAME}:${PASSWORD}" | chpasswd
RUN service ssh start

EXPOSE 22 80
CMD ["/usr/sbin/sshd","-D"]

Dockerイメージ、コンテナの作成

Dockerfileのおいてあるディレクトリでdocker buildを実行してイメージを作成し、docker runでコンテナを作成、起動する。ユーザー名等は自分の環境に合わせて変更する。UIDはターミナルでid -u、GIDはid -gと打って確認できる。

$ docker build \
    --build-arg USERNAME=hoshi \
    --build-arg PASSWORD=password \
    --build-arg UID=1000 \
    --build-arg GID=1000 \
    -t hoshi/anaconda:cuda11.3.1-ubuntu20.04 .
$ docker run -d -p 1022:22 --gpus all --restart always --shm-size 4g \
    -v /home/hoshi/work:/home/hoshi/work \
    --name anaconda-cuda11.3 hoshi/anaconda:cuda11.3.1-ubuntu20.04

Windownsの場合は-v "C:\Users\hoshi\Projects":/home/hoshi/workなどに変更する。docker exec -it -u hoshi anaconda-cuda11.3 bashで起動したコンテナに入る。

Dockerfileの各内容についての解説

FROM nvidia/cuda:11.3.1-cudnn8-devel-ubuntu20.04

dockerhubから利用したいcuda, cudnn, ubuntuのバージョンのものを選ぶ。

# Setup timezone.
ENV TZ=Asia/Tokyo
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN apt-get update
RUN apt-get upgrade -y

タイムゾーンを設定する。これがないとアップグレード中に止まってしまうことがある。

# Softwares.
RUN apt-get install -y wget git emacs tmux less

使用するソフトウェアのインストール。自分の使用するものを好きに追加。

RUN apt-get install -y libgl1-mesa-glx libegl1-mesa libxrandr2 libxrandr2 libxss1 \
    libxcursor1 libxcomposite1 libasound2 libxi6 libxtst6
RUN wget -P /opt https://repo.anaconda.com/archive/Anaconda3-2020.02-Linux-x86_64.sh && \
    bash /opt/Anaconda3-2020.02-Linux-x86_64.sh -b -p /opt/anaconda3 && \
    rm /opt/Anaconda3-2020.02-Linux-x86_64.sh

必要な依存関係をインストールした後、Anaconda/opt/anaconda3にインストール。

# SSH
RUN apt-get update && apt-get install openssh-server sudo -y
RUN groupadd -g ${GID} developer
RUN useradd -rm -d /home/${USERNAME} -s /bin/bash -g developer -u ${UID} ${USERNAME} 
RUN gpasswd -a ${USERNAME} sudo
RUN echo "${USERNAME}:${PASSWORD}" | chpasswd
RUN service ssh start

指定されたuidとgidでアカウントを作成し、管理者権限を追加。

EXPOSE 22 80
CMD ["/usr/sbin/sshd","-D"]

使用するポートをEXPOSEで指定。sshで使用する22番と、どこかで使用するかもしれないと思い80番も指定した。その後sshdを起動。

4. VS CodeからDockerコンテナに接続

VS Codeと拡張機能のインストール

以下の2つをインストール

DockerコンテナへのSSH接続の準備

ローカルPC上で接続する場合の例。ホスト側で鍵を生成。

$ ssh-keygen -t rsa -b 4096

生成した公開鍵をコンテナ内にコピー。

$ ssh-copy-id -i $HOME/.ssh/id_rsa.pub -p 1022 hoshi@localhost

VS CodeでDockerコンテナにSSHで接続

拡張機能「Remote - SSH」を用いてDockerコンテナに接続する。
VS CodeにDocker用の拡張機能があるが今回はSSHを使用。

/home/hoshi/.ssh/config ファイルを編集。

Host Anaconda
    HostName localhost
    User hoshi
    Port 1022
    IdentityFile /home/hoshi/.ssh/id_rsa

ターミナルで接続できることを確認。

ssh Anaconda

VS Codeの左下の「><」みたいなボタンを押して「Connect to Host...」を選択するとconfigで設定したサーバを選択できる。

Discussion