отключить переадресацию IP, если в файле docker-compose.yml нет определения сопоставления портов

Я изучаю сеть докеров. Я создал простой docker-compose файл, который запускает два контейнера tomcat:

version: '3'
services:
    tomcat-server-1:
        container_name: tomcat-server-1
        image: .../apache-tomcat-10.0:1.0
        ports:
            - "8001:8080"

    tomcat-server-2:
        container_name: tomcat-server-2
        image: .../apache-tomcat-10.0:1.0

После запуска контейнеров с docker-compose up я вижу, что tomcat-server-1 ответов на http: // localhost: 8001. На первый взгляд, tomcat-server-2 недоступен с localhost. Это здорово, это то, что мне нужно.

Когда я проверяю два запущенных контейнера, я вижу, что они используют следующие внутренние IP-адреса:

  • кот-сервер-1: 172.18.0.2
  • кот-сервер-2: 172.18.0.3

Я вижу, что tomcat-server-1 также доступен с хост-машины через http://172.18.0.2:8080.

Затем меня удивило следующее: tomcat-server-2 также доступен с хост-машины, например http://172.18.0.3:8080, несмотря на то, что сопоставление портов не определено для этого контейнера в файле docker-compose.yml.

Я хотел бы достичь следующего:

  • Два сервера tomcat должны видеть друг друга во внутренней сети докеров через имена хостов.
  • Tomcat должен быть доступен с хост-машины, ТОЛЬКО если сопоставление портов определено в файле docker-compose, например: 8001: 8080.
  • Если определение сопоставления портов отсутствует, контейнер НЕ может быть недоступен. Либо с localhost, либо с его внутреннего IP, например: 172.18.0.3.

Я пробовал использовать разные сетевые конфигурации, такие как мост, отсутствие и режим хоста. Безуспешно.

Конечно, режим host не может работать, потому что оба контейнера tomcat используют внутри один и тот же порт 8080. Так что, если я прав, то я могу рассмотреть только режим bridge или none.

Можно ли таким образом настроить сеть докеров? Было бы здорово решить эту проблему с помощью только файла docker-compose без каких-либо внешних манипуляций с докером, iptable и т. Д.


person zappee    schedule 14.02.2021    source источник


Ответы (1)


Без дополнительной настройки брандмауэра вы не можете предотвратить доступ хоста Linux к частным IP-адресам контейнера.

При этом частные IP-адреса контейнера чрезвычайно ограничены. Вы не можете связаться с ними с других хостов. Если Docker работает на виртуальной машине Linux (как приложение Docker Desktop предоставляет в MacOS или Windows), то хост за пределами виртуальной машины также не может связаться с ними. В большинстве случаев я бы не рекомендовал вообще искать частные IP-адреса контейнера, поскольку они не особенно полезны.

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

person David Maze    schedule 14.02.2021