将 Docker 容器连接到特定网络接口(例如 eth1)?

Connect Docker container to specific network interface (e.g. eth1)?

我一直在 here, here,并且遍历了 Docker 文档。我想我需要用更简单的术语对此进行解释。

我的 Docker 容器需要能够做两件事:

  1. 连接到主机上的设备(相机)
  2. 连接到特定网络接口 (eth1) 以发送数据

为了让他们都满意,我选择 运行 容器作为超级服务发出的命令。 我的 docker-compose.yml 看起来像这样:

version: "3"
services:
  superservice:
    image: docker
    command: docker run -it --device=/dev/vchiq my/image-to-run:latest
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    deploy:
      replicas: 1
      mode: replicated
    stdin_open: true
    tty: true

这样我仍然可以 docker stack deploy 我的服务到集群(否则,指定 --device 不适用于集群模式)。当我启动 swarm 时,我会使用 docker swarm init --advertise-addr my:wlan:ip:addr --data-path-addr eth1。 我认为这会将我从我的容器发送的数据包通过 eth1 路由到目的地。

但是,当我 tcpdump -i eth1 什么都没有通过它时。这一切都还在经历 wlan0

为什么会发生这种情况,如何解决?

我找到的方法是使用简单的 sudo route set default eth1。出于某种原因,我认为设置 --data-path-addr=eth1 也会设置我使用的网络接口。显然,事实并非如此。

我没有花太多时间在网络上,尽管这是我要学习的清单,所以也许我能够通过一些更复杂的路由的更好解决方案来解决这个问题。现在,当我想 return 到 wlan0 界面时,我只是 sudo route delete default eth1

现在这对我来说是一个不错的解决方案,因为部署机器时它只使用 eth1 接口。