docker создает соединение контейнера mongodb с контейнером js узла - PullRequest
0 голосов
/ 21 ноября 2018

у меня работает контейнер sharelatex.Этот файл docker compose содержит контейнер mongo и redis.

Вот докер sharelatex compose :

version: '2'
services:
    sharelatex:
        restart: always
        image: rigon/sharelatex-full
        #image: sharelatex/sharelatex
        container_name: sharelatex
        networks:
            - test-network
        depends_on:
            - mongo
            - redis
        privileged: true
        links:
            - mongo
            - redis
        volumes:
            - ./sharelatex_data:/var/lib/sharelatex
            - /var/run/docker.sock:/var/run/docker.sock
        environment:
            SHARELATEX_MONGO_URL: mongodb://mongo/sharelatex
            SHARELATEX_REDIS_HOST: redis
            SHARELATEX_APP_NAME: ShareLaTeX
            SHARELATEX_SITE_URL: https://latex.tkwant.de

   mongo:
        restart: always
        image: mongo
        container_name: mongo

        expose:
           - 27017
        volumes:
            - ./mongo_data:/data/db
        networks:
            - test-network
    redis:
        restart: always
        image: redis
        container_name: redis

        networks:
            - test-network
        expose:
            - 6379
        volumes:
            - ./redis_data:/data

networks:
    test-network:
      external: true

Я хочу создать приложение для узла, для которого требуется mongodb,тоже.Как я могу соединить эти два контейнера?Я прочитал о сети и опробовал сеть докеров, но безуспешно.

Это мой узел докера, который составляет :

version: '3.5'
services:
  app:
    container_name: app
    restart: always
    build: .
    ports:
      - '3001:3000'
    networks:
      - test-network
networks:
    test-network:
      driver: external

и вот мой index.js:

// Connect to MongoDB
mongoose
  .connect(
    'mongodb://mongo:27017/test2',
    { useNewUrlParser: true }
  )
  .then(() => console.log('MongoDB Connected'))
  .catch(err => console.log("errorErrorError"));

Я открыт для всех ответов ... запускаю монго в собственном контейнере или создаю сеть докеров.Но я не знаю, что лучше или проще.

Обновление 1:

Первая проблема: Sharelatex больше не работает -> sharelatex теперь в другой сети.Мой обратный прокси-сервер nginx больше не находит контейнер sharelatex.Вторая проблема: когда я хочу запустить Docker узла, я получаю эту ошибку (не знаю почему, но он хочет создать новую сеть): Создание сети "dockernodemongo_test-network" с драйвером "external" ОШИБКА: плагин "external" не найден

Ответы [ 3 ]

0 голосов
/ 24 ноября 2018

Вы можете попробовать что-то вроде этого.

Создайте сеть докеров следующим образом.

docker network create <NETWORK_NAME>

В вашем доклере sharelatex создайте , вы можете добавить эту сеть (test-network - это имя сети) вот так

services:
    mongo:
        restart: always
        image: mongo
        container_name: mongo
        networks:
           - test-network
        expose:
           - 27017
        volumes:
            - ./mongo_data:/data/db

networks:
    test-network:
      external: true

Аналогично, вы можете сделать то же самое (использовать то же имя сети) в файле docker compose для вашего приложения узла.

Когда оба контейнера находятся в одной сети, вы можете использовать имя контейнера в качестве имени хоста для подключения к нему.

Кроме того, вы можете проверить, работают ли контейнеры в одной сети, с помощью следующей команды

docker network <NETWORK_NAME> inspect

PS

  1. Вы должны использовать переменные окружения, чтобы передать имя хоста mongo и порт вашему приложению узла
  2. Вы можете поставитьприложение вашего узла в том же файле docker-compose, что и sharelatex.Но это совсем другое обсуждение
0 голосов
/ 29 ноября 2018

Хорошо, похоже, вы указываете пользовательскую сеть в обоих случаях, но на самом деле вы не называете их.Титульная тестовая сеть может использоваться только для ссылки на нее из этого же файла.

networks:
  test-network:
    external: true

Это эффективно создаст пользовательскую сеть, но без указания имени создаст имя по умолчанию [projectname] _test-network.Вы эффективно создаете две разные сети с помощью [имя_проекта] _test-network, поэтому он пытается создать сеть "dockernodemongo_test-network".

На вашем узле docker-compose вы можете попробовать:

networks:
  test-network:
    external:
      name: [sharelatexname]_test-network

Это будет эффективно искать ранее существующую сеть с этим именем.В качестве альтернативы вы можете назвать сеть из первого созданного экземпляра, и это избавит вас от попыток выяснить имя.

sharelatex docker-compose:

networks:
  test-network:
    name: test-network
    external: true

узел докера-compose:

networks:
  test-network:
    external:
      name: test-network

Что касается того, почему он не создает сеть узла;"driver:" у вас нет существующего плагина под названием "external", есть несколько встроенных драйверов, которые добавляют ряд возможностей (например, multi-hosting) в вашу сеть, таких как bridge, overlay и macvlan.Вы также можете скачать другие пользовательские плагины.Я не верю, что они вам нужны для того, чего вы пытаетесь достичь.Кроме того, поскольку вы используете только одну сеть, все экземпляры «сетей:» в службах не нужны.Все они будут частью единственной указанной сети.«Network:» будет полезен, если у вас есть несколько сетей в одном и том же docker-compose и вы хотите изолировать / обозначить сети для определенных служб в нем.

0 голосов
/ 21 ноября 2018

Вы можете попробовать это.

version: '2'
services:
    mongo: // declare first
        restart: always
        image: mongo
        container_name: mongo
        expose:
           - 27017
        volumes:
            - ./mongo_data:/data/db

    redis: // declare first
        restart: always
        image: redis
        container_name: redis
        expose:
            - 6379
        volumes:
            - ./redis_data:/data

    sharelatex:
        restart: always
        image: rigon/sharelatex-full
        #image: sharelatex/sharelatex
        container_name: sharelatex
        depends_on:
            - mongo
            - redis
        privileged: true
        links:
            - mongo:mongo // added :mongo
            - redis:redis // added :redis
        volumes:
            - ./sharelatex_data:/var/lib/sharelatex
            - /var/run/docker.sock:/var/run/docker.sock
        environment:
            SHARELATEX_MONGO_URL: mongodb://mongo/sharelatex
            SHARELATEX_REDIS_HOST: redis
            SHARELATEX_APP_NAME: ShareLaTeX
            SHARELATEX_SITE_URL: https://latex.tkwant.de

Если вы объявите mongo и redis после того, как попробуете с ними связаться, докер не узнает, что он существует.

Источник: https://docs.docker.com/compose/compose-file/#links

Обратите внимание , что официальные документы утверждают, что: флаг --link является устаревшей функцией Docker.Это может в конечном итоге быть удалено.Если вам абсолютно не нужно продолжать его использование, мы рекомендуем использовать пользовательские сети для облегчения связи между двумя контейнерами вместо использования --link.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...