У меня есть сервер с двумя работающими док-контейнерами. Одним из них является интерфейс небольшого приложения, обслуживаемого http-server
. Это приложение использовало API выборки Javascript для извлечения данных из очень простой базы данных, основанной на модуле json-server Node.js, который работает в другом контейнере.
Бывает, что json-server
делает порт 3000 доступным для внешнего пользователя, то есть, если кто-то указывает браузеру на http://example.com:3000
, мои данные будут доступны без фильтрации и представления, предоставляемых внешним интерфейсом. Это не то, что я хочу.
Я хотел бы заблокировать порт 3000 во внешнем мире, в то же время позволяя другому контейнеру докера получать данные, как обычно. Я думаю, что это может быть сделано на основе ИС, но я не знаю, как это сделать.
Это моя текущая конфигурация Iptables, в основном созданная самим Docker в качестве стандарта.
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy DROP)
target prot opt source destination
DOCKER-USER all -- anywhere anywhere
DOCKER-ISOLATION-STAGE-1 all -- anywhere anywhere
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
DOCKER all -- anywhere anywhere
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:http-alt
ACCEPT tcp -- anywhere 172.17.0.3 tcp dpt:3000
Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target prot opt source destination
DOCKER-ISOLATION-STAGE-2 all -- anywhere anywhere
RETURN all -- anywhere anywhere
Chain DOCKER-ISOLATION-STAGE-2 (1 references)
target prot opt source destination
DROP all -- anywhere anywhere
RETURN all -- anywhere anywhere
Chain DOCKER-USER (1 references)
target prot opt source destination
RETURN all -- anywhere anywhere
В приведенной выше конфигурации IP 172.17.0.2 - это мое приложение, а 172.17.0.3 - это IP-адрес контейнера моей базы данных.
Контейнер внешнего интерфейса запускается с
docker run -p 80:8080 --name=frontend -d mtr/frontend
а второй с
docker run -p 3000:3000 --name=database -d mtr/database
Я также рассмотрел возможность использования Docker для ограничения доступа, но после долгих исследований я ничего не смог найти.
Любые предложения о том, как я могу это сделать?