13
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[docker-compose] ローカルから踏み台経由で外部DBにアクセスする

Posted at

はじめに

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にログイン用の情報を書きます。

$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設定、秘密鍵を使うことができます。

docker-compose.yml
    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ポート番号)'

以上

13
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?