Сеть моста Docker, HTTP-вызовы между контейнерами ОЧЕНЬ медленно (после обновления докера)

Характеристики сервера:

os:  Ubuntu 14.04
docker: 1.10.2
docker-compose: 1.6.0

Совсем недавно был обновлен с 1.9 до 1.10 и добавлен docker-compose (однако пока не использующий compose). Проблема с медлительностью не возникала до обновления.

Также Docker настроен с моим IP-адресом DNS и прокси, как в '/ etc / default / docker'

DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --dns 138.XX.XX.X"
export http_proxy="http://proxy.myproxy.com:8888/"

(мой ip полностью указан там, просто использую X в качестве вопроса)

У меня есть два контейнера (container_a, container_b), на обоих запущены HTTP-серверы (Node.js), оба контейнера работают в мостовой сети (--net = mynetwork), которую я создал через:

docker network create mynetwork

Два контейнера выполняют HTTP-вызовы между собой, используя имя_контейнера в качестве «хоста» для HTTP-вызовов, например:

container_b:3000/someurl

Эти вызовы, сделанные между двумя контейнерами по сети докер-моста, занимают очень много времени (~ 5 секунд). Эти вызовы обычно выполняются менее 100 мс.

Когда я изменяю сеть с --net = mynetwork на этих контейнерах и вместо этого запускаю их как --net = host, а также изменяю свои HTTP-вызовы, чтобы использовать «localhost» в качестве хоста вместо имени контейнера и открывать их порты через a -p флаг ... Вызовы выполняются за ожидаемое время ‹100 мс.

Похоже, что из-за сети моста докеров мои вызовы между контейнерами занимают очень много времени.

Есть идеи, где я могу найти, чтобы диагностировать / исправить эту проблему?


person Collin Estes    schedule 24.02.2016    source источник


Ответы (1)


Эта проблема возникла в результате изменения внутреннего DNS, выпущенного как часть docker 1.10.

Дополнительную информацию можно найти здесь: https://github.com/docker/docker/issues/20661

Я включил режим отладки на демоне и просматривал журнал, когда делал запросы. Я мог видеть, что сначала попробовал «8.8.8.8», затем перешел к «8.8.4.4», а затем, наконец, перешел к IP-адресу DNS, который я добавил для своего хоста и разрешил. Я предполагаю, что мой корпоративный прокси-сервер вызывает зависание первых двух запросов (8.8 ..) и, в конечном итоге, тайм-аут, что приводит к медленному разрешению на правильном IP-адресе, который был третьим в списке.

Мое решение заключалось в том, чтобы изменить порядок DNS в моем файле / etc / default / docker, чтобы сначала иметь мой внутренний IP-адрес.

DOCKER_OPTS="--dns 138.XX.XX.X --dns 8.8.8.8 --dns 8.8.4.4 "

Кажется, это решает нашу проблему, поскольку сначала разрешает наши HTTP-запросы на основе имени контейнера между контейнерами на IP-адрес DNS этого хоста.

person Collin Estes    schedule 25.02.2016
comment
Вы нашли этот файл в контейнере? - person Miguel Stevens; 12.10.2016
comment
@Notflip /etc/default/docker - это файл конфигурации демона докеров. Он живет на хост-машине. - person Timo Reimann; 14.12.2016