Reputation: 474
I am using VS2017 docker support. VS created DockerFile for me and when I build docker-compose file, it creates the container and runs the app on 172.x.x.x IP address. But I want to run my application on localhost.
I did many things but nothing worked. Followed the docker docs as a starter and building microsoft sample app . The second link is working perfectly but I get HTTP Error 404 when tried the first link approach.
Any help is appreciated.
Upvotes: 28
Views: 58417
Reputation: 1084
I ran into this issue in 2024, but the solution was different. I didn't need to port forward, instead, I had to change the -p
flag in my docker run ...
command.
Originally, I was trying to run a Uvicorn server on port 8000 in my container. I setup my container to forward its port 8000 to the host port 8000 using the following command:
-p 8000:8000 (host-port:container-port)
But this didn't work. I think it may be because the WSL2 container port 8000 was blocked by a firewall. So, instead, I setup my Uvicorn server to run on the containers port 80, and changed my port forwarding command to:
-p 8000:80 (host-port:container-port)
and everything worked perfectly!
Hopefully, this solution works for someone else who's coming to this problem in 2024.
Upvotes: -1
Reputation: 11
The answer is to move the -p
argument to the front, after the run
. The order of arguments makes a difference..
So this will not work:
docker run --rm example/app -p 5000:80
And this will work:
docker run -p 5000:80 --rm example/app
Upvotes: 1
Reputation: 1772
There is other problem too You must have correct order with parameters
This is WRONG
docker run container:latest -p 5001:80
This sequence start container but parameter -p is ignore, therefore container have no ports mapping
This is good
docker run -p 5001:80 container:latest
Upvotes: -2
Reputation: 1878
For those who encountering this issue in 2022, changing localhost
to 127.0.0.1
solved an issue for me.
Upvotes: 6
Reputation: 4822
In order to access the example posted on Docker Docs, that you pointed out as not working, follow the below steps,
1 - List all the running docker containers
docker ps -a
After you run this command you should be able to view all your docker containers that are currently running and you should see a container with the name webserver
listed there, if you have followed the docker docs example correctly.
2 - Get the IP address where your webserver
container is running. To do that run the following command.
docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" webserver
You should now get the IP address which the webserver
container is running, hope you are familiar with this step as it was even available within the building Microsoft sample app example that you attached with the question.
Access the IP address you get once running the above command and you should see the desired output.
Answering to your first question (accessing docker container with localhost in docker for windows), in Windows host you cannot access the container with localhost due to a limitation in the default NAT network stack. A more detailed explanation for this issue can be obtained by visiting this link. Seems like the docker documentation is not yet updated but this issue only exists in Windows hosts.
There is an issue reported for this as well - Follow this link to see that.
Hope this helps you out.
EDIT
The solution for this issue seems to be coming in a future Windows release. Yet that release comes out this limitation is available in Windows host. Follow this link -> https://github.com/MicrosoftDocs/Virtualization-Documentation/issues/181
Upvotes: 8
Reputation: 131676
Most likely a different application already runs at port 80. You'll have to forward your web site to a different port, eg:
docker run -d -p 5000:80 --name myapp myasp
And point your browser to http://localhost:5000
.
When you start a container you specify which inner ports will be exposed as ports on the host through the -p
option. -p 80:80
exposes the inner port 80
used by web sites to the host's port 80.
Docker won't complain though if another application already listens at port 80, like IIS, another web application or any tool with a web interface that runs on 80 by default.
The solution is to:
Forwarding to a different port is a lot easier.
To ensure that you can connect to a port, use the telnet command, eg :
telnet localhost 5000
If you get a blank window immediatelly, it means a server is up and running on this port. If you get a message and timeout after a while, it means nobody is running. You anc use this both to check for free ports and ensure you can connect to your container web app.
PS I run into this just a week ago, as I was trying to set up a SQL Server container for tests. I run 1 default and 2 named instances already, and docker
didn't complain at all when I tried to create the container. Took me a while to realize what was wrong.
Upvotes: 9