Развернутый образ Docker недоступен извне - PullRequest
0 голосов
/ 25 сентября 2018

Итак, у меня есть приложение Go, которое я внедряю в экземпляр EC2 с конвейером Ansible и Jenkins в качестве образа Docker.У меня есть образ, к которому я могу получить доступ снаружи хоста, используя IP-адрес и номер порта 8080, используя Postman.При развертывании нового образа я не могу получить ответ, используя IP-адрес и номер порта.Когда я ssh на сервер, я могу достичь конечной точки, используя localhost и номер порта.Если я остановлю это изображение и начну первое, то смогу снова дойти до него.

Каковы возможные различия между этими изображениями, которые делают невозможным доступ к конечной точке через IP-адрес?

Мой файл составления Docker:

version: '2'
services:
  project-1:
    image: ...
    volumes:
      - /var/log:/var/log
    network_mode: host
    environment:
      - ...
    cpu_shares: 1236
    mem_limit: 2619m

Мой DockerFile:

FROM golang:1.10

WORKDIR /go/src/...
COPY . .

RUN go get -d -v ./...
RUN go install -v ./...

EXPOSE 8080-8080
CMD ./run.sh

Я также пытался удалить network_mode из файла Docker Compose и заменить его на порты, как показано ниже, но безуспешно:

ports:
      - "0.0.0.0:8080:8080"

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Мы нашли ответ.Эта проблема возникла после добавления следующего кода перехода:

serv := &http.Server{
    Addr:         "localhost" + port,
    ReadTimeout:  60 * time.Second,
    WriteTimeout: 60 * time.Second,
    Handler:      router,
}

Устанавливает время ожидания для ответов.Мы обнаружили, что слово «localhost» не сопоставляется с IP-адресом хоста.Изменение на следующее исправило проблему:

    serv := &http.Server{
        Addr:         "0.0.0.0" + port,
        ReadTimeout:  60 * time.Second,
        WriteTimeout: 60 * time.Second,
        Handler:      router,
    }

Теперь я могу получить доступ к серверу снаружи хоста.

0 голосов
/ 25 сентября 2018

Убедитесь, что контейнер связывает порт с портом хоста.В документации Container Network вы можете прочитать следующее:

По умолчанию при создании контейнера он не публикует свои порты во внешнем мире.Чтобы сделать порт доступным для служб вне Docker или для контейнеров Docker, которые не подключены к сети контейнера, используйте флаг --publish или -p.Это создает правило брандмауэра, которое сопоставляет порт контейнера с портом на хосте Docker.Вот несколько примеров.

Вы можете попробовать запустить свой контейнер с флагом -p, описанным выше:

docker run -p 0.0.0.0:8080:80 your-container-image
...