Replies: 3 comments 1 reply
Curious; why make the program explicitly listen on a loopback address if the intent is for it to be accessible outside of the container? |
|
This is a valid use case for network separation. Docker's port mapping doesn't directly support binding to specific container network interfaces, but here are some working solutions: Solution 1: Use Docker Bridge Network with Fixed IPsdocker network create --subnet=172.20.0.0/16 mynet
docker run -it --network mynet --ip 172.20.0.2 myimageThen inside the container, you can bind services to 172.20.0.2:80 specifically. Solution 2: Network Namespaces (Advanced)You can use ip netns add container_ns
ip link add veth0 type veth peer name veth1
ip link set veth1 netns container_ns
ip netns exec container_ns ip addr add 192.168.1.2/24 dev veth1Solution 3: Docker Compose with Custom Networkservices:
myservice:
image: myimage
networks:
mynet:
ipv4_address: 172.20.0.5
networks:
mynet:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/16Solution 4: Host Networking (if applicable)For some use cases, use The recommended approach is Solution 1 or 3 with custom Docker bridges where you assign fixed IPs to containers and bind services to those specific IPs internally. |
Re: Expose Port on specific Interface (docker/cli #6696)The existing answers address a different problem. Your question is specifically about a Here is a precise breakdown of why the naive approaches fail, followed by three working Why
|
| Scenario | Recommended solution |
|---|---|
| No extra capabilities, quick fix | Solution 1 (socat relay) |
| You control the image and can add NET_ADMIN | Solution 2 (iptables DNAT inside container) |
| Bare-metal or VM host, need direct LAN access | Solution 3 (macvlan) |
For most CI or development use cases, Solution 1 is the pragmatic choice. For production
workloads where you own the image, Solution 2 is cleaner and has lower overhead.
Root cause note
The reason your service binds to 127.0.0.2 in the first place is likely one of:
- The application explicitly binds to a loopback alias for network isolation (common in
multi-tenant or multi-instance setups where each instance gets its own loopback IP). - A legacy configuration that predates containerization.
- A service mesh or sidecar pattern where the loopback alias is used for inter-process
communication.
If you have control over the application, the simplest long-term fix is to make the bind
address configurable and set it to 0.0.0.0 (or the container's eth0 IP) when running
inside Docker. Solutions 1 and 2 above are the right answer when you do not have that
control.
Uh oh!
There was an error while loading. Please reload this page.
I know you can expose a port on a specific interface on the host
But I want to expose a port thats bound to a specific interface inside the container.
something like this
such that if a program listens on 127.0.0.2:80 inside the container i could still export it
All reactions