Как публиковать порты в файлах докеров

Мне нужно сопоставить порты на хосте с портами в контейнере. Я могу добиться этого, выполнив команду "docker run" с -p. Как достичь этого через Dockerfile? Используя следующее, вы получаете "deprecated error"

EXPOSE 80:8080

Как еще я могу открыть открытые порты через файл докеров?

Ответ 1

Вы не можете. Какие порты публикуются на хосте docker - это строгое решение, которое должен выполнять локальный администратор, а не изображение, которое они пытаются запустить; это будет (а) проблема безопасности (эй, я только что открыл ssh-доступ к вашей системе!) и (b) подвержен ошибкам (мой контейнер веб-сервера не может привязываться к порту 80, потому что я уже запускаю сервер на порт 80).

Если вы хотите избежать длинных команд командной строки для docker run попробуйте использовать что-то вроде docker-compose для автоматизации процесса. Затем вы можете передать докер-конфигурацию, например:

mywebserver:
  image: myname/mywebserver
  ports:
    - 80:8080

А затем простую docker-compose up запустит ваш контейнер с портом 8080 контейнера, связанным с портом 80 хоста.

Обновление 2017-03-11

В ответ на комментарий Willa:

  • Использование docker-compose не поможет в проблеме столкновения портов. Проблема столкновения с портом является причиной того, что изображения не должны указывать привязки порта хоста. Я просто предлагал docker-compose в качестве альтернативы длинным командам командной строки docker run с несколькими привязками портов. Проблема столкновения портов потенциально может позволить контейнеру атаковать отказ в обслуживании вашего хоста: если, например, контейнер запускается и привязывается к порту 80 до сервера Apache на вашем хосте (или в другом контейнере), тогда вы только что потеряли веб-сервис.

  • Что касается проблемы безопасности: если образ смог указать привязки портов хоста, контейнеры могли бы открыть доступ к контейнеру без вашего ведома. Разрешение удаленного пользователя на доступ к контейнеру на вашем хосте открывает вам возможность компрометации хоста в случае, если функции пространства имен в ядре не могут полностью изолировать контейнер, и даже если вы полностью доверяете изоляции, он открывает вас к потенциальным юридическим проблемам, если этот контейнер используется в незаконных целях. В любом случае это плохая идея.

Ответ 2

Там разница между выставлять и публиковать.

Expose означает открыть порт на стороне контейнера, опубликовать средство, чтобы открыть его на хосте Docker для внешнего мира.

Например, если ваша команда запуска docker имела -p 80: 8080, она открыла порт 8080 на контейнере и порт публикации 80 на хосте.

Вы можете действительно выставлять порты только в Dockerfile, если вы хотите гибко публиковать порты, вам нужно использовать опцию -p при запуске Docker. Вот так:

docker run -P your_app

Ответ 3

Что вы можете сделать, так это EXPOSE список портов в вашем Dockerfile а затем запустить команду docker run -P your_app чтобы опубликовать все порты, представленные в Dockerfile.