Сервисы Docker доступны только для локального хоста

s = """Apple 300 2 kg
Shirt Medium Blue 1350 3 shirt
Shirt Medium Blue 1850 4 shirt"""

from collections import Counter
import re

m = re.findall('([^\d]+)(\d+)\s+(\d+)\s+(.*)', s)
c_price = Counter()
c_items = Counter()
for g in m:
    c_price.update( {(g[0].strip(), g[3]): int(g[1])}  )
    c_items.update( {(g[0].strip(), g[3]): int(g[2])}  )

for (item_name, item_type), count in c_items.items():
    print(item_name, c_price[(item_name, item_type)], count, item_type)

Выходы:

Apple 300 2 kg
Shirt Medium Blue 3200 7 shirt
0
задан vincent-lg 19 January 2019 в 10:22
поделиться

1 ответ

Хорошо, после некоторого копания вот что я нашел: docker обязательно создаст правила iptables для доступа к контейнерам вне сети. Просить Docker вообще не беспокоиться о iptables - это не очень хорошая стратегия, так как ему понадобится пересылать соединения из контейнеров во внешний мир. Поэтому в документации рекомендуется создать правило iptables в цепочке docker-user для предотвращения внешнего доступа к демону Docker. Это то, что я сделал. Конечно, данная команда (слегка измененная, чтобы полностью запретить внешний доступ) не сохранилась, поэтому мне пришлось создать сервис, чтобы добавить это правило. Вероятно, не лучший вариант, поэтому не стесняйтесь комментировать, если у вас есть лучший выбор, чтобы предложить. Вот правило iptables, которое я добавил:

iptables -I DOCKER-USER -i ext_if ! -s 127.0.0.1 -j DROP

Это правило запрещает внешний доступ к демону Docker, но все же позволяет подключаться к отдельным контейнерам. Это правило, похоже, ничего не решало для меня, так как это решение не было точным ответом на мой вопрос. Чтобы запретить доступ к моему контейнеру Docker, работающему на порту 8000, из Интернета, я добавил еще одно правило в тот же сценарий:

iptables -I DOCKER-USER -p tcp --destination-port 8000 -j DROP

Это правило немного экстремально: оно полностью запрещает сетевой трафик через порт 8000 по сети Docker. Хост (localhost) исключен из этого правила, так как предыдущее правило должно разрешать локальный трафик, независимо от того, что (если вы выполняете настройку iptables вручную, вам придется добавить это правило, это не дано, причина, по которой я перешел к более простым решениям, таким как ufw). Если вы посмотрите на правила брандмауэра с помощью iptables -L, то увидите, что цепочка DOCKER-USER вызывается перед любым правилом Docker. Вы можете найти другое правило, разрешающее трафик на тот же порт. Однако, поскольку мы запрещаем трафик в правиле с более высоким приоритетом, порт 8000 будет эффективно скрыт извне.

Это решение, хотя и кажется решающим проблему, не совсем элегантно и интуитивно понятно. Опять же, я не могу не задаться вопросом, был ли я первым, кто использовал Docker для размещения своих «скрытых» сервисов, сохраняя при этом другой сервис впереди. Я думаю, что обычный подход заключается в том, чтобы использовать nginx в самом контейнере докера, но это создало для меня другие проблемы, которые я, честно говоря, решил превзойти по преимуществам.

0
ответ дан vincent-lg 19 January 2019 в 10:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: