SSH接続可能なDockerコンテナの作成方法
1. 概要
以下の理由から、ユーザーを作成してSSHでDockerに入れるコンテナを作成する。
- Docker内のrootユーザーでマウントしたディレクトリを編集するとホストのディレクトリの権限がrootになってしまい、管理者権限なしで編集できなくなってしまう
- 他人が使用する際にDocker環境を通常のLinuxマシンのように使用できるようにしたい
- 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」等で調べると以下の方法が見つかる。
- NVIDIAドライバダウンロードページからShell Scriptをダウンロードしてnouveauを無効化してインストールする
- CUDA Toolkitをインストールする際に最後にcuda-driversも一緒にインストールすることでNVIDIAドライバをインストールする
-
sudo ubuntu-drivers install
のコマンドでインストールする方法 - 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の設定が必要。
- Install Docker Engine on Ubuntu
- Nvidia Docker InstallatiNvidiaon Guide
- Manage Docker as a non-root user
Windows
以下の環境で検証
- OS : Windows 11 Home
- GPU : NVIDIA Geforce RTX 2070 Super
公式サイトからインストーラをダウンロードして実行するだけ。NVIDIAドライバは普段PCを使っていれば入っているので、だいたいは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つをインストール
- Visual Studio Code
- 拡張機能「Remote - SSH」
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