#docker #networking #network-programming #netlink
Вопрос:
Я пытаюсь установить имя интерфейса внутри контейнера a с помощью netlink. Т. Е.: eth0
Я хочу установить mang0
.
Внутри контейнера пользователь root получает ошибки разрешений при попытке изменить свойства интерфейса:
root@d1df4b33fffc:/tmp/contbuild# ip link set eth0 down RTNETLINK answers: Operation not permitted root@d1df4b33fffc:/tmp/contbuild# ip link set eth0 name man0 RTNETLINK answers: Operation not permitted root@d1df4b33fffc:/tmp/contbuild# ip link set eth0 alias man0 RTNETLINK answers: Operation not permitted
За пределами контейнера я вижу команду set interface name, отправляемую в сообщениях ядра:
[ 11.115152] docker0: port 1(veth3a3f2f4) entered blocking state [ 0.000007] docker0: port 1(veth3a3f2f4) entered disabled state [ 0.000171] device veth3a3f2f4 entered promiscuous mode [ 0.009358] IPv6: ADDRCONF(NETDEV_UP): veth3a3f2f4: link is not ready [ 0.386448] eth0: renamed from vetheac9d07 [ 0.000259] IPv6: ADDRCONF(NETDEV_CHANGE): veth3a3f2f4: link becomes ready [ 0.000031] docker0: port 1(veth3a3f2f4) entered blocking state [ 0.000002] docker0: port 1(veth3a3f2f4) entered forwarding state
Я также вижу соответствующую пару veth на хосте veth3a3f2f4@if662
, но я не вижу veth контейнера ни в одной другой сети ( ip netns show
пусто).
Поэтому я хотел бы знать:
- как докер устанавливает имя
eth0
и есть ли способ легко его изменить - почему я не могу видеть сетевые сети для контейнера и/или интерфейс контейнера с хоста?
Ответ №1:
Я нашел обходной путь, запустив контейнер --cap-add=NET_ADMIN
и выполнив следующие внутренние действия
ip link set dev eth0 down ip link set dev eth0 name eth1 ip link set dev eth0 up