Мапінг портів у Docker — це процес перенаправлення мережевого трафіку з порту вашої хостової машини (комп’ютера, де працює Docker) на порт контейнера, який виконується в ізольованому середовищі. Це дозволяє доступ до сервісів всередині контейнера ззовні.
Як працює мапінг портів?
Docker-контейнер, зазвичай, працює в окремому мережевому просторі і має власні порти, які не є доступними для зовнішнього світу без явного налаштування. Мапінг портів дозволяє направляти запити до хостового комп’ютера на певний порт контейнера, на якому виконується додаток.
Приклад команди для мапінгу портів
Щоб запустити контейнер з мапінгом портів, використовується ключ -p
або --publish
у команді docker run
.
docker run -p <host_port>:<container_port> <image_name>
-
<host_port>
— це порт на хостовій машині, який ви хочете використати. -
<container_port>
— це порт усередині контейнера, на якому додаток слухає запити. -
<image_name>
— назва образу Docker, який ви запускаєте.
Приклад
Допустимо, ви запускаєте веб-сервер, який у контейнері слухає на порту 80. Якщо ви хочете, щоб цей веб-сервер був доступний через порт 8080 вашої хостової машини, команда буде виглядати так:
docker run -p 8080:80 my-web-server
Тепер усі запити до localhost:8080
на вашому комп’ютері будуть перенаправлятися на порт 80 всередині контейнера.
Декілька мапінгів портів
Можна мапити декілька портів одночасно. Наприклад:
docker run -p 8080:80 -p 8443:443 my-web-server
У цьому випадку порт 8080 хостової машини буде перенаправлятись на порт 80 контейнера, а порт 8443 — на порт 443.
Короткий опис варіантів мапінгу портів:
-
TCP або UDP: За замовчуванням Docker використовує TCP, але можна явно вказати тип протоколу, додавши
/tcp
або/udp
після порту:docker run -p 8080:80/tcp -p 8443:443/udp my-server
-
Вибір випадкового порту: Якщо замість номера порту на хості вказати
0
, Docker сам вибере вільний порт на хості:docker run -p 0:80 my-web-server
Перевірка мапінгу портів
Щоб перевірити, на яких портах ваш контейнер, можна скористатися командою:
docker ps
Виведе щось на зразок:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e3a1b2c3d4e5 my-web-server "nginx -g 'daemon of…" 2 minutes ago Up 2 minutes 0.0.0.0:8080->80/tcp web_server_1
Тут видно, що порт 8080 на хості мапиться на порт 80 у контейнері.
Корисні додаткові опції:
-
–network host: Запуск контейнера з мережею хоста. У цьому випадку контейнер використовує мережеві інтерфейси та порти хостової машини напряму.
docker run --network host my-web-server
-
–publish-all або -P: Мапить усі відкриті порти контейнера на випадкові порти хоста.
docker run -P my-web-server
Висновок
Мапінг портів у Docker — це простий і ефективний спосіб отримати доступ до сервісів, які працюють всередині контейнера, ззовні. За допомогою параметра -p, ви можете точно налаштувати, які порти будуть доступні, а також захистити інші порти від небажаного доступу.