如何在不使用端口映射的情况下将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 

以确保桥接连接有一个适配器p2p1eth0例如

 # 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