Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
57
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

docker 「コンテナを ssh 接続できるようにするDockerfile」チュートリアル解説

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"]

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
57
Help us understand the problem. What are the problem?