Доступ к RDS из контейнера Docker не проходит через группу безопасности?
Я пытаюсь запустить веб-сервер, который использует базу данных RDS с EC2 внутри контейнера докера.
Я настроил группы безопасности, чтобы роли хоста EC2 был разрешен доступ к RDS, и если я пытаюсь получить к нему доступ непосредственно с хост-машины, все работает правильно.
Однако, когда я запускаю простой контейнер на хосте и пытаюсь получить доступ к RDS, он блокируется, как будто группа безопасности не пропускает его. После множества проб и ошибок казалось, что запросы контейнеров действительно не поступают от хоста EC2, поэтому брандмауэр говорит "нет".
Я смог обойти это в краткосрочной перспективе, установив --net = host в контейнере Docker, однако это нарушает множество замечательных сетевых функций Docker, таких как возможность сопоставления портов (т.е. Теперь мне нужно убедиться, что каждый экземпляр контейнера прослушивает другой порт вручную).
Кто-нибудь нашел способ обойти это? Кажется, что это довольно большое ограничение для запуска контейнеров в AWS, если вы на самом деле используете какие-либо ресурсы AWS.
Ответы
Ответ 1
Выяснилось, что происходит, публикуя здесь, если это помогает кому-то еще.
Запросы из контейнера попадают в общедоступный IP-адрес RDS, а не из частного (как работают группы безопасности). Похоже, что DNS внутри контейнера докеров использовал 8.8.8.8 google dns, и это не сделало бы черную магию AWS превращения конечной точки rds в частный ip.
Итак, например:
DOCKER_OPTS="--dns 10.0.0.2 -H tcp://127.0.0.1:4243 -H unix:///var/run/docker.sock -g /mnt/docker"
Ответ 2
Да, контейнеры попадают в общедоступные IP-адреса RDS. Но вам не нужно настраивать низкоуровневые параметры Docker, чтобы ваши контейнеры могли разговаривать с RDS. Кластер ECS и экземпляр RDS должны находиться в одном и том же VPC, а затем доступ можно настроить с помощью групп безопасности. Самый простой способ сделать это:
- Перейдите на страницу экземпляров RDS
- Выберите экземпляр БД и разверните его, чтобы увидеть детали.
- Нажмите на идентификатор группы безопасности
- Перейдите на вкладку "Входящие" и выберите "Редактировать"
- И убедитесь, что существует правило типа MySQL/Aurora с исходным текстом
- При вводе пользовательского источника просто начните вводить имя кластера ECS, и имя группы безопасности будет автоматически завершено для вас.
В этом учебнике есть скриншоты, которые иллюстрируют, куда идти.
Полное раскрытие: В этом учебнике представлены контейнеры от Bitnami, и я работаю над Bitnami. Однако мысли, выраженные здесь, являются моими собственными, а не мнением Битнами.
Ответ 3
Как упоминает @adamneilson, настройка опций Docker - лучший выбор. Вот как открыть ваш DNS-сервер Amazon на VPC. Также раздел Включение вывода отладки Docker в Руководстве разработчика контейнера Amazon EC2. Устранение неполадок упоминает, где находится файл опций Docker.
Предполагая, что вы используете блок VPC 10.0.0.0/24, DNS будет 10.0.0.2.
Для CentOS, Red Hat и Amazon:
sed -i -r 's/(^OPTIONS=\")/\1--dns 10.0.0.2 /g' /etc/sysconfig/docker
Для Ubuntu и Debian:
sed -i -r 's/(^OPTIONS=\")/\1--dns 10.0.0.2 /g' /etc/default/docker
Ответ 4
Правило входящего трафика для RDS должно быть установлено на частный IP-адрес экземпляра EC2, а не на публичный IPv4.