/Qithub-PortalHost

✅ Docker ネットワーク内の Web API コンテナの接続を SSH ポートフォワーディングで簡易公開するだけのコンテナです。

Primary LanguageShellMIT LicenseMIT

Qithub PortalHost

Docker 内のネットワークにあるコンテナの Web サービスポートを外部に簡易公開するだけのコンテナです。

用途

Docker で作成した Web サービスを外部に公開したい場合、このコンテナを同じ Docker ネットワークに参加させるだけで以下の設定が不要になります。

  1. ホスト側にコンテナのポートを解放する(-p 8888:80 などの)設定
  2. 自宅のルーターをホストに向けるなどの設定

Docker ネットワーク内のクローズドな環境で完結できるため、意図的にホスト側(LAN 側)に解放しない限り、安全で簡単にコンテナの Web サービスの確認および公開ができます。

使い方

例えば、日本語形態素解析器 kagome の Web API サービス・コンテナを外部に簡易公開したい場合は以下のようになります。(リポジトリの /sample ディレクトリでお試しください)

TL;DR

# サービス・コンテナの起動
docker-compose up -d
# 公開 URL の取得
url_srv=$(docker-compose logs portalhost | tail -1 | awk -F' ' '{print $NF}' | grep localhost.run)
# 公開 URL の確認
echo $url_srv
# 公開 URL で Kagome Web API を叩いてみる
curl -s -XPUT "${url_srv%$'\r'}/a" -d'{"sentence":"すもももももももものうち", "mode":"normal"}' | jq .

TS;DR

docker-compose.yml の中身は以下になります。

version: "3.7"
services:
  portalhost:
    container_name: portalhost
    build: .
    image: portalhost:local
    tty: true
    stdin_open: true
    init: true
    env_file: config.env
    depends_on:
      - kagome
  kagome:
    container_name: kagome
    image: ikawaha/kagome:latest
    command: server -http=":80"
$ # サービス・コンテナをバックグラウンドで起動
$ docker-compose up -d
...
Successfully built 9315b40db3b5
Successfully tagged portalhost:latest
WARNING: Image for service portalhost was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating kagome ... done
Creating portalhost ... done
$ # コンテナの起動を確認(Ports でポートがホスト側に公開されていないことに注目)
$ docker-compose ps
   Name              Command           State   Ports
----------------------------------------------------
kagome       kagome server -http=:80   Up
portalhost   /entrypoint.sh            Up
$ # 外部公開された URL を確認
$ docker-compose logs portalhost
Attaching to portalhost
portalhost    | ssh.localhost.run の接続を kagome:80 にポートフォワーディングしています。
portalhost    | Warning: Permanently added 'ssh.localhost.run,35.193.161.204' (RSA) to the list of known hosts.
portalhost    | Connect to http://qithub-tq63.localhost.run or https://qithub-tq63.localhost.run
$ # ---------------------------------------------------------------------------
$ # 上記の場合、https://qithub-tq63.localhost.run/ へのアクセスが、この Docker
$ # ネットワーク内の http://kagome:80/ へポートフォワーディングされます。
$ # ---------------------------------------------------------------------------
$ # ホストから kagome の API を叩いてみる
$ # https://qithub-tq63.localhost.run/a がエンドポイントです。
$ curl -s -XPUT https://qithub-tq63.localhost.run/a \
  -d'{"sentence":"すもももももももものうち", "mode":"normal"}' | jq .

以下のようなレスポンスが返ってきます。

{
  "status": true,
  "tokens": [
    {
      "id": 36163,
      "start": 0,
      "end": 3,
      "surface": "すもも",
      "class": "KNOWN",
      "features": [
        "名詞",
        "一般",
        "*",
        "*",
        "*",
        "*",
        "すもも",
        "スモモ",
        "スモモ"
      ]
    },
    ...(中略)...
    {
      "id": 8027,
      "start": 10,
      "end": 12,
      "surface": "うち",
      "class": "KNOWN",
      "features": [
        "名詞",
        "非自立",
        "副詞可能",
        "*",
        "*",
        "*",
        "うち",
        "ウチ",
        "ウチ"
      ]
    }
  ]
}

仕組みの概要

基本的には、このコンテナの通信を SSH サーバーに SSH ポートフォワーディングしているだけです。

この時、SSH サーバーに localhost.run のサービスを利用しています。このサービスは、SSH でポートフォワーディングされた接続を HTTP(80 番ポート) もしくは SSL(443 番ポート)で外部に公開します。

参考文献