機械学習などでGPUを利用するソフトウェアパッケージを使うには環境整備が面倒です。
そこで、Dockerを使うことで、パッケージに適した環境を簡単に作ることができます。とりわけ、既に構築済みのdocker imageがDockerhubから無料でダウンロードできるため、環境構築は非常に便利にできるようになりました。しかし、Dockerhubで提供される環境では、必要最小限のものしか入っていない場合があり、例えばSSH用のパッケージが入っていない場合があり、これを自分でインストール・設定しなければいけません。ここでは、備忘録として、SSH構築できたが、SFTPサーバーに接続できない時の対処法を記録しておきます。
Docker container の構築
例えば、ここからTensorflowの公式Docker imageをダウンロードできます。
https://hub.docker.com/r/tensorflow/tensorflow
指示に従ってdocker containerを立ち上げます。
$ docker run -it --rm -p 8022:22 tensorflow/tensorflow:1.15.2-gpu-py3-jupyter bash
上記コマンドを実行すると、docker containerの中に入ります。(このcontainerは一度外に出る(exit)と、自動的に消去されます。消去したくない場合は、--rm
を消してください。)
-p 8022:22
はポート番号8022
からこのcontainerに入れることを意味します。複数のcontainerを構築して、それぞれにSSHで接続したい場合は、異なるポート番号を振り分けることで、接続したいcontainerを指定できます。
SSHサーバーの構築
今インストールされているパッケージ一覧をみると、SSH関連のものが入っていません。
apt list --installed
そこで、openssh-serverをインストールします。
# apt update # インストール情報を最新版に更新します。
# apt install openssh-server # インストール実行
パスワードを設定します。
# passwd
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
もしroot
ユーザーでsshを使いたい場合は、sshd_config
をそのように書き換える必要があります。
# sed -i.bak 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
最後にSSHサーバーを起動します。
# /etc/init.d/ssh start
これでSSHサーバーの構築は完了です。
Containerの外から、SSHでこのcontainerに接続してみましょう。
$ ssh -p 8022 root@localhost
Bad owner or permissions on ~/.ssh/config
# もし上記メッセージが表示された場合は、下記コマンドを実行してください。
$ chmod 600 ~/.ssh/config
$ ssh -p 8022 root@localhost
The authenticity of host '[localhost]:8022 ([::1]:8022)' can't be established.
ECDSA key fingerprint is SHA256:
Are you sure you want to continue connecting (yes/no)?
これで今作った、docker containerに入ることができます。
しかし、SFTPサーバーには接続できません。
$ sftp -oPort=8022 root@localhost
root@localhost's password:
Received message too long 458961211
そこで、またsshd_configを書き換えます。
$ apt install vim
$ vim /etc/ssh/sshd_config
下の方にこの行の部分を
Subsystem sftp /usr/lib/openssh/sftp-server
これに書き換えます。
Subsystem sftp internal-sftp
これで、sftpサーバーに接続できるようになります。
vimを終了するときは、【Esc】を押した後、:wq!
と入力してEnterを押すと、上書き保存して終了します。
$ sftp -oPort=8020 root@localhost
root@localhost's password:
Connected to localhost.
sftp>