dockerチュートリアルに、コンテナに直接ssh接続する例が書かれている。
Dockerize an SSH service | Docker Documentation
概要
特別なことは何もしていない。
docker的な解決ではなく、単にサーバー的解決をおこなう。
要するにサーバを立ててから、ssh接続できるようにするまでの手順をDockerfileに書いておけば良い。
Dockefile
FROM ubuntu:16.04
RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:screencast' | chpasswd
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
Dockerfileの解説
sshサーバーをインストールする
RUN apt-get update && apt-get install -y openssh-server
サーバーなしにはssh接続はできぬ。
ssh用のディレクトリ作成
このディレクトリがないとsshdが動かないっぽい。
RUN mkdir /var/run/sshd
rootユーザーにパスワードを設定する
chpasswd
コマンドでパスワード設定をする。Linuxの基本コマンドである。
この例では root
ユーザーに screencast
というパスワードを設定している。
RUN echo 'root:screencast' | chpasswd
rootでのパスワードログインを許可する
sshd_config ファイルを強引に書き換えての設定変更。
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
OpenSSHのバージョンにもよるが、デフォルト設定では通常、 root に直接パスワードでログインすること禁止されている。
「OpenSSH 7.0」がリリース、PermitRootLogin設定の変更などセキュリティ強化が行われる | OSDN Magazine
何かのおまじない
正規表現のせいで読みづらいが /etc/pam.d/sshd
の設定を書き換えている。
コメントにある通り、これを書かないとログイン後にキックされてしまうらしい。
# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
- session required pam_loginuid.so
+ session optional pam_loginuid.so
(だが試しにこの行を消してみたところ、特に問題なくsshログインできた)
ubuntu - Why is it needed to set pam_loginuid
to its optional
value with docker? - Stack Overflow
環境変数を渡す例
チュートリアルにはあくまで例を書いているだけで、特に意味のあることはしていないような。(この二行を消しても動く)
ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile
22番ポートを晒す
EXPOSE 22
sshサーバーを起動する
起動せずにはsshは使えぬ。
CMD ["/usr/sbin/sshd", "-D"]
参考
チャットメンバー募集
何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。