如何在没有端口映射的情况下将 docker 容器的 ip 和端口暴露给外部 docker 主机?
Posted
技术标签:
【中文标题】如何在没有端口映射的情况下将 docker 容器的 ip 和端口暴露给外部 docker 主机?【英文标题】:How to expose docker container's ip and port to outside docker host without port mapping? 【发布时间】:2014-09-22 02:22:52 【问题描述】:当我在一个 docker 主机上为同一个 web 图像启动两个 docker 容器时。
两个docker容器在同一个端口上监听5000
两个容器的5000
端口被映射到docker主机的不同端口:49155
,49156
要从外部docker主机访问两个容器需要通过访问docker主机ip和端口49155
或49156
有没有解决方案可以通过 docker 主机的 ip 和端口x.x.x.x:5000
从外部 docker 主机访问 docker 容器,而无需端口映射?
不同dock主机上的所有docker容器可以直接相互访问。
【问题讨论】:
问题不清楚。 docker 容器是否与主机“位于”同一网络适配器上?在这种情况下,请使用--net=host
。还是要绑定端口不随机?
【参考方案1】:
您可以通过主机上的 IP 别名来完成此操作。
首先,在主机上添加一个与主接口具有不同 IP 地址的虚拟接口。我们将使用 IP 10.0.0.10
调用主接口 eth0
,使用 IP 地址 10.0.0.11
调用虚拟接口 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 上的每个容器。
【讨论】:
我正在使用 boot2docker,我在 (boot2docker) mac 上看不到 eth0:1 可用,还有什么进一步的步骤让它在 mac 上运行? 试试这个sudo ifconfig en1 inet w.x.y.z netmask 255.255.255.0 alias
,其中en1
是您要为其添加别名的接口。
我试过了,但它抱怨“来自守护进程的错误响应:无法启动容器 XXXXX:启动用户级代理时出错:监听 tcp 172.16.1.99:80:绑定:无法分配请求的地址”,有什么线索吗?
【参考方案2】:
创建 VM 时,请确保在网络下选择以下选项
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 中创建文件 ifcfg-xxxxx
DEVICE=xxxxx
TYPE=Bridge
BOOTPROTO=dhcp
ONBOOT=yes
DELAY=0
并在文件末尾追加ifcfg-p2p1
/ifcfg-eth0
BRIDGE=xxxx
重启虚拟机
运行
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 -d -b=gsbr01
运行 docker
$ 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
【讨论】:
以上是关于如何在没有端口映射的情况下将 docker 容器的 ip 和端口暴露给外部 docker 主机?的主要内容,如果未能解决你的问题,请参考以下文章