How do I access a server on localhost with nginx docker container?

If you're using docker-for-mac 18.03 or newer it auto creates a special DNS entry host.docker.internal that dynamically binds to the host inet ip. You can then use the dns name to proxy services running on the host machine from inside a container as a stand-in for localhost.

i.e. an nginx config file:

server {
  listen 0.0.0.0:80;
  server_name localhost;

  location / {
    proxy_pass http://host.docker.internal:3000;
  }
}

You can get your current IP address as shown here:

ifconfig en0 | grep inet | grep -v inet6 | awk '{print $2}'

Then you can use the --add-host flag with docker run:

docker run --add-host localnode:$(ifconfig en0 | grep inet | grep -v inet6 | awk '{print \$2}') ...

In your proxypass use localnode instead of localhost.


Yes. Docker needs to know about your host machine. You can set an alias to that with the --add-host switch. On a *nix box to create an alias to a name "localbox", this would be:

docker run my_repo/my_image --add-host=localbox:<host_name>`

On boot2docker it would be:

docker run my_repo/my_image --add-host=localbox:192.168.59.3`

where you should replace "192.168.59.3" with whatever boot2docker ip returns.

Then, you should access your host machine always through the alias localbox, so just change your nginx config to:

location / {
  proxy_pass http://localbox:3000;
}