Запуск контейнера Docker на определенном порту

У меня есть приложение Rails, развернутое с Dokku в DigitalOcean. Я создал базу данных Postgres и связал ее с приложением Rails. Все работало нормально, пока я не перезапустил дроплет. Я понял, что приложения перестали работать, потому что при перезапуске каждый контейнер Docker получает новый порт, и приложение Rails не может подключиться к нему. Если я запускаю dokku postgresql:info myapp, он показывает старый порт, но он изменился. Если я вручную изменю database.yml и отправлю его в репозиторий dokku, все будет работать.

Итак, как мне запретить Docker назначать другой порт при каждом перезапуске сервера? Или, может быть, есть возможность изменить порты запущенных контейнеров.


person Dan    schedule 17.08.2014    source источник


Ответы (1)


У меня нет большого опыта работы с Dokku, но для докеров нет такой вещи, как порт контейнера. В докере вы можете открыть порт контейнера для получения входящего запроса и сопоставить его с определенными портами на вашем хост-компьютере. С его помощью вы можете, например, запустить свой postgres внутри контейнера и сообщить докеру, что вы хотите открыть порт 5432, порт postgresql по умолчанию, для приема входящих запросов:

sudo docker run --expose=5432 -P <IMAGE> <COMMAND>

--expose=5432 сообщает докеру, что нужно открыть порт 5432 для приема входящих подключений из внешнего мира. Флаг -P указывает докеру сопоставить все открытые порты в вашем контейнере с портом хост-машины. с этим вы можете подключиться к postgres, указывая на ip: порт вашего хоста. Если вы хотите сопоставить порт контейнера с портом другого хост-компьютера, вы можете использовать флаг -p:

sudo docker run --expose=5432 -p=666 <IMAGE> <COMMAND>

Не уверен, что это может помочь вам со средой Dokku, но я надеюсь на это. Для получения дополнительной информации о команде запуска docker см .: https://docs.docker.com/reference/commandline/cli/#run

person Roger Almeida    schedule 17.08.2014
comment
Спасибо за ваш вклад! Итак, какой была бы команда для запуска контейнера Postgres на определенном порту? В чем разница между портами -P и --expose? Прямо сейчас у меня есть образ Postgres, который запускается на 0.0.0.0:49156->5432, и я хочу, чтобы он был 0.0.0.0:49168->5432, какова будет команда? - person Dan; 18.08.2014
comment
Документация по -P и --expose docs.docker.com/reference/run / # выставить-входящие-порты - person Regan; 18.08.2014
comment
--expose, вы сообщаете докеру, что хотите получать соединения через порт определенного контейнера. -P, вы хотите сопоставить все открытые порты контейнера с портами хост-машины. Для сопоставления с разными портами вы не можете использовать -P, вы должны использовать -p: sudo docker --expose=5432 -p=49156:5432 <IMAGE> <COMMAND> - person Roger Almeida; 18.08.2014
comment
@RogerAlmeida Подразумевает ли -p = YYYY: XXXX --expose на порте XXXX? - person Regan; 18.08.2014
comment
@RogerAlmeida Мое изображение выглядит так: IMAGE: postgresql/blog:latest, COMMAND: /usr/bin/start_pgsql, PORT: 0.0.0.0:49156->5432/tcp. Итак, я хочу изменить порт на 49168. docker run -p=49168:5432 postgresql/blog:latest /usr/bin/start_pgsql возвращает stat /usr/bin/start_pgsql: no such file or directory - person Dan; 19.08.2014
comment
Другими словами: что должно быть вместо опции <COMMAND>? Этот образ был запущен плагином dokku, и я не знаю, как его остановить и запустить заново. - person Dan; 19.08.2014