普通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
コメント