Почему команды внутри докера недоступны хосту?

При использовании Docker мы создаем и запускаем контейнеры, которые являются изолированными средами выполнения приложений. Контейнеры разделяют ядро операционной системы с хостовой системой, но имеют собственную оболочку, библиотеки и файловую систему.

По умолчанию Docker использует сеть типа bridge для обеспечения сетевого взаимодействия между контейнерами и хостом. Каждому контейнеру присваивается собственный IP-адрес в этой сети, и Docker маршрутизирует сетевые запросы между контейнерами и хостовой системой.

Однако, по умолчанию Docker не настраивает проброс портов с контейнеров на хостовую систему. Это значит, что из-за режима изоляции, команды, запущенные внутри контейнера, по умолчанию недоступны хостовому серверу.

Чтобы сделать команды внутри контейнера доступными хостовому серверу, мы можем пробросить порт контейнера на хостовую систему. Это можно сделать с помощью флага -p (или --publish) при запуске контейнера. Например, команда docker run -p 80:8080 <image_name> пробросит порт 8080 из контейнера на порт 80 хостовой системы. После этого, при обращении к порту 80 хостовой системы, мы будем получать результат работы контейнера.

Кроме того, Docker позволяет создавать сетевые соединения между контейнерами с помощью сетей типа overlay или bridge. С помощью команды docker network create можно создать собственную локальную сеть и присоединить к ней несколько контейнеров. Таким образом, контейнеры смогут взаимодействовать друг с другом без проброса портов и доступа хосту.

Но необходимо помнить, что без настройки явного проброса портов или создания сетевых соединений, контейнеры по умолчанию изолированы от хостовой системы. Это обеспечивает безопасность и предотвращает нежелательный доступ к контейнерам и их ресурсам с хостовой системы.