2
4

More than 3 years have passed since last update.

Docker コンテナ内で立ち上げた godoc にホスト側からアクセスできなかった

Last updated at Posted at 2020-01-04

この記事について

Go言語の勉強用の環境として立ち上げた Docker コンテナ内で godoc サーバを立ち上げたが、ホストOS側のブラウザからアクセスできなかったので調べてみたメモ。

環境

用意した 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 のページが表示できた。

Image from Gyazo

参考

以下の記事がより詳しい

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4