モーグルとカバとパウダーの日記

モーグルやカバ(EXカービング)山スキー(BC)などがメインの日記でした。今は仕事のコンピュータ系のネタが主になっています。以前はスパム対策関連が多かったのですが最近はディープラーニング関連が多めです。

bottleのhost指定の誤解

PythonでWeb APIを叩くプログラムを組んでて、テスト用に相手先APIをエミュレートというか単に決まった値返すだけのダミーWeb APIをbottleで用意してました。

で、それをdockerで動かしてて、docker execで入って中から叩くとちゃんと動いていて、テストも通るのだけど、外から叩こうとするとどうしても動かない… となってました。

dockerのポートマッピングの仕方がまずい?とか、Windows上のdocker toolboxで動かしてたのでWindows firewallが悪さしてる?とかそっちのほうを色々調べたんだけどもわからず。


で、最終的にわかったのは、自分のbottleの使い方がまずかった、ということでした。


bottleを走らせる時、下記のようにhostとportを指定するわけですが、このようにhost指定をlocalhostとすると、127.0.0.1の割り振られているインターフェイス、つまりローカルループバック(lo)だけをlistenするようになるため、自サーバ内からlocalhostに対してのアクセスには反応するものの、外からの接続には反応しないのです。

run(host='localhost', port=80)


全部のインターフェイスに対して反応させるには、localhostではなく「0.0.0.0」を指定してやります。

run(host='0.0.0.0', port=80)


これ、bottleのdeploymentってページの一番トップに出てたんで、めっちゃあるあるなんだと思うのですが、思いっきりハマったので。

Deployment ― Bottle 0.13-dev documentation
https://bottlepy.org/docs/dev/deployment.html