Ответ 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 на вашем хосте (или в другом контейнере), тогда вы только что потеряли веб-сервис. -
Что касается проблемы безопасности: если образ смог указать привязки портов хоста, контейнеры могли бы открыть доступ к контейнеру без вашего ведома. Разрешение удаленного пользователя на доступ к контейнеру на вашем хосте открывает вам возможность компрометации хоста в случае, если функции пространства имен в ядре не могут полностью изолировать контейнер, и даже если вы полностью доверяете изоляции, он открывает вас к потенциальным юридическим проблемам, если этот контейнер используется в незаконных целях. В любом случае это плохая идея.