【问题标题】:How to expose docker container's ip and port to outside docker host without port mapping?如何在没有端口映射的情况下将 docker 容器的 ip 和端口暴露给外部 docker 主机?
【发布时间】:2014-09-22 02:22:52
【问题描述】:

当我在一个 docker 主机上为同一个 web 图像启动两个 docker 容器时。

  • 两个docker容器在同一个端口上监听5000
  • 两个容器的5000端口被映射到docker主机的不同端口:49155,49156
  • 要从外部docker主机访问两个容器需要通过访问docker主机ip和端口4915549156

有没有解决方案可以通过 docker 主机的 ip 和端口x.x.x.x:5000 从外部 docker 主机访问 docker 容器,而无需端口映射?

不同dock主机上的所有docker容器可以直接相互访问。

【问题讨论】:

  • 问题不清楚。 docker 容器是否与主机“位于”同一网络适配器上?在这种情况下,请使用--net=host。还是要绑定端口不随机?

标签: networking port docker


【解决方案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-eth0BRIDGE=xxxx

重启虚拟机

运行

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 -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

【讨论】:

    猜你喜欢
    • 2021-08-05
    • 1970-01-01
    • 2019-01-20
    • 1970-01-01
    • 2022-08-22
    • 2017-10-12
    • 1970-01-01
    • 2016-06-26
    相关资源
    最近更新 更多