'How do I redirect an address to another docker container using the nginx?

Im trying to redirect to docker containers using nginx but when accessing my server from an 'external pc'(host and other vagrant machines) the address doesn't resolve. I have passed 'host.docker.internal:172.17.0.1' to the containers host file but still no success. Im testing this using vagrant. The server is running Ubuntu Server 21.10 and curling the address from here works.

default nginx conf:

server {
listen       80;
listen  [::]:80;
server_name  localhost;
    
#access_log  /var/log/nginx/host.access.log  main;
location /dockercontainer_1 {
    return 301 http://host.docker.internal:79;
}

location /dockercontainer_2 {
    return 301 http://host.docker.internal:34;
}

#error_page  404              /404.html;

# redirect server error pages to the static page /50x.html
#
error_page   500 502 503 504  /50x.html;
location = /50x.html {
    root   /usr/share/nginx/html;
}
}

nginx container host file:

127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.1      host.docker.internal
172.17.0.4      35fced58d2eb

Ubuntu Server hosts file:

127.0.0.1 localhost
127.0.1.1 vagrant
127.0.0.1 host.docker.internal
# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters


Solution 1:[1]

to access containers from external machine you need to tell nginx to serve on your public ip address so just edit the forth line of default nginx config file :

this line:

  server_name localhost;

To this:

  server_name 127.0.0.1  localhost;

change 127.0.0.1 to the public ip address of your machine.

Solution 2:[2]

Lets say that you initiate 2 nginx container with the following command

docker container run -d --name dockercontainer1 -p 8081:80 nginx
docker container run -d --name dockercontainer2 -p 8082:80 nginx

Then you should edit your localtion block in the host machine

location /dockercontainer_1 {
    return 301 http://localhost:8081;
}

location /dockercontainer_2 {
    return 301 http://localhost:8082;
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 just developer
Solution 2 Tolis Gerodimos