Невозможно подключиться из одного контейнера к другому - PullRequest
0 голосов
/ 01 августа 2020

У меня настроены файлы Dockerfile и docker -compose.yml, но я не уверен, верны ли они, и не могу запустить его без ошибки.

Мой файл Dockerfile:

FROM golang:1.14-alpine
RUN mkdir /app
ADD . /app
WORKDIR /app
RUN go get
RUN go run server.go

а мой compose.yml:

version: "3.5"

services:
  elasticsearch:
    container_name: "elasticsearch"
    image: docker.elastic.co/elasticsearch/elasticsearch:7.8.0
    ports:
      - 9200:9200
  gqlgen:
    container_name: "gqlgen"
    build: ./
    restart: "on-failure"
    ports:
      - "8080:8080"
    depends_on:
      - elasticsearch

Вот как root моей папки выглядит:

введите описание изображения здесь

Я попытался запустить: docker-compose up из каталога root, и вот что я получил:

panic: Get "http://127.0.0.1:9200/": dial tcp 127.0.0.1:9200: connect: connection refused

Думаю, я неправильно настроил.

ОБНОВЛЕНИЕ:

Основываясь на предложениях и других материалах, которые я читал в Интернете, я изменил свой ДОКЕРФИЛЬ на:

FROM golang:1.14-alpine
RUN mkdir /app
ADD . /app
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go build -o server .
CMD ["./server"]

и создал файл:

version: "3.5"

services:
  elasticsearch:
    container_name: "elasticsearch"
    image: docker.elastic.co/elasticsearch/elasticsearch:7.8.0
    environment:
      - node.name=elasticsearch
      - cluster.name=es-docker-cluster
      - bootstrap.memory_lock=true
      - cluster.initial_master_nodes=elasticsearch
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - 9200:9200
  golang:
    container_name: "golang"
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8080:8080"
    restart: unless-stopped
    depends_on:
      - elasticsearch

и теперь он строится правильно.

Но та же проблема с запуском docker-compose up.

panic: Get "http://elasticsearch:9200/": dial tcp 172.18.0.2:9200: connect: connection refused

Ответы [ 2 ]

1 голос
/ 01 августа 2020

У вас проблема из-за неправильного адресации Elasticsearch.

Внутри docker контейнера 127.0.0.1 относится к самому контейнеру, поэтому ваше приложение пытается найти Elasticsearch там, где его нет.

Правильный способ ссылки на один контейнер docker из другого - использовать имя контейнера docker. Итак, в вашем случае это будет использовать имя: elasticsearch.

Изменить: есть еще одна проблема с вашей конфигурацией. Вы упускаете некоторые важные элементы конфигурации Elasticsearch.

Здесь у вас есть фрагмент с минимальной конфигурацией для кластера Elasticsearch с одним узлом.

services:
  elasticsearch:
    container_name: "elasticsearch"
    image: docker.elastic.co/elasticsearch/elasticsearch:7.8.0
    environment:
      - node.name=elasticsearch
      - cluster.name=es-docker-cluster
      - bootstrap.memory_lock=true
      - cluster.initial_master_nodes=elasticsearch
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - 9200:9200

Все, что я написал ранее, остается в силе. После изменения docker - составьте свою последнюю версию, которая относится к Elasticsearch через http://elasticsearch:9200, должна работать нормально.

Изменить:

Как отметил @David Maze, в вашем примере есть третья проблема . Вместо RUN go run server.go должно быть CMD go run server.go. Вы запускаете свое приложение во время сборки, когда хотите запустить приложение внутри контейнера.

Более традиционным подходом было бы создание приложения вместо копирования источника, копирование двоичного файла в контейнер и запускает двоичный файл внутри контейнера. Вот некоторая информация об этом: https://medium.com/travis-on-docker/multi-stage-docker-builds-for-creating-tiny-go-images-e0e1867efe5a

0 голосов
/ 01 августа 2020

Таким образом, указанное выше действие по замене localhost на elasticsearch является правильным. Но это должно происходить только тогда, когда вы запускаете свой docker -compose. Не пытайтесь вызвать elasticsearch из вашей среды IDE, используя elasticearch вместо host. Я предлагаю сделать хост elasticsearch настраиваемым, а для локальной конфигурации сохранить localhost, но вы можете переопределить его в файле docker -compose.

version: "3.5"

services:
  elasticsearch:
    container_name: "elasticsearch"
    image: docker.elastic.co/elasticsearch/elasticsearch:7.8.0
    environment:
      - node.name=elasticsearch
      - cluster.name=es-docker-cluster
      - bootstrap.memory_lock=true
      - cluster.initial_master_nodes=elasticsearch
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - 9200:9200
  golang:
    container_name: "golang"
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8080:8080"
    restart: unless-stopped
    depends_on:
      - elasticsearch
    environment:
      - ELASTICSEARCH_HOST: elasticsearch

Где ELASTICSEARCH_HOST - это переменная, которую вы используете в своем проекте

...