SSH デーモン用サービスの Docker 化

eg_sshd イメージの構築

以下の Dockerfile はコンテナ内に SSHd サービスをセットアップします。これは他のコンテナ用ボリュームの調査や、テスト用コンテナに対する迅速なアクセスを提供します。

# sshd
#
# VERSION               0.0.2

FROM ubuntu:14.04
MAINTAINER Sven Dowideit <SvenDowideit@docker.com>

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

イメージを構築するには:

$ docker build -t eg_sshd .

test_sshd コンテナの実行

次は実行します。 docker port を使い、コンテナのポート 22 がホスト側のどのポートに割り当て(マップ)されているか確認できます。

$ docker run -d -P --name test_sshd eg_sshd
$ docker port test_sshd 22
0.0.0.0:49154

それから、コンテナに 対して root として SSH できます。接続先は、 IP アドレス(これは docker inspect で確認できます )か、Docker デーモンの IP アドレス( ip addressifconfig で確認できます )上のポート 49154 か、Docker デーモンのホスト localhost です。

$ ssh root@192.168.1.2 -p 49154
# パスワードは ``screencast`` です。
$$

環境変数

sshd デーモンでシェルを呼び出すのは複雑です。シェルを起動する前に sshd 環境を調整し、 環境変数をユーザのシェルから通常のDocker のメカニズムに対して渡す必要があるためです。

値を設定するためには、 DockerfileENV を使います。先ほどの Dockerfile の例では、シェルの初期化のために /etc/profile を送る必要があるでしょう。

docker run -e ENV=value で値を渡す必要がある場合は、同様の処理を行うスクリプトを準備する必要があります。そのためには sshd -DCMD 命令に置き換え、その準備したスクリプトを実行します。

クリーンアップ

最後に、テストの後でコンテナの停止と削除をし、そのイメージを削除します。

$ docker stop test_sshd
$ docker rm test_sshd
$ docker rmi eg_sshd

参考

Dockerizing an SSH daemon service

https://docs.docker.com/engine/examples/running_ssh_service/