結論
以下の3ステップで実施可能です。
1. 共有サーバー接続用ポートフォワーディング
ssh -L[共有サーバー接続用ローカルポート]:[共有サーバーホスト名]:22 [ユーザー名]@[踏み台ホスト名] -p 22 |
2. DB接続用ポートフォワーディング
ssh -L [DB接続用ローカルポート]:[DBサーバーのホスト名]:3306 \ -p [共有サーバー接続用ローカルポート] [ユーザー名]@localhost |
3. DB接続設定イメージ(Docker環境のアプリケーションでの設定)
'host' => 'host.docker.internal', 'username' => 'username', 'password' => 'password', 'database' => 'database_name', 'port' => [DB接続用ローカルポート], |
背景
こんにちは、
株式会社レコチョクで開発を担当している田部井です。
社内では主に、murketというサービスの開発を行っています。
開発をしている中で、Dockerでの開発環境が存在しつつも、
検証やテストのために共有サーバーが存在するような環境が世の中にはあるんじゃないかな〜と思っています。
そのような状態で共有サーバーの方で何らかの問題がおき、その問題を解決するために
Docker環境で共有サーバーが利用するDBと同じデータを参照したい時がありました。
ローカルだけで完結させたいなら、DBのダンプを取り、Dockerに反映するみたいなことでも解決できますが、
ダンプはサイズ大きいと、取得にも反映にも時間がかかり大変だったりみたいなこともあるので、直接接続する方法を考えました。
イメージ図
通常時の調査、作業イメージ図

今回やりたいことのイメージ図

実際にやってみた
まずは、ローカルから踏み台の先にある共有サーバーへのポートフォワーディングを実施します。
共有サーバー接続用ポートフォワーディング
ssh -L[共有サーバー接続用ローカルポート]:[共有サーバーホスト名]:22 [ユーザー名]@[踏み台ホスト名] -p 22 |
例: ssh -L10000:share-server:22 user@jump-server -p 22
イメージ図

次に、共有サーバーへのポートフォワーディングを利用した、DB接続用ポートフォワーディングを実施します。
DB接続用ポートフォワーディング
ssh -L [DB接続用ローカルポート]:[DBサーバーのホスト名]:3306 \ -p [共有サーバー接続用ローカルポート] [ユーザー名]@localhost |
例: ssh -L 13306:db-server:3306 -p 10000 user@localhost

最後に、Docker環境のアプリケーションでの接続設定を行います。
DB接続設定イメージ
'host' => 'host.docker.internal', 'username' => 'username', 'password' => 'password', 'database' => 'database_name', 'port' => 13306, |

これで、ローカルのDocker環境から踏み台の先にある共有サーバーが利用するDBに接続することができます。
最後に
これで、共有サーバーで起きた事象の検証が楽にできるようになるかなと思います。
ですが、実際の利用にはいろいろなリスクを伴う場合があるかと思います。(ゴミデータを追加してしまったり、データを破損してしまったり、、、)
実施時のリスクを考えたうえで、ルールを守って楽しく開発していきましょう。
もっといいやり方もありそうな気はするので、ご意見あればお聞かせください。






