ぬうぱんの備忘録

技術系のメモとかいろいろ

作った曲一覧はこちら

ローカルマシン上でコンテナ立てて localhost で http アクセスしようとすると失敗する

状況

-p で 80 番をフォワーディングしてるのに curl で http リクエストを投げても繋がらない。

PS C:\workspace\factorio_server_builder\base_image> docker run -d -p 80 nginx
ad0a9fbdf0521c887f56778f325e08c76e52d4ab7d781fa6f5bd306db957d5d5
PS C:\workspace\factorio_server_builder\base_image> docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
ad0a9fbdf052        nginx               "/docker-entrypoint.…"   6 seconds ago       Up 5 seconds        0.0.0.0:32770->80/tcp   loving_satoshi
PS C:\workspace\factorio_server_builder\base_image> curl http://localhost
curl : リモート サーバーに接続できません。
発生場所 行:1 文字:1
+ curl http://localhost
+ ~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest]、WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

--net=host でもダメ。

PS C:\workspace\factorio_server_builder\base_image> docker run -d --net=host nginx      
0f853bf9be02cfc2ee8e3d066eb56df24a1142a8c472358679fc838f38f1beb7
PS C:\workspace\factorio_server_builder\base_image> docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
0f853bf9be02        nginx               "/docker-entrypoint.…"   14 seconds ago      Up 13 seconds                           brave_hamilton
PS C:\workspace\factorio_server_builder\base_image> curl http://localhost
curl : リモート サーバーに接続できません。
発生場所 行:1 文字:1
+ curl http://localhost
+ ~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest]、WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

解決方法

-p 80:80 みたいに、ホスト側ポート番号を省略せずに書く。

PS C:\workspace\factorio_server_builder\base_image> docker run -d -p 80:80 nginx
PS C:\workspace\factorio_server_builder\base_image> docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                NAMES
6e0adde1c3b4        nginx               "/docker-entrypoint.…"   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp   vigilant_gould
PS C:\workspace\factorio_server_builder\base_image> curl http://localhost


StatusCode        : 200
StatusDescription : OK
Content           : <!DOCTYPE html>
                    <html>
                    <head>
                    <title>Welcome to nginx!</title>
                    <style>
                        body {
                            width: 35em;
                            margin: 0 auto;
                            font-family: Tahoma, Verdana, Arial, sans-serif;
                        }
                    </style>
                    <...
RawContent        : HTTP/1.1 200 OK
                    Connection: keep-alive
                    Accept-Ranges: bytes
                    Content-Length: 612
                    Content-Type: text/html
                    Date: Sat, 29 Aug 2020 09:25:21 GMT
                    ETag: "5f32b03b-264"
                    Last-Modified: Tue, 11 Aug 2020 ...
Forms             : {}
Headers           : {[Connection, keep-alive], [Accept-Ranges, bytes], [Content-Length, 612], [Content-Type, text/html]...}
Images            : {}
InputFields       : {}
Links             : {@{innerHTML=nginx.org; innerText=nginx.org; outerHTML=<A href="http://nginx.org/">nginx.org</A>; outerText=nginx.org; tagName=A; href=http://nginx.org/}, @{innerHTML=nginx.com; innerText=nginx.com;  
                    outerHTML=<A href="http://nginx.com/">nginx.com</A>; outerText=nginx.com; tagName=A; href=http://nginx.com/}}
ParsedHtml        : System.__ComObject
RawContentLength  : 612

なんで?

ホスト側ポートを省略した場合 docker が適当に決めるらしい。 windows は犯人ではない。

ちなみに…

vscode の Remote - Containers 環境で作業してる場合 container.jsonforwardPorts 要素を使える。

{
  "name": "ubuntu",
  "build": {
    "dockerfile": "Dockerfile"
  },
  "settings": { 
    "terminal.integrated.shell.linux": "/bin/bash"
  },
  "forwardPorts": [80]
}

どうも、この forwardPorts の挙動はあやしい。 runArgs を使って -p=80:80 を直接書いたほうが良い。

  "runArgs": ["-p=80:80/tcp"]

参考

qiita.com