Prostak
Prostak

Reputation: 3725

Why can't I ping docker container on Windows?

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

Answers (6)

Aeglas
Aeglas

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

Keyvan
Keyvan

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:

  1. Attach to the "docker-desktop" distribution running in WSL2 2
  2. Run "ifconfig eth0 | grep inet addr:" to get the local IP address of the "virtual machine"
  3. Parse the result, and use Netsh to create a portproxy between port 80 of your Windows machine and port 80 of your Linux machine. The same is done for port 443. You can easily map other ports if you understand what the command is doing.

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

rSkogeby
rSkogeby

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

Ehsan Mirsaeedi
Ehsan Mirsaeedi

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

techtabu
techtabu

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

Derick Bailey
Derick Bailey

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

Related Questions