はじめに
docker-composeでローカルで開発するとして、DBだけは外部(例えばクラウドに置いてあるDBなど)を使いたい…というときありますよね?
SSHトンネルを踏み台に張れば実現できるのですが、docker-composeを使っているならSSHトンネルもコンテナを使って掘りましょう!
いちいちトンネルを掘ったり埋めたりしなくて済むので地味に便利です。
やり方
使うのはkingsquareさんのdocker-tunnelです。
kingsquare/docker-tunnel: a (simple) dockerized ssh tunnel
3つほど手順を踏む必要があります。
1. ssh (踏み台ホスト名)
で踏み台ホストにログインできるようにする
$HOME/.ssh/configにログイン用の情報を書きます。
Host (踏み台ホストログイン用任意の名前)
HostName (踏み台ホストのIPアドレスもしくはホスト名)
Port (踏み台ホストのSSH用ポート)
User (踏み台ホストのSSH用ユーザ)
ServerAliveInterval 20
IdentityFile (踏み台ホストのSSH用秘密鍵のパス)
この時点でssh (踏み台ホストログイン用任意の名前)
というコマンドで踏み台ホストにログインできるようになります。
2. docker-composeの設定
docker-compose.ymlにdocker-tunnelの設定を書きます。
ここでは仮にdb-tunnelと名前をつけます。
ポイントはホストマシン(ローカル)の.sshとdocker-tunnelコンテナの.sshをバインドマウントするところです。
これによりdocker-tunnelはホストマシンのSSH設定、秘密鍵を使うことができます。
db-tunnel:
container_name: db-tunnel
image: kingsquare/tunnel
ports:
- "(ローカルで使うDBポート番号):(外部DBで使っているDBポート)"
volumes:
- ${HOME}/.ssh:/root/.ssh
- ${SSH_AUTH_SOCK}:/ssh-agent
environment:
- SSH_AUTH_SOCK=/ssh-agent
command: "*:(ローカルで使うDBポート番号):(外部DBのIPアドレスもしくはホスト名):(外部DBで使っているDBポート) (踏み台ホストログイン用任意の名前)"
docker-compose up
などでdocker-tunnelを立ち上げておきます。
3. 利用時の設定
DBの接続先に以下の設定を入れるとDBに接続できます。
ホスト名: db-tunnel
ポート番号: (ローカルで使うDBポート番号)
参考までにLaravelの場合は次のようにします。
DB_HOST='db-tunnel:(ローカルで使うDBポート番号)'
以上