Docker контейнеры внезапно стали использовать 192.168.0.0/16 вместо 172.17.0.0/16: потеряны услуги.
Мои приложения Docker вдруг не смогли отправить почту с помощью хоста Postfix MTA. Я исправил это, указав адресный пул Docker по умолчанию, но лучше сделать это перед установкой.
У меня есть сервер 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
Недавний
- Скрытие первичных ключей базы данных UUID вашего веб-приложения
- Don't Repeat Yourself (DRY) с Jinja2
- SQLAlchemy, PostgreSQL, максимальное количество строк для user
- Показать значения в динамических фильтрах SQLAlchemy
- Безопасная передача данных с помощью шифрования Public Key и pyNaCl
- rqlite: альтернатива dist с высокой степенью готовности и SQLite
Большинство просмотренных
- Используя Python pyOpenSSL для проверки SSL-сертификатов, загруженных с хоста
- Использование UUID вместо Integer Autoincrement Primary Keys с SQLAlchemy и MariaDb
- Подключение к службе на хосте Docker из контейнера Docker
- Использование PyInstaller и Cython для создания исполняемого файла Python
- SQLAlchemy: Использование Cascade Deletes для удаления связанных объектов
- Flask Удовлетворительный запрос API проверка параметров запроса с помощью схем Маршмэллоу