Docker ComposeコンテナにSSH接続して検証する方法

普通Docker開発環境でコマンドを実行するときはdocker compose execなどを使用すると思うが、SSH特有の問題を検証したい時もある。(nohupで長時間のバッチ実行中に切断されても処理が続くのを確認したかった)
Laravelが入った既存のDockerコンテナにSSHサーバーを追加するというのをやってみた。

docker-compose.yml

ポートの設定を追加する。

services:
  php:
    build: ./php
    ports:
      - "80:80"
      - "2222:22" # ここに追加
    volumes:
      - ./php/html:/var/www/html

ポートを2222:22のような形で指定しているが、:の左側がホスト側のポート、右側がコンテナ側のポート。
このケースだとSSH接続するにはssh root@localhost -p 2222のように使うことを想定している。

Dockerfile

以下を追加する。

# ...省略...

# SSHの設定
RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:root123' | chpasswd
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

# ポートの公開
EXPOSE 22 80

# ApacheとSSHを同時に起動するためのスクリプト
COPY conf/start.sh /start.sh
RUN chmod +x /start.sh

CMD ["/start.sh"]

そしてconfディレクトリにstart.shというスクリプトを作った。

#!/bin/bash

# Apacheをバックグラウンドで起動
apachectl start

# SSHサーバーをフォアグラウンドで起動
/usr/sbin/sshd -D

今まではphpイメージにCMD ["apache2-foreground"]が含まれていたが、今回CMDを使ってSSHサーバーを同時に起動する必要があったので、このスクリプトが必要だった。

あとはdocker compose build --no-cache(Sailならsail build --no-cache)して、コンテナを再起動すれば完成だ。

余談:SSH鍵が変わってしまう時は

何度もビルドや再起動をやっているうちにSSHホスト鍵が変わってしまい、次のようなエラーが出た。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.

次のコマンドでknown_hostsから削除できる。

$ ssh-keygen -R '[localhost]:2222'

何度も鍵が変わるようなら、~/.ssh/configに下記を追加することもできる。

Host localhost
  StrictHostKeyChecking no
  UserKnownHostsFile /dev/null

参考

関連記事

コメント

この記事へのコメントはありません。

TOP