How to expose docker container's ip and port to outside docker host without port mapping?
You can accomplish this with IP aliasing on the host.
First, add a virtual interface on the host that has a different IP address than the primary interface. We'll call the primary interface eth0
with IP 10.0.0.10
, and the virtual interface eth0:1
with IP address 10.0.0.11
.
ifconfig eth0:1 10.0.0.11 netmask 255.255.255.0 up
Now run the containers and map port 5000 to the corresponding interface. For example:
docker run -p 10.0.0.10:5000:5000 -name container1 <someimage> <somecommand>docker run -p 10.0.0.11:5000:5000 -name container2 <someimage> <somecommand>
Now you can access each container on port 5000 using different IP addresses externally.
When creating a VM make sure that the following are selected under networking
Attached to: Bridged NetworkManagerAdapter Type: PCnet-Fast III (Am 79C973)Promiscious Mode Allow All
RHEL 6.5 / Fedora 20
Install docker, libvrt
Make sure the following are done using root
# chkconfig NetworkManager off# chkconfig network on # service NetworkManager stop# service network start
Create file ifcfg-xxxxx in /etc/sysconfig/network-scripts
DEVICE=xxxxxTYPE=BridgeBOOTPROTO=dhcpONBOOT=yesDELAY=0
and append to ifcfg-p2p1
/ ifcfg-eth0
at the end of the file BRIDGE=xxxx
Restart the VM
run
brctl show
to make sure the bridged connected has an adapter either p2p1
or eth0
e.g.
# brctl showbridge name bridge id STP enabled interfacesgsbr01 8000.080027595649 no eth0virbr0 8000.5254004c1564 yes virbr0-nic
now before starting docker we have to use our bridge and not docker0
to do that, run docker as docker -d -b=gsbr01
$ echo 'DOCKER_OPTS="-b=gsbr01"' >> /etc/sysconfig/docker$ sudo service docker start
Check the result:
# brctl showbridge name bridge id STP enabled interfacesgsbr01 8000.080027595649 no eth0 veth5806f27 vethb3e33davirbr0 8000.5254004c1564 yes virbr0-nicdocker -d -b=gsbr01