ishi:LAN上の別機からコンテナのウェブサーバにささっと接続できるツールを作ったishi:LAN上の別機からコンテナのウェブサーバにささっと接続できるツールを作ったsuin2017年1月3日Dinghyすごく便利です。何が便利って、MacでDockerをシームレスに扱えるのはもちろんのこと、DNSサーバとバーチャルホストを扱えるリバースプロキシもバンドルされていて、ひとつのDockerホストにapp1.docker・app2.docker・app3.docker...とドメイン名を当てつつ、複数のWebサーバが共存できるところです。machine)を複数作って、プロジェクトごとに分けていましたが、VMがSSDの容量を食いつぶすこともありましたが、Dinghyは無駄な容量も減らせるので気に入っています。モバイル向けウェブサービスを作るっていると、iPhoneやAndroidの実機からDinghy内のコンテナに繋ぎたくなります。...、これが思いの外面倒でした。実機からは*.dockerでは繋がらない当然のことならが、DinghyのDNSサーバはMacに立っています。iPhoneなどの実機でURLに*.dockerを入れてもつながりません...。stoneでTCPをリピートするもバーチャルホストでNG次に、stoneを使ってTCP通信をリピートしてみました。9000iPhoneのSafariで192.168.3.2:9000と打って...。Proxyの画面が虚しく表示されるだけでした。それもそのはず、HTTPヘッダのHostが192.168.3.2:9000になるので、dinghyのリバースプロキシがupstreamを特定できないためです。DNSサーバを立てつつ、stoneでTCPリピートすれば行けそうかと思ったのですが、実機の数だけDNSサーバの設定をするのかと考えたら、気が重くなり途中でやめました。「Macにnginxとかhipacheでリバプロ立てれば?」これは、同僚から提案されたことです。「ですよねー」と思いつつも、一時的につなげればいいかなという状況で、毎度設定を書くのも面倒だなと思い見送りました...。9000やりたいことはこういうことなんです。シンプルなコマンドで起動する、その場限りのリバースプロキシ。Macで9000番で受けたHTTPリクエストを、Hostヘッダを書き換えつつそのままapp1.dockerに投げつけるようなもの。GitHubをあさってみましたが、ぴったりなものが見つからなかったので作ることにしました。それで出来上がったのが「ishi」というツールです(苦笑)。https://github.com/suin/ishi久々にGo言語書きました。for構文の書き方ググりました...。あの38日間は一体何だったのか...orzishiの使い方ishiはとてもシンプルなリバースプロキシです。引数にアップストリームのホスト名を渡すだけで起動します。app.dockerこの状態で、LAN上の別マシンからhttp://(MacのIP):8000にアクセスするとapp.dockerを見ることができます。READMEにあるとおりなので、関心があれば御覧ください。ishiを作る過程で学んだことdocopt-goというCLIフレームワークが便利でしたGo言語でCLIフレームワークというとurfave/cliが有名で、ずっとこれを使っていろいろ作ってきたのですが、今回はdocopt-goを試してみました。unfrave/cliはコマンドの設定を、同ライブラリが提供するAPIをゴリゴリ書いていってコマンドの解釈機と実行機が出来上がる正攻法的なものに対して、docopt-goはヘルプテキストをパーサに渡すとコマンドの解釈機ができあがるという変わり種です。下記はdocopt-goのREADMEにもあるサンプルですが、CLIの設定はヘルプテキストそのままです。fmt.Println(arguments)}docopt.Parseがコマンドに渡された引数をパースしてargumentsを返してきますが、その後の処理は自分でゴリゴリ書く形になります。複雑なコマンドを実装するなら、APIに関数を渡していけば実行機まで出来上がるunfrave/cliが良さそうですが、今回作ったishiは引数が一つしかないシンプルなものなのでdocopt-goを採用しました。使えるポートを探すロジックishiでは--listenオプションでリバースプロキシのポートを指定しない場合、Mac側でlisten可能なポートを探す仕様になっています。この仕様は無くてもいいかなと思いましたが、毎回リッスンポートを考えるのも面倒だなと思ったので実装してみました。findAvailablePort関数がその実装です。Vistaでインターネットの共有。できなかったのが解決!suintwitter2017年1月3日実機からは*.dockerでは繋がらないstoneでTCPをリピートするもバーチャルホストでNG「Macにnginxとかhipacheでリバプロ立てれば?」欲しいのはHTTPレベルの「stone」ishiの使い方ishiを作る過程で学んだことdocopt-goというCLIフレームワークが便利でした使えるポートを探すロジックおわり。