angle-up arrow-clockwise arrow-counterclockwise arrow-down-up arrow-left at calendar card-list chat check envelope folder house info-circle pencil people person person-plus phone plus question-circle search tag trash x

Docker контейнеры внезапно стали использовать 192.168.0.0/16 вместо 172.17.0.0/16: потеряны услуги.

27 ноября 2019 возле Peter
В Docker

Мои приложения Docker вдруг не смогли отправить почту с помощью хоста Postfix MTA. Я исправил это, указав адресный пул Docker по умолчанию, но лучше сделать это перед установкой.

post main image
https://unsplash.com/@mmintel

У меня есть сервер ISPConfig с приложениями Docker . Они используют агент почтовой передачи почты host Postfix (MTA) для доставки почты во внешний мир. Перед использованием функции отправки почты я проверяю, доступен ли доступ к Postfix . Хорошо работает. Но внезапно почта не была отправлена. Файл журнала содержал следующие сообщения об ошибках:

2019-11-26 17:31:56,758 ERROR MailMessage - send_mail: self.error_message = sending message, e = {'joe@example.com': (554, b'5.7.1 <joe@example.com>: Relay access denied')}
2019-11-26 17:31:56,759 ERROR MailSend - send during send, errors = send - sending message, e = {'joe@example.com': (554, b'5.7.1 <joe@example.com>: Relay access denied')}
2019-11-26 17:31:56,759 ERROR AddonContactForm - send_contact_form: mail_sender.get_errors() = send - sending message, e = {'joe@example.com': (554, b'5.7.1 <joe@example.com>: Relay access denied')}

Релейный доступ запрещен? Почему? Затем я вспомнил, что параметр Postfix имеет значение mynetworks в файле:

mynetworks  = 127.0.0.0/8 [::1]/128  172.16.0.0/12

Это привело меня к IP-адресам, назначенным контейнерам Docker :

systemctl status docker

в результате:

● docker.service -  Docker  Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2019-10-16 21:26:07 CEST; 1 months 11 days ago
     Docs: https://docs.docker.com
 Main PID: 765 (dockerd)
    Tasks: 28
   Memory: 53.7M
       CPU: 39min 54.387s
   CGroup: /system.slice/docker.service
           ├─  765 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
           ├─ 9784 /usr/bin/docker-proxy  -proto tcp -host-ip 0.0.0.0 -host-port 8001 -container-ip 192.168.32.2 -container-port 8001
           └─18316 /usr/bin/docker-proxy  -proto tcp -host-ip 0.0.0.0 -host-port 8000 -container-ip 192.168.176.2 -container-port 8000

Контейнеры Docker внезапно стали использовать 192 подсети вместо 172. Я (до сих пор) не понимаю, почему это произошло, но это должно было быть решено. После нескольких поисков я нашел решение проблемы. По ссылке ниже:

...по своей конструкции мы имеем следующую линейку сетей для мостовых сетей.
"172.17.0.0/16", "172.18.0.0/16", "172.19.0.0/16", "172.20.0.0/14", "172.24.0.0/14" "172.28.0.0/14", "192.168.0.0/16"
Когда мы создаем сеть, мы проверяем на наличие перекрытий только в пределах сети, созданной доккером. Мы добавили поддержку стандартного пула адресов для сети мостов. Вы можете настроить его с помощью файла daemon.jason или входного параметра при запуске демона Docker . Таким образом, вы можете выбрать подсеть, которую хотите создать dockerD (основной шлюз или сеть).

Я указал пулы адресов по умолчанию для моих сетей Docker , создав файл (его там не было):

/etc/docker/daemon.json

с содержимым:

{
	"default-address-pools":
	[
		{"base":"172.17.0.0/16","size":24}
	]
}

Затем я перезапустил Docker:

systemctl restart docker

Контейнеры все еще имели 192 IP адреса подсети. Затем я сделал это для приложений Docker :

docker-compose  .... down
docker-compose  .... up -d

Теперь у них 172 IP адреса подсети и почта снова выходит наружу! Чтобы убедиться, я также перезапустил сервер и был рад видеть, что все в порядке.

Некоторые команды для тестирования

Вы можете использовать этот метод, см. также ссылку ниже, чтобы проверить, создана ли нужная сеть:

docker network create foo
docker network inspect foo | grep Subnet

Некоторые другие команды, которые я использовал в процессе:

route -n

docker inspect <container> 

docker network ls

docker network inspect <network>

Резюме

Я все еще не знаю, что вызвало эту проблему, но, к счастью, вы можете указать подсеть для сети по умолчанию. Это действительно следует подчеркнуть, когда вы начинаете использовать Docker! Вы также можете указать подсети по умолчанию в docker-compose , но я этого не проверял. В любом случае, решено.

Ссылки / кредиты

Allow user to specify default address pools for docker networks #29376
https://github.com/moby/moby/pull/29376

Configuring Docker to not use the 172.17.0.0 range
https://serverfault.com/questions/916941/configuring-docker-to-not-use-the-172-17-0-0-range

Docker (compose?) suddenly creates bridge using 192.168.16.0/20 range #37823
https://github.com/moby/moby/issues/37823

How does compose chooses subnet for default network? #4336
https://github.com/docker/compose/issues/4336

networks
https://docs.docker.com/compose/compose-file/#networks

Подробнее:
Docker

Оставить комментарий

Комментируйте анонимно или войдите в систему, чтобы прокомментировать.

Комментарии

Оставьте ответ

Ответьте анонимно или войдите в систему, чтобы ответить.