如何在不使用端口映射的情况下将Docker容器的ip和端口暴露给外部docker主机?
当我在一个docker主机上启动了两个docker集装箱用于一个相同的Web图像。
- 两个docker集装箱在同一个端口5000上监听
- 两个容器的端口5000被映射到docker主机的不同端口:49155,49156
- 从外部docker主机访问这两个容器需要通过访问docker主机IP和端口49155或49156
有没有一个解决scheme,通过它的IP和端口,xxxx:5000,从外部docker主机访问docker容器,没有端口映射?
不同docker主机上的所有docker集装箱可以直接访问对方。
您可以在主机上使用IP别名完成此操作。
首先,在主机上添加一个与主接口不同的IP地址的虚拟接口。 我们将调用IP为10.0.0.10
的主接口eth0
和IP地址为10.0.0.10
的虚拟接口eth0:1
。
ifconfig eth0:1 10.0.0.11 netmask 255.255.255.0 up
现在运行容器并将端口5000映射到相应的接口。 例如:
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>
现在,您可以在外部使用不同的IP地址访问端口5000上的每个容器。
在创build虚拟机时,请确保在networking下select了以下项目
Attached to: Bridged NetworkManager Adapter Type: PCnet-Fast III (Am 79C973) Promiscious Mode Allow All
RHEL 6.5 / Fedora 20
Install docker, libvrt
确保使用root完成以下操作
# chkconfig NetworkManager off # chkconfig network on # service NetworkManager stop # service network start
在/ etc / sysconfig / network-scripts中创build文件ifcfg-xxxxx
DEVICE=xxxxx TYPE=Bridge BOOTPROTO=dhcp ONBOOT=yes DELAY=0
ifcfg-p2p1
文件BRIDGE=xxxx
末尾的ifcfg-p2p1
/ ifcfg-eth0
重新启动虚拟机
跑
brctl show
以确保桥接连接有一个适配器p2p1
或eth0
例如
# brctl show bridge name bridge id STP enabled interfaces gsbr01 8000.080027595649 no eth0 virbr0 8000.5254004c1564 yes virbr0-nic
现在,在启动docker之前,我们必须使用我们的桥而不是docker0
来做到这一点,运行docker作为docker -d -b=gsbr01
$ echo 'DOCKER_OPTS="-b=gsbr01"' >> /etc/sysconfig/docker $ sudo service docker start
检查结果:
# brctl show bridge name bridge id STP enabled interfaces gsbr01 8000.080027595649 no eth0 veth5806f27 vethb3e33da virbr0 8000.5254004c1564 yes virbr0-nic docker -d -b=gsbr01