networking - Docker 1.10 容器在局域网中的 IP

标签 networking docker

从 Docker 1.10(和 libnetwork 更新)开始,我们可以手动为用户定义网络中的容器分配 IP,这很酷!

我想在我的 LAN 中为容器提供一个 IP 地址(就像我们可以在“桥接”模式下使用虚拟机一样)。我的局域网是 192.168.1.0/24,我所有的电脑里面都有 IP 地址。而且我希望我的容器具有此范围内的 IP,以便从我的 LAN 中的任何地方访问它们(没有 NAT/PAT/等...)。

我显然读过 Jessie Frazelle 的 blog post还有很多其他人在这里和各处发帖,例如:

还有很多,但什么也没出来;我的容器仍然在我的 docker 主机“内部”有 IP 地址,并且我的 LAN 上的其他计算机无法访问。

阅读 Jessie Frazelle 的博文,我想(因为她使用公共(public) IP)我们可以做我想做的事?

编辑:确实,如果我这样做:

network create --subnet 192.168.1.0/24 --gateway 192.168.1.1 homenet
docker run --rm -it --net homenet --ip 192.168.1.100 nginx

docker 主机 (br-[a-z0-9]+) 上的新接口(interface)采用“--gateway”IP,这是我的路由器 IP。并且在网络上的两台计算机上使用相同的 IP ... BOOM

提前致谢。

最佳答案

编辑:这个解决方案现在没用了。从 1.12 版本开始,Docker 提供了两个网络驱动程序:macvlan 和 ipvlan。它们允许从 LAN 网络分配静态 IP。见 answer below .


查找后people who have the same problem ,我们找到了一种解决方法:

总结:

  • (V)LAN 为 192.168.1.0/24
  • 默认网关(= 路由器)是 192.168.1.1
  • 多个 Docker 主机
  • 注意:我们有两个 NIC:eth0 和 eth1(专用于 Docker)

我们想要什么:

我们希望在没有任何 NAT/PAT/translation/port-forwarding/etc 的 192.168.1.0/24 网络中拥有 ip 容器(如计算机)...

问题

当这样做时:

network create --subnet 192.168.1.0/24 --gateway 192.168.1.1 homenet

我们能够为容器提供我们想要的 IP,但是 docker 创建的桥 (br-[a-z0-9]+) 将拥有IP 192.168.1.1,这是我们的路由器。

解决方案

1。设置 Docker 网络

使用 DefaultGatewayIPv4 参数:

docker network create --subnet 192.168.1.0/24 --aux-address "DefaultGatewayIPv4=192.168.1.1" homenet

默认情况下,Docker 会给桥接接口(interface) (br-[a-z0-9]+) 第一个 IP,该 IP 可能已经被另一台机器占用。解决方案是使用 --gateway 参数告诉 docker 分配任意 IP(可用):

docker network create --subnet 192.168.1.0/24 --aux-address "DefaultGatewayIPv4=192.168.1.1" --gateway=192.168.1.200 homenet

我们可以通过在前面的命令中添加 -o com.docker.network.bridge.name=br-home-net 来指定网桥名称。

2。架起桥梁!

现在我们有了一个由 Docker 创建的桥 (br-[a-z0-9]+)。我们需要将它桥接到物理接口(interface)(在我的情况下,我必须连接到 NIC,所以我使用 eth1):

brctl addif br-home-net eth1

3。删除网桥IP

我们现在可以从网桥中删除 IP 地址,因为我们不需要:

ip a del 192.168.1.200/24 dev br-home-net

IP 192.168.1.200 可以用作多个 docker 主机上的桥接器,因为我们不使用它,我们将其移除。

关于networking - Docker 1.10 容器在局域网中的 IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35742807/

相关文章:

python - 将 pyaudio 安装到 docker 容器

php - Apache/PHP 进程在与 MySQL 交互时挂起

docker - 有没有办法在 VSCode Devcontainers 中调试 PostCreateCommand?

ajax - 您如何模仿将数据推送到 Web 应用程序?

linux - 何时使用 TCP 打洞技术以及为什么使用它?

Docker + Virtual Box = VT-x 不可用 (VERR_VMX_NO_VMX)

docker - 删除所有 docker 镜像和容器

docker - Puppeteer 错误 : error while loading shared libraries: libgobject-2. 0.so.0

macos - 如何将docker-machine创建的VM绑定(bind)到OSX IP地址?

android - Android模拟器中的网络访问