Как настроить маппинг портов между хостом и Docker-контейнером

Для взаимодействия с Docker-контейнером с хоста нужно настроить маппинг портов. Разберемся, почему это важно, и рассмотрим несколько способов добавления нового маппинга после запуска Docker-контейнера.
Это адаптированный перевод статьи Assigning a Port Mapping to a Running Docker Container из блога образовательного проекта Baeldung.
Эта статья предназначена для разработчиков, которые знают Docker хотя бы на базовом уровне. Если вы еще не знакомы с этой технологией и вам интересно с ней разобраться, пройдите курс по Docker на Хекслете.
Зачем нужен маппинг
По умолчанию Docker запускает сервис изолированно — то есть все порты между хостом и Docker-контейнером закрыты. Для того, чтобы получить доступ к сервису с хоста или из внешней сети, нужно использовать сопоставление портов или маппинг.
Маппинг нужен для того, чтобы все запросы, проходящие через порт хоста, перенаправлялись в Docker-контейнер. Другими словами, сопоставление портов делает процессы внутри контейнера доступными извне.
При запуске нового Docker-контейнера с помощью команды docker run можно сопоставить порты опцией —publish или -p :
-d -p 81:80 --name httpd-container httpd
Эта команда запускает Docker-контейнер httpd (HTTP-сервер Apache) и маппинг 81 порта хоста с 80 портом внутри Docker-контейнера. Стоит отметить, что по умолчанию сервер httpd прослушивает порт 80.
Теперь доступ к приложению можно получить, используя порт 81 на хосте:
It works!