状況
-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.json
で forwardPorts
要素を使える。
{ "name": "ubuntu", "build": { "dockerfile": "Dockerfile" }, "settings": { "terminal.integrated.shell.linux": "/bin/bash" }, "forwardPorts": [80] }
どうも、この forwardPorts
の挙動はあやしい。
runArgs を使って -p=80:80
を直接書いたほうが良い。
"runArgs": ["-p=80:80/tcp"]