Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get the mapped port on host from a docker container?

Tags:

docker

I want to run a task in some docker containers on different hosts. And I have written a manager app to manage the containers(start task, stop task, get status, etc...) . Once a container is started, it will send an http request to the manager with its address and port, so the manager will know how to manage the container.

Since there may be more than one containers running on a same host, they would be mapped to different ports. To register a container on my manager, I have to know which port each container is mapped to.

How can I get the mapped port inside a docker container?

There's an solution here How do I know mapped port of host from docker container? . But it's not applicable if I run container with -P. Since this question is asked more than 1 year ago, I'm wondering maybe there's a new feature added to docker to solve this problem.

like image 609
iuradz Avatar asked Sep 07 '15 18:09

iuradz


People also ask

How do I get Docker host port?

Use --net="host" in your docker run command, then localhost in your docker container will point to your docker host. THIS! This is the answer!

How do I find the host port from a container?

Accessing the Host With the Default Bridge Mode You just need to reference it by its Docker network IP, instead of localhost or 127.0. 0.1 . Your host's Docker IP will be shown on the inet line. Connect to this IP address from within your containers to successfully access the services running on your host.

How does Docker map a port on a container?

Need of exposing ports. In order to make a port available to services outside of Docker, or to Docker containers which are not connected to the container's network, we can use the -P or -p flag. This creates a firewall rule which maps a container port to a port on the Docker host to the outside world.

How do you map a port on a container?

Map TCP port 80 in the container to port 8080 on the Docker host for connections to host IP 192.168. 1.100. Map UDP port 80 in the container to port 8080 on the Docker host. Map TCP port 80 in the container to TCP port 8080 on the Docker host, and map UDP port 80 in the container to UDP port 8080 on the Docker host.


3 Answers

You can also you docker port container_id

The doc

https://docs.docker.com/engine/reference/commandline/port/

examples from the doc

$ docker port test
7890/tcp -> 0.0.0.0:4321
9876/tcp -> 0.0.0.0:1234
$ docker port test 7890/tcp
0.0.0.0:4321
$ docker port test 7890/udp
2014/06/24 11:53:36 Error: No public port '7890/udp' published for test
$ docker port test 7890
0.0.0.0:4321
like image 97
user2915097 Avatar answered Oct 07 '22 20:10

user2915097


i share /var/run/docker.sock to container and get self info

docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock alpine:latest sh

in container shell

env //get HOSTNAME

curl --unix-socket /var/run/docker.sock http://localhost/containers/3c6b9e44a622/json

the 3c6b9e44a622 is your HOSTNAME

like image 26
ibcker Avatar answered Oct 07 '22 22:10

ibcker


Once a container is started, it will send an http request to the manager with its address and port

This isn't going to be working. From inside a container you cannot figure out to which docker host port a container port is mapped to.

What I can think about which would work and be the closest to what you describe is making the container open a websocket connection to the manager. Such a connection would allow two ways communication between your manager and container while still being over HTTP.


What you are trying to achieve is called service discovery. There are already tools for service discovery that work with Docker. You should pick one of them instead of trying to make your own.

See for instance:

  • etcd
  • consul
  • zookeeper

If you really want to implement your service discovery system, one way to go is to have your manager use the docker event command (or one of the docker client librairies). This would enable your manager to get notified of containers creations/deletions with nothing to do on the container side.

Then query the docker host to figure out the ports that are mapped to your containers with docker port.

like image 22
Thomasleveil Avatar answered Oct 07 '22 20:10

Thomasleveil