Назад | Перейти на главную страницу

Запрос HTTPS не выполняется в Docker> = 1.10 с виртуализированной сетью

У меня возникла проблема с невозможностью установить HTTPS-соединения из контейнера Docker с версией 1.10.3 или 1.11.2.

Я пробовал использовать apt-get, curl и wget, и все терпит неудачу, как только должно быть установлено HTTPS-соединение.

Например, следующая команда не работает:

$ docker run -it ubuntu-curl curl -v https://www.google.com
[...]
* gnutls_handshake() failed: Error in the pull function.
* Closing connection 0

Образ Docker ubuntu-curl основывается на ubuntu:latest, единственное изменение было apt-get update ; apt-get install curl.

Если я использую HTTP вместо HTTP, он работает. Если я введу ту же команду с хоста, она сработает. Если я запустил контейнер без виртуализации сети (запуск докера --net="host"), оно работает. Если я откатываю Docker (я пробовал 1.6.2 и 1.9.1), он тоже работает.

Любые намеки на то, что может быть не так? Я пробовал с двумя хостами, Ubuntu 14 LTS и стабильной CoreOS без соответствующей настройки - оба работают внутри кластера OpenStack.

Iptables хоста (хотя я бы не понял, почему iptables должен блокировать только HTTP-трафик):

$ sudo iptables --list
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
DOCKER-ISOLATION  all  --  anywhere             anywhere
DOCKER     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain DOCKER (1 references)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             172.17.0.2           tcp dpt:12345

Chain DOCKER-ISOLATION (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere

Мне дали решение Сообщество докеров

Сеть OpenStack, похоже, использует более низкие значения MTU, а Docker не выводит настройки MTU из сетевой карты хоста. с 1.10.

Чтобы запустить демон docker с пользовательскими настройками MTU, вы можете выполнить это сообщение в блоге, который говорит:

$ cp /lib/systemd/system/docker.service /etc/systemd/system/docker.service

Отредактируйте строку в новом файле, чтобы она выглядела так:

ExecStart=/usr/bin/docker daemon -H fd:// –mtu=1454

MTU 1454 - это значение, которое кажется общим для OpenStack. Вы можете найти его на своем хосте с помощью ifconfig.

Наконец перезапустите Docker:

$ sudo systemctl daemon-reload
$ sudo service docker restart