In this, we will discuss an experiment on Docker Container Network port exposed or published. A Netcat command utility will be used to make an echo server. which will be read the message on one socket and the other end sends the message to the terminal.
Understanding Port forwarding in Docker Containers |
Background on Docker Port
Docker container ports by default mapping to host ports.
The -P option will bind the container exposed ports (EXPOSE command in Dockerfile) to random available ports of the host.
We can bind any port of the container even though it is not pre-defined with EXPOSE ones. For this, you can use -p (lower case) with host port followed by a colon (:) container port
Note: This experiment can be successful on ubuntu:14.04 image only. Because other than that ubuntu images don't support nc and host.docker.internal to look into the docker network.
Here we have four use cases:
- Two ports open to run the echo server
- Container access host network
- Dynamically port mapping
- Expose Port using TCP/UDP protocol
To understand more on docker network isolation with namespaces, Open 3 terminal set to view all 3 on a single screen.
Examples of Docker container port |
USE CASE 1: TWO PORTS EXPOSED - USED AS ECHO-SERVER
In this case, let's use three terminals on the same screen
Terminal 1:
# Create a container as echo-server with expose of 2 different ports docker run --rm -ti --name echoserver \ -p 5000:5000 -p 5001:5001 \ ubuntu:14.04 /bin/bash # Inside the container pipe between two ports nc -lp 5000 | nc -lp 5001To validate this experiment, how this netcat command will be used to communicate betwen two ports inside the container they work as echoserver.
Now open the Terminal 2 window and send the text message to localhost with 5000 will be forward to localhost with 5001
Terminal 2: Run the nc command as shown
nc localhost 5000 Vybhava Technologies gives knowledge on Docker
Terminal 3: Now open the third terminal and run the nc command with 5001 port this will be in waiting state
nc localhost 5001
Here you can observe that Terminal 3 having output automatically displaying the same message that you entered and send in Terminal 2 where the docker container acted as echo server
Docker Port Fortwarding withing container |
USE CASE 2: Containers using host network - host.docker.internal/host IP
Terminal 1 remain the same as we have done it earlier in this Blog post
Terminal 2:
Note: Docker version 20.x supports following --add-host option way to communicate with host network from container.docker run -it --name echoclient1 \ --add-host=host.docker.internal:host-gateway \ ubuntu:14.04 bash
#inside contianer
nc host.docker.internal 5000 echo message here
Terminal 3: Now run the ubuntu container
docker run -it --name echoclient2 \ --add-host=host.docker.internal:host-gateway \ ubuntu:14.04 bash
#inside contianer
nc host.docker.internal 5001
Expose port used by Sender and Receiver container |
Observe that in terminal 2 write message same will displayed into the terminal 3
USE CASE 3: Dynamically port mapping to exposed container ports
The port inside the container is fixed port
The port on the host machine or VM is chosen from the available unused ports
This allows many containers to run programs with fixed ports
this often is used with service discovery programs
Terminal 1:
docker run --rm -ti \ -p 5000 -p 5001 --name echoserver \ ubuntu:14.04 bash
#inside container
nc -lp 5000|nc -lp 5001
Terminal 2:
docker port echoserver
#shows port mappings
nc localhost hostport1
#change hostport1
Enter a message to echo
Terminal 3:
nc localhost hostport2
#change hostport2
Now in this case you can observe that text automatically sends the message to Terminal 3 where netcat ready to display on to your terimal with the open port
USE CASE 4: USING Export Port with a Protocol TCP or UDP
docker run -p host-port:container-port/protocol
# protocal can be tcp or udp
Terminal
docker run --rm -ti -p 8888/udp \ --name echoserver ubuntu:14.04 bash
Here we have not used any host-port to forward it so Docker engine will help us to select the random port from host machine available ports.
Terminal 2:
First check the port to which it is bind from the containerdocker port echoserver
nc -u localhost mapport1-from-above hello from udp
Now here observe that message send back to the terminal running container.
Expose UDP Port for docker container |
Reference:
.
No comments:
Post a Comment