Привязать сетевую ссылку исключительно к контейнеру Docker

Добавление 10 секунд сна в файл /etc/init.d/hostapdрешило проблему для меня.

1)sudo nano /etc/init.d/hostapd2 )Добавьте sleepв секцию start), как показано ниже

case "$1" in
  start)
        log_daemon_msg "Starting $DESC" "$NAME"
        sleep 10
        start-stop-daemon --start --oknodo --quiet --exec "$DAEMON_SBIN" \
                --pidfile "$PIDFILE" -- $DAEMON_OPTS >/dev/null
        log_end_msg "$?"
        ;;
0
22.11.2019, 21:31
1 ответ

Это невозможно со стандартными сетевыми командами. Функции, упрощающие это, были явно отвергнуты Docker несколько лет назад (https://github.com/moby/moby/pull/8216).

Конечно, вы можете вручную переместить интерфейс в сетевое пространство имен контейнера Docker, но это чревато проблемами :, например, каждый раз, когда вы перезапускаете или повторно -создаете контейнер, вам придется повторно -настроить сеть.


Чтобы добавить интерфейс в сетевое пространство имен вашего контейнера:

  1. Получите PID вашего контейнера:

    container_pid=$(docker inspect <container_name_or_id> -f '{{.State.Pid }}')
    
  2. Назначьте интерфейс пространству имен контейнера:

    ip link set netns ${container_pid} dev ${device}
    

И вы закончили... в основном.

Если вы хотите настроить интерфейс после его добавления в пространство имен, вам нужно будет либо:

  • Запустите свой контейнер с дополнительными привилегиями. Вероятно, просто --cap-add=NET_ADMIN, хотя вы также можете просто использовать --privilegedво время тестирования.

  • Используйте nsenterдля выполнения конфигурации снаружи контейнера:

    nsenter -t ${container_pid} -n ip addr...
    

Хотя все это работает, из-за ограничений, которые я отметил, я бы просто придерживался драйвера macvtap, если мне по какой-то причине нужен физический интерфейс внутри контейнера. Или используйте lxcили systemd-nspawnили какой-либо другой инструмент контейнеризации, который упрощает эту конкретную задачу.

1
28.01.2020, 02:38

Теги

Похожие вопросы