Сравнение сетевой производительности и поведения
Теперь давайте проведем несколько тестов, чтобы увидеть практические различия между мостовой (bridge) и сетью хоста (host) в Docker.
Тестирование сетевой производительности
Сначала создадим контейнер с мостовой сетью и другой с сетью хоста, а затем сравним их производительность.
- Остановим и удалим предыдущий контейнер nginx:
docker stop nginx-host
docker rm nginx-host
- Создадим новый контейнер с мостовой сетью для тестирования производительности:
docker run --name bridge-test -d --network bridge nginx:alpine
- Создадим еще один контейнер с сетью хоста:
docker run --name host-test -d --network host nginx:alpine
- Используем
docker exec
для запуска простого сетевого теста в каждом контейнере:
Для контейнера с мостовой сетью:
docker exec bridge-test sh -c "time wget -q -O /dev/null http://google.com"
Для контейнера с сетью хоста:
docker exec host-test sh -c "time wget -q -O /dev/null http://google.com"
Сравните время выполнения. Как правило, контейнер с сетью хоста будет иметь немного лучшую производительность, так как он избавляется от дополнительного сетевого слоя.
Проверка сетевых интерфейсов
Проверим сетевые интерфейсы в обоих контейнерах:
- Для контейнера с мостовой сетью:
docker exec bridge-test ip addr show
Вы увидите, что этот контейнер имеет свои собственные сетевые интерфейсы, изолированные от хоста.
- Для контейнера с сетью хоста:
docker exec host-test ip addr show
Вы заметите, что этот контейнер имеет точно такие же сетевые интерфейсы, как и хост - система, включая все физические сетевые интерфейсы.
- Сравним с сетевыми интерфейсами хоста:
ip addr show
Сетевые интерфейсы контейнера с сетью хоста должны совпадать с интерфейсами хост - системы.
Понимание конфликтов портов
При использовании сети хоста могут возникнуть конфликты портов, если контейнер пытается использовать порты, уже занятые на хосте:
- Остановим и удалим все запущенные контейнеры:
docker stop bridge-test host-test
docker rm bridge-test host-test
- Запустим службу на хосте, используя порт 8080:
python3 -m http.server 8080 &
- Теперь попробуем запустить контейнер с сетью хоста, который также хочет использовать порт 8080:
docker run --name conflict-test --network host -d -p 8080:80 nginx:alpine
Вы должны увидеть ошибку, так как порт 8080 уже занят на хосте.
- Очистим сервер Python HTTP:
kill %1
Это демонстрирует один потенциальный недостаток сети хоста - необходимо учитывать конфликты портов с хостом.