Соединение между docker контейнерами: зачем ставить шлюз вместо имени контейнера, почему? - PullRequest
0 голосов
/ 30 января 2020

Я тестировал вещи для себя, и у меня возникла проблема: при попытке подключить узел express контейнер (приложение) к контейнеру mon go (база данных), я могу подключиться к mon go из MongoCompose, если я подключиться к localhost:27017, но не могу в контейнер узла express с конфигурационным URL mon goose для подключения базы данных следующим образом 'mongodb://localhost:27017/dbtest'.

Поэтому я смотрю на SO некоторые решения (например, this ) и отвечает на то, что я вижу вместо 'mongodb://localhost:27017/dbtest' Мне нужно написать имя моего контейнера 'mongodb://mymongo:27017/dbtest', но для меня это не сработало, получаю только ошибку ECONNREFUSED.

Контейнеры были в этой же сети находится мой dockerfile и docker -композитный файл.

Dockerfile

#node 8.16.2
FROM node:8.16.2
COPY . /app
WORKDIR /app
RUN npm install
EXPOSE 3000
CMD ["npm","start"]

docker -compose.yaml

version: "3.7"
services:
   db:
    image: mongo
    ports:
        - 27017:27017
    networks:
        - testing
   app:
    build:
        context: .
        dockerfile: Dockerfile
    networks: 
        - testing
networks: 
    testing:

I решено эта проблема, как эта mongodb://172.17.0.1:27017/dbtest, где 172.17.0.1 - это шлюз сети, являющейся контейнерами.

Может кто-нибудь объяснить это поведение, и если это правильный ? Платформа Linux

1 Ответ

0 голосов
/ 30 января 2020

Откуда вы взяли имя mymongo? Вы определили имя службы mongodb как db в вашем файле композиции. Так что используйте строку подключения 'mongodb://db:27017/dbtest'

version: "3.7"
services:
   db:        ---------------> This is the name of your mongo service
    image: mongo
    ports:
        - 27017:27017
    networks:
        - testing
   app:
    build:
        context: .
        dockerfile: Dockerfile
    networks: 
        - testing
networks: 
    testing:
...