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://docs.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?
To switch to Windows containers in Docker, right-click the Docker icon, and select Switch to Windows containers. To use the command line to switch between containers, run & $Env:ProgramFiles\Docker\Docker\DockerCli.exe -SwitchDaemon .
You cannot ping a Docker container from an external host by default (to do so, you would have to ensure that the Docker network bridge -docker0- has an IP Address, and you would have to configure routes on your other hosts to use you Docker host as a gateway for the bridge address range).
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With