Docker - Управление портами: Пособие для начинающих

Здравствуйте, будущие энтузиасты Docker! Я рад быть вашим проводником в увлекательное путешествие в мир управления портами в Docker. Как кто-то, кто уже давно преподает информатику, я своими глазами видел, как Docker изменил способ我们的 разработку и развертывание приложений. Итак, погружаемся в мир управления портами в Docker!

Docker - Managing Ports

EXPOSE vs. PUBLISH: Понимание различий

Прежде чем перейти к коду, давайте развеем распространенное заблуждение, с которым сталкиваются многие мои студенты: разницу между EXPOSE и PUBLISH в Docker.

EXPOSE

EXPOSE можно сравнить с тем, как повесить на дом табличку "Продается". Это указывает на то, что контейнер слушает определенные порты, но не делает их доступными из خارج контейнера.

PUBLISH

PUBLISH, с другой стороны, resembles как открыть переднюю дверь и пригласить людей внутрь. Он отображает порт из контейнера на порт на хост-машины, делая его доступным из внешнего мира.

Давайте посмотрим на простую таблицу для резюмирования:

Команда Цель Доступен из внешнего мира?
EXPOSE Документировать порты Нет
PUBLISH Отображать порты Да

Теперь, когда мы это прояснили, давайте посмотрим, как мы можем использовать это на практике!

КакExposeポート в Docker с помощью PUBLISH?

Когда вы запускаете контейнер, вы можете использовать флаг -p или --publish, чтобы отобразить порт контейнера на порт хоста. Давайте представим, что у нас есть веб-приложение, работающее на порту 8080 внутри нашего контейнера, и мы хотим получить доступ к нему на порту 80 на нашей хост-машины.

Вот как это сделать:

docker run -p 80:8080 my-web-app

Давайте разберем это:

  • docker run: Эта команда запускает контейнер
  • -p 80:8080: Это отображает порт 8080 в контейнере на порт 80 на хосте
  • my-web-app: Это имя нашего Docker-образа

После выполнения этой команды вы можете получить доступ к вашему веб-приложению, перейдя по адресу http://localhost в вашем веб-браузере. Не правда ли, это замечательно?

Но что, если мы хотим отобразить несколько портов? Нет проблем! Мы можем использовать несколько флагов -p:

docker run -p 80:8080 -p 443:8443 my-web-app

Это отображает порт 8080 на 80 для HTTP-трафика и 8443 на 443 для HTTPS-трафика. Это как если бы ваше приложение имело и переднюю, и заднюю дверь!

КакExposeポート в Dockerfile?

Теперь давайте поговорим о том, как мы можем expose порты напрямую в是我们的 Dockerfile. Это super полезно, когда вы создаете свои собственные Docker-образы.

Вот простой Dockerfile для Node.js приложения:

FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 8080
CMD [ "node", "server.js" ]

Давайте разберем это:

  • FROM node:14: Это устанавливает нашу базовую image для Node.js версии 14
  • WORKDIR /app: Это устанавливает рабочую директорию в нашем контейнере
  • COPY package*.json ./: Это копирует наш файл package.json
  • RUN npm install: Это устанавливает наши зависимости
  • COPY . .: Это копирует наш код приложения
  • EXPOSE 8080: Это говорит Docker, что контейнер будет listen на порту 8080
  • CMD [ "node", "server.js" ]: Это команда для запуска нашего приложения

Инструкция EXPOSE здесь resembles putting того "Продается" sign мы говорили earlier. Это говорит Docker, "Эй, этот контейнер будет listen на порту 8080!"

Но помните, что EXPOSE alone не публикует порт. Чтобы действительно сделать порт доступным при запуске контейнера, мы все равно должны использовать флаг -p:

docker run -p 80:8080 my-node-app

Это отображает exposed порт 8080 в контейнере на порт 80 на нашей хост-машины.

Заключение

И вот мы и arrived в конце, друзья! Мы совершили путешествие по миру управления портами в Docker, от понимания различий между EXPOSE и PUBLISH до их prakticheskogo применения в наших Dockerfile и run командах.

Помните, управление портами в Docker - это все о communicate. EXPOSE resembles telling Docker, "Эй, я буду использовать эти порты," в то время как PUBLISH resembles telling your computer, "Я хочу, чтобы ты listened к этому Docker контейнеру на этих портах."

По мере того, как вы продолжаете свое путешествие с Docker, вы обнаружите, что понимание управления портами является crucial для развертывания приложений, особенно в сложных microservice architectures. Но не волнуйтесь, с практикой это станет second nature!

FAQ

Вот несколько часто задаваемых вопросов, которые задают мои студенты:

  1. Q: Можно ли использовать EXPOSE в komande docker run? A: Нет, EXPOSE используется только в Dockerfile. Для/runtime отображения портов используйте флаг -p.

  2. Q: Что happens, если я не использую PUBLISH при запуске контейнера? A: Контейнер будет работать, но вы не сможете получить к нему доступ из внешней Docker сети.

  3. Q: Можно ли отобразить порт контейнера на несколько портов хоста? A: Да! Вы можете использовать несколько флагов -p, чтобы отобразить один порт контейнера на несколько портов хоста.

  4. Q: Есть ли limit на количество портов, которые я могу expose или publish? A: В Docker нет жёсткого limit, но ваша операционная система может иметь ограничения на доступные порты.

  5. Q: В чем разница между -p и -P в komande docker run? A: -p позволяет вам указывать отображения портов, в то время как -P публикует все exposed порты на случайные порты на хосте.

Помните, лучший способ учиться - это делать. Так что зажгите terminal, начните создавать свои Dockerfile и счастливого кодирования!

Credits: Image by storyset