Как настроить перенаправление порта в Docker?

У меня возникли проблемы с прокидыванием портов из Docker контейнера. Я использую MacOS. 

Когда я компилирую код без Docker командой "go run ./cmd/main.go", я могу обращаться к порту 8089 и все запросы обрабатываются корректно.

Однако, когда я использую Dockerfile:

```
FROM golang:alpine AS builder
RUN apk add --update --no-cache make
WORKDIR /app
COPY . .
RUN go mod download
RUN GOOS=linux go build -o ./bin/app ./cmd/main.go

FROM alpine:latest AS runner
COPY --from=builder /app/bin/app/ . 
CMD [ "./app" ]
EXPOSE 8089 
```

и выполняю команды:

```
docker build -t test-image .
docker run -p 127.0.0.1:8089:8089 test-image
```

Я вижу успешную сборку и запуск контейнера (в логах вижу, что сервер запущен с тем же адресом, что и в локальной сборке), но не могу получить доступ к порту. В Postman я получаю ошибку "Error: socket hang up Could not get response".

Я приложил скриншоты команд "lsof -i :8089" и "docker ps". Вроде бы порт слушается, но ни один из запросов не обрабатывается.
Изображение к вопросу
Изображение к вопросу
Изображение к вопросу
  • 15 октября 2023 г. 20:48
Ответы на вопрос 2
Настройка перенаправления порта в Docker может зависеть от операционной системы, поэтому я расскажу о некоторых способах настройки для MacOS.

1. Убедитесь, что ваш сервер внутри Docker контейнера слушает порт 8089. Если вы запускаете сервер на порту 8089 внутри контейнера, это может быть проблемой с настройкой самого сервера. Убедитесь, что ваше приложение внутри контейнера правильно настроено для прослушивания порта 8089.

2. Проверьте, что контейнер успешно создан и работает, выполнив команду `docker ps`. 

3. У вас есть правильная команда для перенаправления порта `-p 127.0.0.1:8089:8089`, что означает, что порт 8089 внутри контейнера будет доступен с использованием IP-адреса 127.0.0.1 на хостовой машине. 
   - Если вы хотите, чтобы порт был доступен только на вашей локальной машине, используйте `-p 8089:8089`.
   - Если вы хотите, чтобы порт был доступен для всех устройств в сети, используйте `-p 0.0.0.0:8089:8089`.

4. Проверьте, что порт 8089 не занят другими процессами на вашей хостовой машине. Выполните команду `lsof -i :8089` и убедитесь, что никакой другой процесс не слушает этот порт в вашей системе. Если процесс уже использует этот порт, вам нужно будет изменить порт для вашего Docker контейнера.

5. Если ничего не помогло, попробуйте добавить флаг `--network host` к команде `docker run`. Например: `docker run --network host -p 8089:8089 test-image`. Это настроит контейнер на использование сетевого пространства имен хостовой машины, что может помочь решить проблему с доступом к порту.

Надеюсь, что один из этих способов поможет вам настроить перенаправление порта в Docker на MacOS.
Возможно, проблема заключается в привязке порта к локальному хосту. Рекомендуется либо удалить эту привязку, либо указать все доступные интерфейсы: 0.0.0.0:8089:8089.
Похожие вопросы