提问者:小点点

使用复杂的网络配置从Virtualbox迁移构建docker环境


我有一个由3个应用程序组成的环境,2个运行在视窗中,1个运行在Debian操作系统中。
出于测试目的,我已经用VirtualBox虚拟机(运行Debian操作系统)在1台电脑(运行视窗10)中构建了环境。
下面是详细网络配置:

主机PC(使用2个VirtualBox纯主机适配器):

Ethernet adapter VirtualBox Host-Only Network:

   Connection-specific DNS Suffix  . :
   Link-local IPv6 Address . . . . . : fe80::ec0c:3c16:4f85:1a5e%12
   IPv4 Address. . . . . . . . . . . : 192.168.1.11
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   IPv4 Address. . . . . . . . . . . : 192.168.1.12
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   IPv4 Address. . . . . . . . . . . : 192.168.1.13
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   IPv4 Address. . . . . . . . . . . : 192.168.1.14
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   IPv4 Address. . . . . . . . . . . : 192.168.1.15
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   IPv4 Address. . . . . . . . . . . : 192.168.1.21
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   IPv4 Address. . . . . . . . . . . : 192.168.1.22
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   IPv4 Address. . . . . . . . . . . : 192.168.1.23
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   IPv4 Address. . . . . . . . . . . : 192.168.1.24
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   IPv4 Address. . . . . . . . . . . : 192.168.1.25
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   IPv4 Address. . . . . . . . . . . : 192.168.1.26
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   IPv4 Address. . . . . . . . . . . : 192.168.1.31
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   IPv4 Address. . . . . . . . . . . : 192.168.1.32
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   IPv4 Address. . . . . . . . . . . : 192.168.1.33
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   IPv4 Address. . . . . . . . . . . : 192.168.1.34
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   IPv4 Address. . . . . . . . . . . : 192.168.1.123
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . :

Ethernet adapter VirtualBox Host-Only Network #2:

   Connection-specific DNS Suffix  . :
   Link-local IPv6 Address . . . . . : fe80::5d7:813f:a9a:865d%16
   IPv4 Address. . . . . . . . . . . : 192.168.1.122
   Subnet Mask . . . . . . . . . . . : 255.255.255.248
   Default Gateway . . . . . . . . . :

VirtualBox虚拟机网络配置:
/etc/network/interfaces:

auto lo
iface lo inet loopback

auto eth1
iface eth1 inet static
  address 192.168.1.120
  netmask 255.255.255.0
  gateway 192.168.1.1

auto eth2
allow-hotplug eth2
iface eth2 inet static
  address 192.168.1.10
  netmask 255.255.255.0
  gateway 192.168.1.1

auto eth2:0
iface eth2:0 inet static
  address 192.168.1.20
  netmask 255.255.255.0

auto eth2:1
iface eth2:1 inet static
  address 192.168.1.30
  netmask 255.255.255.0

Ifconfig输出:

eth0      Link encap:Ethernet  HWaddr 08:00:27:a8:08:8b  
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          ...

eth1      Link encap:Ethernet  HWaddr 08:00:27:41:27:73  
          inet addr:192.168.1.120  Bcast:192.168.1.255  Mask:255.255.255.0
          ...

eth2      Link encap:Ethernet  HWaddr 08:00:27:0d:6b:54  
          inet addr:192.168.1.10  Bcast:192.168.1.255  Mask:255.255.255.0
          ...

eth2:0    Link encap:Ethernet  HWaddr 08:00:27:0d:6b:54  
          inet addr:192.168.1.20  Bcast:192.168.1.255  Mask:255.255.255.0
          ...

eth2:1    Link encap:Ethernet  HWaddr 08:00:27:0d:6b:54  
          inet addr:192.168.1.30  Bcast:192.168.1.255  Mask:255.255.255.0
          ...

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          ...

以下是当前环境中的一些网络交互流程:

  • App1在VM中运行并创建多个套接字服务器:
    -在IP 192.168上侦听。1.10, 192.168.1.20, 192.168.1.30端口1448
    -侦听IP 192.168。1.120端口1449

环境现在工作正常,但是在阅读了Docker之后,我计划用Docker来代替VirtualBox虚拟机,以减少内存使用。
我成功地建立了一个Debian映像、安装库等...
然而,我不知道如何设置网络在Docker中,用于具有与上述VirtualBox VM配置相似的功能。一些难点:

  • 我们可以使用Docker创建类似“以太网适配器VirtualBox主机专用网络”的网络接口吗
  • 若我们无法创建这样的网络接口,那个么可以将这两个VirtualBox主机专用适配器保留在环境中。但我不知道如何将这些网络接口“连接”到Docker容器中
  • 似乎无法为docker容器分配静态IP地址,是否正确
    (这没有帮助:将静态IP分配给Docker容器)
  • 似乎也不可能为docker容器分配多个IP地址,对吗

共2个答案

匿名用户

你问的前三个问题用macvlan网络解决。容器将直接连接到网络,就像虚拟机一样。这里有一个例子:

version: "2.1"

services:
  nginx1:
    image: nginx
    networks:
      network_1:
        ipv4_address: 10.1.1.115
  nginx2:
    image: nginx
    networks:
      network_1:
        ipv4_address: 10.1.1.116


networks:
  network_1:
    driver: macvlan
    driver_opts:
      parent: enp52s0  # Your network interface name
    ipam:
      driver: default
      config:
        - subnet: 10.1.1.0/24
          gateway: 10.1.1.1

在本例中,我声明了一个名为network_1的macvlan网络,它连接到enp52s0网络接口。两个nginx容器使用该网络,每个容器都宣传自己的静态IP。

现在,如果您想为每个容器分配多个IP,事情就会变得一团糟。要分配额外的地址,您需要一个额外的网络,它有自己的IP范围、自己的父网络接口和自己的网关。这实际上是另一个网络。或者你可以考虑一些黑客行为,也许使用一个代理容器,在另一个IP上监听,并将流量转发到所需的容器中,但这有点“嗯”。我想说,除非您愿意重新设计应用程序的连接,否则VM开销不值得这么麻烦。

匿名用户

在docker文档中有一些关于“用户定义”网桥的文章,可以在这里找到链接。我认为您必须根据您的网络体系结构创建它们,一旦创建它们,您就可以在创建docker容器时指定它应该使用您创建的其中一个用户定义的网桥。

由于您正在使用多个应用程序,并且希望将其放在多个docker容器中,我还建议您研究“docker compose”。有了它,您可以创建一个YML清单,该清单将使用多个docker容器定义的配置、网络、特定端口等启动多个docker容器。。。一次启动/关闭整个环境。

本文提供了一个关于docker映像ip地址的示例和更多信息。