Reputation: 3725
Don't mark it as duplicate, because I looked at the other answers and it doesn't solve my problem.
I am using Windows 7 and docker toolbox.
I am doing this tutorial: https://learn.microsoft.com/en-us/dotnet/csharp/tutorials/microservices
So after this command:
docker run -d -p 80:5000 --name hello-docker weather-microservice
I am not able to reach http://localhost/
So to troubleshoot it, I decided to ping the box. But I can't.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
78179117b516 weather-microservice "dotnet out/Weathe..." 18 hours ago Up 18 hours 0.0.0.0:80->5000/tcp hello-docker
The following doesn't work:
$ docker-machine ip weather-microservice
Host does not exist: "weather-microservice"
$ docker-machine ip hello-docker
Host does not exist: "hello-docker"
$ docker-machine ip 78179117b516
Host does not exist: "78179117b516"
$ docker inspect 78179117b516
[
{
"Id": "78179117b516332c61e393a36cc10f33e0f0b0d2f418d8483b79f90207e0de3c",
"Created": "2017-06-27T23:37:12.147696044Z",
"Path": "dotnet",
"Args": [
"out/WeatherMicroservice.dll",
"--server.urls",
"http://0.0.0.0:5000"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 22059,
"ExitCode": 0,
"Error": "",
"StartedAt": "2017-06-27T23:37:12.339014063Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:0f6481b4a6fb864ecddb36c48a9facfbe30801d328daf59926e1c6c642f3ae24",
"ResolvConfPath": "/mnt/sda1/var/lib/docker/containers/78179117b516332c61e393a36cc10f33e0f0b0d2f418d8483b79f90207e0de3c/resolv.conf",
"HostnamePath": "/mnt/sda1/var/lib/docker/containers/78179117b516332c61e393a36cc10f33e0f0b0d2f418d8483b79f90207e0de3c/hostname",
"HostsPath": "/mnt/sda1/var/lib/docker/containers/78179117b516332c61e393a36cc10f33e0f0b0d2f418d8483b79f90207e0de3c/hosts",
"LogPath": "/mnt/sda1/var/lib/docker/containers/78179117b516332c61e393a36cc10f33e0f0b0d2f418d8483b79f90207e0de3c/78179117b516332c61e393a36cc10f33e0f0b0d2f418d8483b79f90207e0de3c-json.log",
"Name": "/hello-docker",
"RestartCount": 0,
"Driver": "aufs",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "default",
"PortBindings": {
"5000/tcp": [
{
"HostIp": "",
"HostPort": "80"
}
]
},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"CapAdd": null,
"CapDrop": null,
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "",
"Cgroup": "",
"Links": null,
"OomScoreAdj": 0,
"PidMode": "",
"Privileged": false,
"PublishAllPorts": false,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
"UsernsMode": "",
"ShmSize": 67108864,
"Runtime": "runc",
"ConsoleSize": [
25,
80
],
"Isolation": "",
"CpuShares": 0,
"Memory": 0,
"NanoCpus": 0,
"CgroupParent": "",
"BlkioWeight": 0,
"BlkioWeightDevice": null,
"BlkioDeviceReadBps": null,
"BlkioDeviceWriteBps": null,
"BlkioDeviceReadIOps": null,
"BlkioDeviceWriteIOps": null,
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": [],
"DeviceCgroupRules": null,
"DiskQuota": 0,
"KernelMemory": 0,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": -1,
"OomKillDisable": false,
"PidsLimit": 0,
"Ulimits": null,
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0
},
"GraphDriver": {
"Data": null,
"Name": "aufs"
},
"Mounts": [],
"Config": {
"Hostname": "78179117b516",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"5000/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"DOTNET_SDK_VERSION=1.0.0-rc4-004771",
"DOTNET_SDK_DOWNLOAD_URL=https://dotnetcli.blob.core.windows.net/dotnet/Sdk/1.0.0-rc4-004771/dotnet-dev-debian-x64.1.0.0-rc4-004771.tar.gz",
"NUGET_XMLDOC_MODE=skip"
],
"Cmd": null,
"ArgsEscaped": true,
"Image": "weather-microservice",
"Volumes": null,
"WorkingDir": "/app",
"Entrypoint": [
"dotnet",
"out/WeatherMicroservice.dll",
"--server.urls",
"http://0.0.0.0:5000"
],
"OnBuild": null,
"Labels": {}
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "f1b934a02a8ac2e83bf68485d2dfb138b859d1e7b3beb4cb7ba966c9e3f4befa",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {
"5000/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "80"
}
]
},
"SandboxKey": "/var/run/docker/netns/f1b934a02a8a",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "9c555071437b1919db7c539f0bd3946b7a32f92dcf49c684dbbe01e0592b9af5",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:02",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "6226280f22a5aaaa50c60d6f1a19ae8f7243bb79634c4394f62b21a10a868e48",
"EndpointID": "9c555071437b1919db7c539f0bd3946b7a32f92dcf49c684dbbe01e0592b9af5",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02"
}
}
}
}
]
So when I do this:
$ ping 172.17.0.2
Pinging 172.17.0.2 with 32 bytes of data:
Request timed out.
This works:
$ docker exec -it 78179117b516 ping www.google.com
PING www.google.com (172.217.3.196): 56 data bytes
64 bytes from 172.217.3.196: icmp_seq=0 ttl=53 time=5.412 ms
What am I doing wrong or what am I missing?
Upvotes: 25
Views: 44874
Reputation: 196
As stated here in Docker Known Limitations:
Docker Desktop for Windows can’t route traffic to Linux containers. However, you can ping the Windows containers.
So keep that in mind when trying to ping a container from Windows host to Linux container. You probably want to use the publish
feature of docker run
to enable port-forwarding.
Upvotes: 8
Reputation: 121
I stumbled upon this question as I was looking for a way to bind my local HTTP port 80 to the HTTP port of my container, an Apache container running on Docker Desktop for Windows, through WSL2 (this is important).
You must bind your local port (on Windows) to the port on WSL.
Here is how I did it :
$wsl_ip = (wsl -d "docker-desktop" -- "ifconfig" "eth0" "|" "grep" "inet addr:").trim("").split(":").split()[2]
netsh interface portproxy add v4tov4 listenport=443 listenaddress=0.0.0.0 connectport=443 connectaddress=$wsl_ip
netsh interface portproxy add v4tov4 listenport=80 listenaddress=0.0.0.0 connectport=80 connectaddress=$wsl_ip
You can either create a Powershell Script (.ps1) and run it with Powershell, or copy/paste each command line into Windows Terminal/Powershell running with Administrator privileges.
What this does is:
Since Docker for Windows 10/11 uses WSL2, when you expose a port through docker-compose or with an EXPOSE command in your Dockerfile, it is exposed to a Linux distribution called "docker-desktop" that runs with WSL2. For some reason, ports 80 and 443 that are exposed from a container are NOT forwarded to the host. The official documentation acknowledges some issues but their solution is just to use another port, for example, 8080 mapped to 80.
The issue with this method is: Each time you reboot your system or WSL2, the Linux machine gets assigned a new IP and you have to do it again. What you could do is setup a command to run when your container starts that connects through SSH to the host and runs the script, but I'm too lazy to have done it myself.
Upvotes: 1
Reputation: 309
Similar to what Ehsan Mirsaeedi said, but for me it was the vEthernet (Default Switch) that was the right one. Also posted an answer, with picture, on Windows docker container cannot ping host
Hope this helps others!
Upvotes: 2
Reputation: 7592
Actually, I got the IP of my container from Control Panel\Network and Internet\Network Connections. There was an adapter called vEthernet(DockerNAT) and it was the container's adapter. I could ping the IP I found for this adapter.
Upvotes: 12
Reputation: 26919
It's because, the ip address you see via docker inspect
command, is used by docker for internal networking and communication. It's not accessible from outside. Also, localhost won't work, since you are running docker toolbox, which runs inside ubuntu VM. You have to get the ip address of the VM first by,
docker-machine ls
If my memory serves right and toolbox works the same in Mac and Windows works, the ip address should be 192.168.99.100. So, you will be able to reach your app via, http://192.168.99.100. Besides all these, why are you still using docker tool box. The new way is docker for mac/ docker for windows. It's way much easier and efficient. For start, you will be able to reach your app via localhost, without needing to know the ip address.
Upvotes: 11
Reputation: 72858
9 out of 10 times, it's windows firewall.
disable Windows Firewall entirely - turn it off - and see if you can get to your site.
Upvotes: 3