dockerでコンテナの中からホストにsshで通信してみた

例によって自分用のメモだからどこかおかしいかも

前提

jenkinsで定期的にコンテナの動作状況を確認して、停止してるコンテナがあったら自動で再起動して欲しい。
->でもホスト環境にドカドカインストールしてたら面白くない。
->監視するコンテナを作ってそこにjenkins入れてホストにコマンド飛ばせばいいんじゃね

ってことでまずはコンテナからホストにsshで接続してnginx入れてるコンテナ立ち上げるコンテナを作ってみた。

FROM base/archlinux

RUN pacman -Syy --noconfirm
RUN pacman -S --noconfirm archlinux-keyring
RUN pacman -Syu --noconfirm
RUN pacman-db-upgrade
RUN pacman -S --noconfirm openssh

ADD id_rsa /

EXPOSE 80
CMD ssh -t -t -o 'StrictHostKeyChecking no' ${HOST_IP} -i /id_rsa docker run -i -t -d -p 80:80 mattyan/nginx

EXPORSEは今は必要なかったな…
事前にホストでsshのキーを作って公開鍵を登録。秘密鍵をADDでコンテナに。
これをmattyan/docadminの名前でビルド。

ホストのIPはコンテナからはわからないみたいだからコンテナ実行時に環境変数を使って渡してあげる。(参考: Dockerコンテナ内部からホストのSMTPを利用したい)

docker run -e "HOST_IP=`ip r | grep 'docker0' | awk '{print $9}'`" mattyan/docadmin

普通にSSHを実行しても

Pseudo-terminal will not be allocated because stdin is not a terminal.

Host key verification failed.

が出てきて接続できなかったのでググッた結果。
Pseudo-は仮想ターミナルを強制的に割り当てるために-tオプションを2個設定。
Host key-は-o ‘StrictHostKeyChecking no’を設定してホストのキーチェックを無視するように設定。

で黙った。(セキュリティ的にはまずそうだけど。特に後者)

これでmattyan/docadminを走らせたらmattyan/nginxを立ち上げて自動的に死ぬコンテナができた。あとは生存監視とjenkinsのインストールだ。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください