ngrokをdocker composeで使う

はじめに

ngrokというサービスをDocker composeで導入する手順です。

PCに直接ngrokをインストールしてコマンドで起動する場合と少し勝手が違ったのでメモしておきます。

環境

  • ngrok 3.5.0
  • Docker Desktop for Windows
  • docker composeを使って起動する

公開したいウェブサイト http://localhost がローカル上で閲覧可能な状態である前提です。

導入手順

アカウント登録

まずは、ngrokに登録をしてAuthtoken(認証用トークン)を取得します。

docker-compose.yml にngrokを追加

以下のように追記します。(そのままコピペ可)

公式より引用
services:
    ngrok:
        image: ngrok/ngrok:latest
        restart: unless-stopped
        command:
          - "start"
          - "--all"
          - "--config"
          - "/etc/ngrok.yml"
        volumes:
          - ./ngrok.yml:/etc/ngrok.yml
        ports:
          - 4040:4040

ウェブサイトやDBコンテナは各々記入してください。

参考

ngrok.yml の作成

ngrokの設定ファイルを作成します。

ngrok.ymlという名前で新規作成し、ルートディレクトリ(docker-compose.ymlと同じ階層)に置きます。

version: "2"
authtoken: ここに取得したauthtoken
tunnels:
  website:
    proto: http
    addr: host.docker.internal:80
    host_header: rewrite

authtokenaddrのポート部分を環境に合わせたものに書き換えて下さい。

参考(オプション)

Configuration File | ngrok documentation
https://ngrok.com/docs/agent/config/

余談

今回ここでハマりました。通常はaddrにポートを指定するだけでいいと思うのですが、以下のようエラーで繋がりませんでした。

ERR_NGROK_8012
Traffic was successfully tunneled to the ngrok agent, but the agent failed to establish a connection to the upstream web service at localhost:80. The error encountered was:

dial tcp 127.0.0.1:80: connect: connection refused

addrhost.docker.internalを指定しないと繋がらないようです。

公式ドキュメントから抜粋

Note: for MacOS or Windows users, the --net=host option will not work. You will need to use the special url host.docker.internal as described in the Docker networking documentation.

Google翻訳
注: MacOS または Windows ユーザーの場合、--net=host オプションは機能しません。 Docker ネットワークのドキュメントで説明されているように、特別な URL host.docker.internal を使用する必要があります。

また、80ポートを使う場合はhost_headerオプションにrewriteの指定(localhostでも可)が必要でした。指定しないと307 temporary redirect(リダイレクトのループエラー)が発生(汗)

このあたりよく理解できていないので理由がわかりません。。。自分の環境またはDockerの設定の問題かもしれませんが、同様のエラーが出ている方は参考にしてもらえれば。

起動

コンテナを起動します。

 docker-compose up -d

正常に起動できていれば、以下のようなアドレスで外部に公開されているばずです。アドレスは起動する度に変わります。

https://xxx-xxx.xxx.xxx.xxx.ngrok-free.app/

公開アドレスは、以下のURLで確認できます。

ngrokにログインしてTunnels > Agents ページでも確認できます。

まとめ

とても便利で簡単に導入できるサービスですが、今回ちょっとハマってしまったのでメモを残しておきます。