背景: 大家好。我正尝试通过将复杂系统放入 Docker 容器中来解决问题。托管这些容器的平台在 NIC 卡上有 6 个以上的以太网端口,可用于多种用途(连接到两个端口的摄像头、连接到另一个端口的系统 LAN 等)。
在系统 LAN 上,我需要为每个 Docker 容器分配 LAN 子网上的 IP 地址。摄像机的 IP 地址位于不同的子网上,并直接保留在摄像机本身上。
我做了什么: 为了给系统 LAN 上的容器分配静态 IP 地址,我使用 MACVLAN 驱动程序实现了该网络,并对主机上的路由表进行了调整。这按预期工作,提供了对系统 LAN 上其他平台的访问。
为了能够从容器访问摄像头,我使用 IPVLAN 驱动程序实现了该网络。此解决方案提供对摄像头的有限访问。稍后会详细介绍。我开始尝试使用 MACVLAN 驱动程序访问摄像头,但无法访问容器内的摄像头 IP 地址。
只是为了好玩,我把 network_mode 设为容器上的主机,并注释掉所有其他网络实现。容器内的一切似乎都运行良好。当然,这不适合我的情况,因为我仍然需要为容器分配一个静态 IP 地址(系统架构约束)。
我怀疑我的 Docker 网络配置、主机路由表、防火墙或所有方面都不太正确。
Docker 镜像:
一个几乎基本的 Ubuntu:20.04 图像,安装了inetutils-ping
、、iproute2
和。iputiles-ping
net-tools
docker-compose文件:
Version: '3.1'
services:
my_container:
container_name: pc1-a
hostname: pc1-a
image: my-image
privileged: true
stdin_open: true
tty: true
command: /bin/bash
# network_mode: host
networks:
system_net:
ipv4_address: 192.168.127.102
cam1_net:
ports:
- "8022:22"
networks:
system_net:
driver: macvlan
driver_opts:
parent: eth6
ipam:
config:
- subnet: 192.168.127.0/24
gateway: 192.168.127.1
ip_range: 192.168.127.96/28
aux_addresses:
host: 192.168.127.101
cam1_net:
driver: ipvlan
driver_opts:
parent: eth1
ipam:
config:
- subnet: 192.168.11.0/24
gateway: 192.168.11.1
ip_range: 192.168.11.0/28
aux_addresses:
dev: 192.168.11.11
host: 192.168.11.10
(如果我取消注释network_mode
上面的行,则需要注释networks
下面的信息。)
使用上述配置,ifconfig
在主机上产生:
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 9000
inet 192.168.11.10 netmask 255.255.255.0 broadcast 192.168.11.255
inet6 fe80::fa02:78ff:fe22:16d0 prefixlen 64 scopeid 0x20<link>
ether f8:02:78:22:16:d0 txqueuelen 1000 (Ethernet)
RX packets 194707 bytes 1735032084 (1.7 GB)
RX errors 0 dropped 0 overruns 0 frame 0
...
在容器内,ifconfig
产生:
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 9000
inet 192.168.11.2 netmask 255.255.255.0 broadcast 192.168.11.255
inet6 fe80::f802:7800:122:16d0 prefixlen 64 scopeid 0x20<link>
ether f8:02:78:22:16:d0 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
...
请注意,Dockereth1
在主机上重命名为eth0
容器内。还请注意,容器内没有接收到任何数据包。
虽然在这里展示起来太麻烦了,但我确实在容器中安装了 Pleora 相机 SDK,并运行了一些示例实用程序。当网络模式为主机时,这些实用程序运行良好,但使用上述网络配置时会超时。