如何为容器添加虚拟接口



我正在为一些软件构建一个测试环境,一旦部署,应该会看到一些网络接口。

我不需要界面是交互式的,只需要它们使用 ip link show 出现。使用 ip link add dummy0 type dummy 仅在直接在 shell 上执行时才有效,而在脚本或 Dockerfile RUN 中使用 RTNETLINK answers: Operation not permitted 失败。

我正在使用 docker-compose 来设置和链接多个容器,但是其中只有一个需要虚拟接口。

实现这一目标的最简单方法是什么?

这是因为--cap-add=NET_ADMIN缺失。

请按照以下步骤操作:

  • 创建包含以下内容的Dockerfile
FROM alpine
COPY script.sh /script.sh
RUN chmod +x /script.sh
ENTRYPOINT ["/script.sh"]
  • 创建包含以下内容的script.sh
#!/bin/sh
ip link add dummy0 type dummy
tail -f /dev/null
exec "$@"
  • 构建 docker 容器docker build -t myimage:v1 .
  • 运行没有 --cap-add 选项的 docker 容器
$ docker run -itd myimage:v1
$ docker logs container-id
ip: RTNETLINK answers: Operation not permitted
  • 使用--cap-add=NET_ADMIN选项运行 docker 容器。
$ docker run -itd --cap-add=NET_ADMIN myimage:v1
$ docker exec -it container-id sh
/ # ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: dummy0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether c2:ad:ec:b9:7c:34 brd ff:ff:ff:ff:ff:ff
37: eth0@if38: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
/ #

注意:您可以看到虚拟0接口已创建。

--cap-add--cap-drop是可以与 docker run 一起使用的选项,用于添加或删除任何特定的 Linux 功能。

有关更多信息,我强烈建议您完成此操作。

默认情况下,docker 启用的 linux 功能很少,其他功能已禁用,此处列出了这些功能。

如果是 docker-compose,请使用cap_add选项。

最新更新