По моему опыту было бы лучше, если бы сервер выбирал свой собственный "обычный" порт и жесткий код, который в местах, где он появляется на земле Docker.
Допустим, у меня есть серверный процесс, может бытьчто я написал в Go, и я решил, что он хочет прослушивать порт 12345. Затем:
Обычное соглашение Go состоит в том, что сервер принимает необязательный аргумент командной строки, например-bind 0.0.0.0:12345
, чтобы указать адрес привязки и порт для процесса, но я бы оставил его по умолчанию в моем контейнере Docker.
Мой файл Docker для сервера будет EXPOSE 12345
,в основном в качестве документации.
Для клиента у меня явно была бы опция -server_url http://server:12345
, которую я также мог бы установить через переменную окружения SERVER_URL=http://server:12345
.По умолчанию он может указывать на localhost
для простейшей настройки, ориентированной на разработчика.
В моем docker-compose.yml
я должен был бы явно указать порт справаблока ports:
сервера, если он у меня был, и в клиенте SERVER_URL
.
version: '3'
services:
server:
build: ./server
ports: ['12345:12345']
client:
build: ./client
environment:
SERVER_URL: 'http://server:12345'
ports: ['24680:24680']
Обратите внимание, что ports:
- это необязательно ,он вам не нужен, если вы не хотите подключаться к фоновой службе извне Docker.Также обратите внимание, что порты не обязательно должны быть одинаковыми, и есть смысл использовать «нормальные» порты для вещей, когда это возможно.Если бы сервер использовал обычный HTTP-порт 80, мне бы не пришлось явно упоминать его в URL-адресе клиента, например.