この記事について
Go言語の勉強用の環境として立ち上げた Docker コンテナ内で godoc サーバを立ち上げたが、ホストOS側のブラウザからアクセスできなかったので調べてみたメモ。
環境
- Windows10 Pro Insider Preview (バージョン: 2004, OSビルド: 19536.1000)
- WSL2 / Ubuntu-18.04 ( .wslconfig で localhost フォワーディング設定済み )
- Docker
- 2.1.7.0(41536)
- Engine 19.03.5
用意した Dockerfile
Dockerfile
FROM golang:latest
RUN mkdir /go/src/app
WORKDIR /go/src/app
RUN go get golang.org/x/tools/cmd/godoc
EXPOSE 6060/tcp
実行したコマンド1(godocがインストールされたコンテナのビルドと、そのコンテナでのgodocサーバの起動)
$ docker build -t hoge .
$ docker run --rm -p 6060:6060 hoge godoc
実行したコマンド2(ホストからgodocサーバにアクセス)
$ curl http://localhost:6060
curl: (52) Empty reply from server
上記のようにサーバから正常な応答が返ってこない。
上記のURLにアクセスした場合の期待する応答は、以下のようなリダイレクトのレスポンス。
$ curl -v http://localhost:6060
* Rebuilt URL to: http://localhost:6060/
* Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 6060 (#0)
> GET / HTTP/1.1
> Host: localhost:6060
> User-Agent: curl/7.58.0
> Accept: */*
>
< HTTP/1.1 302 Found
< Content-Type: text/html; charset=utf-8
< Location: /pkg/
< Date: Sat, 04 Jan 2020 12:58:12 GMT
< Content-Length: 28
<
<a href="/pkg/">Found</a>.
* Connection #0 to host localhost left intact
対処
godoc サーバを起動するコマンドを以下のように変更
$ docker run --rm -p 127.0.0.1:6060:6060 hoge godoc -http 0.0.0.0:6060
- godoc の起動オプション
-http 0.0.0.0:6060
を付与し、コンテナのすべてのネットワークインターフェースからの接続を受け付けるようにする。 - docker run でコンテナ起動時に
-p 172.0.0.1:6060:6060
のようにホスト側のネットワークインターフェースをローカル・ループバック・アドレスに限定する。- 別に
-p 6060:6060
でもホストからアクセス可能だが、ホストと同じネットワークに存在する別の端末からもアクセス可能になってしまう。(参考) - それでも構わない、あるいは、むしろ別端末アクセスさせたいというケースでは
172.0.0.1:
の部分は省略しても構わない。
- 別に
上記のようにサーバを起動したあと、ホスト側のブラウザから http://localhost:6060
にアクセスすると、無事 GoDoc のページが表示できた。
参考
以下の記事がより詳しい