25

我在 ubuntu 14.04 上运行它并设置docker0为静态 ip,然后通过防火墙从公共 ip 路由到该静态 ip。我正在尝试将我的后端 API 设置为在 docker 容器中运行,并且对一些事情感到困惑。

1.) 我将如何将docker0的 ip 映射到容器的 ip,以便docker0知道将传入的数据包发送到容器(如果可能,动态地)。

2.)如果还没有以这种方式完成,我怎么能做到这样我就不必在每次重新运行该 docker 容器时都进行设置?

提前致谢!

4

2 回答 2

40

我假设您希望在 docker 之外为您的 docker 容器分配一个 IP。

首先,创建一个新 IP 并将其分配给您主机的接口(我们假设您的接口称为 eth0.

$> ip addr add 10.0.0.99/8 dev eth0

现在,当您启动容器时,指定该地址并将其链接到您的 docker 容器:

$> docker run -i -t --rm -p 10.0.0.99:80:8080 base

-p 参数将使 docker 创建一个 iptables NAT 规则,该规则会将与目标 10.0.0.99:80 匹配的所有流量 nat 到端口 8080 上的 docker 容器。

如果您需要自动化该过程并将其扩展,请查阅此资源:https ://github.com/jpetazzo/pipework

docker 文档是一个好的开始:https ://docker.github.io/engine/userguide/networking/

于 2014-11-16T04:02:32.520 回答
9

最近我遇到了同样的问题并使用Network Containers解决了它:

  • 启动我希望在公共 IP 上可用的“服务”容器
  • 创建一个新的“网络”容器,该容器与服务容器链接并路由到服务容器公开的端口。该容器将有一个与主机桥接的额外网络接口,因此它可以从 DHCP 获取 IP。
  • 使用 jpetazzo 的 Pipework ( https://github.com/jpetazzo/pipework )创建从 Docker 主机到容器的网桥
  • 网络容器从 DHCP 获取地址。

从此时起,网络容器在网络上可用,并将端口路由到服务容器。主要优点是“服务”容器不必知道公共 IP、DHCP 等。这样每个运行的容器都可以在网络上公开。

为方便起见,我创建了一个脚本来一次性完成所有这些工作。使一个正在运行的容器在公共 IP 上可用很简单:

create-network-container.sh webserver ens32

在这种情况下,您需要有一个名为“webserver”的运行容器,以及主机“ens32”上的网络接口。需要该接口才能在网络容器中创建网桥。

脚本、更详细的信息和示例可在以下位置获得: https ://github.com/jeroenpeeters/docker-network-containers

于 2014-11-18T20:02:59.473 回答