如何为容器添加虚拟接口

时间:2019-07-22 15:34:03

标签: docker docker-compose

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

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

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

最简单的方法是什么?

1 个答案:

答案 0 :(得分:3)

是因为缺少--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
/ #

注意:您可以看到dummy0接口已创建。

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

有关更多信息,我强烈建议您浏览this

默认情况下,码头工人启用和禁用的Linux功能很少,这些功能在here中列出。

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

相关问题