I'm trying to use a dockerized version of nginx as a proxy server for my node (ExpressJS) application. Without any configuration to nginx and publishing port 80 for the container, I am able to see the default nginx landing page. So I know that much is working.
Now I can mount my sites-enabled directory that contains the configuration for proxy_pass localhost:3000
. I have my node application running locally (not in any Docker container) and I can access it via port 3000 (i.e. localhost:3000
). However, I would assume that with nginx container running, mapped to port 80, and proxying my localhost:3000, that I would be able to see my very simple (hello world) application. Instead I receive a 502.
Do I need to pass something into docker? Is this likely a nginx configuration error? Here is my nginx configuration:
server {
listen 0.0.0.0:80;
server_name localhost;
location / {
proxy_pass http://localhost:3000;
}
}
I have tried using this question but it did not seem to help. That is unless I'm doing something completely wrong.
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:On boot2docker it would be:
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:
And finally, if you are using Nginx as a reverse proxy for multiple services, you can spin all of that with docker-compose. Make sure to expose ports “80:80” only on the Nginx service. Other services you can expose only the service port without mapping to the underlying network like so:
and then use Nginx configuration proxy_pass http://service-name:port You don’t need the upstream app part at all
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 forlocalhost
.i.e. an nginx config file:
You can get your current IP address as shown here:
Then you can use the
--add-host
flag withdocker run
:In your
proxypass
uselocalnode
instead oflocalhost
.