Docker port forwarding not working
DockerPortforwardingDocker ContainerDocker Problem Overview
I have setup Docker container for access my machine docker container to another machine in local.
Create a container below command:
docker run -it -d --name containerName -h www.myhost.net -v /var/www/html -p 7000:8000 --net mynetwork --ip 172.11.0.10 --privileged myimagename bash
After Create A Container Details:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1e1e5e9b74b4 myimgaename "bash" 21 minutes ago Up 6 minutes 0.0.0.0:7000->8000/tcp containername
NetWork Details:
"NetworkSettings": {
"Bridge": "",
"SandboxID": "fe357c54c816fff0f9d642037dc9a173be7f7e42a80776d006572f6a1395969e",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {
"8000/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "7000"
}
]
}
if I access docker ipaddr(172.11.0.10) or hostname(www.myhost.net) in mymachine(hostmachine) it working
But if I access with Port doesn't work: hostmachine ip: 192.168.1.1
go to the browser 192.168.1.1:7000 hostmachine and locally connected anoter machine also.
But My 7000 port are listen in hostmachine:
# ps aux | grep 7000
root 10437 0.0 0.2 194792 24572 pts/0 Sl+ 12:33 0:00 docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 7000 -container-ip 172.11.0.10 -container-port 8000
root 10941 0.0 0.0 118492 2324 pts/3 R+ 12:44 0:00 grep --color=auto 7000
update 1:
$ docker version
Client:
Version: 1.11.2
API version: 1.23
Go version: go1.5.4
Git commit: b9f10c9
Built: Wed Jun 1 21:39:21 2016
OS/Arch: linux/amd64
Server:
Version: 1.11.2
API version: 1.23
Go version: go1.5.4
Git commit: b9f10c9
Built: Wed Jun 1 21:39:21 2016
OS/Arch: linux/amd64
Suggest me Why Cannot access my Container to another machine. How to Resolve this Problem
Docker Solutions
Solution 1 - Docker
A very common problem can be this:
Bind your app inside Docker to 0.0.0.0, not to 127.0.0.1 address to let Docker reach the app inside container.
Solution 2 - Docker
Port 7000
on the host is redirecting to port 8000
in the container, but is anything listening on that port in the container?
Your docker run
command is a bit odd: -it
is for running a container interactively with a terminal attached; -d
is for running detached, in the background; bash
at the end overrides whatever the image configures as the startup command, which is why I think there's nothing listening on port 8000
.
Try running the simplest NGINX container with this:
docker run -d -p 8081:80 nginx:alpine
And then verify you can get to the homepage:
curl http://localhost:8081
If that's working then I'd look at how you're running your image.
Solution 3 - Docker
This was happening for me w/ Docker for Mac. Clicking the Docker icon, then Restart
did the trick.
Solution 4 - Docker
Hi I have encountered this problem as I'm using Dockerfile to build image. I realised I can't set address to specific IP address meaning after I change
srv := &http.Server{
Handler: s,
Addr: "127.0.0.1:5000",
}
to
srv := &http.Server{
Handler: s,
Addr: ":5000",
}
the command docker run -dp 5000:5000 --name myapiserver api_server:v1
is working properly.
I can access the the container port 5000 without issue. So to conclude in container you can only set the server's port?
Update
127.0.0.1 is the IP address that your host will not send to outsite, the proper way to handler way is to send through all IP address which is 0:0:0:0 or in short just port only.
Solution 5 - Docker
For anyone running serverless-offline inside a docker container:
I was trying to map localhost:3000 on my mac to the default serverless-offline app port of 3000 (which was running inside docker), achieved the desired result as follows:
(1) Added --host:0.0.0.0
to the usual serverless offline command like so:
serverless offline --host 0.0.0.0
(2) Then ran the docker container with the usual port mapping:
docker run -p 3000:3000 <your-image-name>
NOTE: Needed to rebuild my image (before running it) to get everything working properly.
Solution 6 - Docker
I hit this problem with a Docker Wordpress container.
Troubleshooting:
curl -Is http://192.168.X.X
executed on the Docker host itself would return a result as expected, but the same command executed on my laptop on a different subnet would just hang.
Same with telnet 192.168.X.X 80
: this would connect as expected on port 80 from the Docker host itself, but not outside the Docker host; it too would just hang.
docker logs containerName
provided no useful clues.
On the router's firewall I allowed everything between the Docker host and my laptop to ensure the router's firewall wasn't breaking connectivity on port 80.
Solution:
Struggling to clear the error, I decided to remove my custom networking from the docker run
command to reduce complexity.
Like the OP, I had specified my own custom network and IP address in the docker run
command. But when I removed --net
and --ip
from the docker run
command, the container rose-up using the default bridge and a Docker DHCP assigned address.
Test Solution:
I found the IP of my Wordpress container using:
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' wordpressContainerName
and tried loading Wordpress in a browser on my laptop. The container could now be contacted on the forwarded port 80 outside the Docker host on a different subnet.
Conclusion:
Removing --net
and --ip
from the docker run
command fixed the issue in my case; YMMV of course.
Solution 7 - Docker
You can use docker run -d -p 127.0.0.1:9000:4000 --name some-container some-image-name
or you can use -it
flag
Solution 8 - Docker
After thousand of hours digging this problem, i finally solve it by this silly way:
- Uninstalled docker:
> sudo yum remove docker
> docker-client
> docker-client-latest
> docker-common
> docker-latest
> docker-latest-logrotate
> docker-logrotate
> docker-engine
> docker-ce
-
Update my centos system:
yum -y update
-
Reboot
-
Re-install docker
-
Re-install container/image
Now it work like a charm.
Solution 9 - Docker
Partial Answer:
Now I solved this problem partially, While i try without bash in create a container and change my port to 3000(-p 3000:80) it worked for me.
Before Command:
docker run -it -d --name containerName -h www.myhost.net -v /var/www/html -p 3000:80 --net mynetwork --ip 172.11.0.10 --privileged myimagename bash
After Command:
docker run -it -d --name containerName -h www.myhost.net -v /var/www/html -p 3000:80 --net mynetwork --ip 172.11.0.10 --privileged myimagename
Then,
execute the container with bin/bash
docker exec -it containerName bin/bash
Now , works locally Connected Another machine.
hostmachineip:3000
I don't know docker have any port restrictions.But This solution works for me.
Solution 10 - Docker
When i encountered this problem (with a docker-compose managed set of docker instances), I found that deleting the network that docker-compose fixed the problem:
docker-compose stop
# find the network related to my docker-compose setup
docker network ls
docker network rm NETWORKNAME
# let docker-compose recreate the network:
docker-compose up -d