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

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

 EXPOSE 80:8080 

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

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

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

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

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

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

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

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

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

Есть разница между публикацией и публикацией .

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

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

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