Docker -compose: подключиться к базе данных, используя localhost & mysql в качестве имени хоста - PullRequest
0 голосов
/ 11 марта 2020

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

У меня есть файл конфигурации, в котором я использовал 127.0.0.1 в качестве MySQL имени хоста, поскольку веб-приложение работает на том же хосте, что и MariaDB .

Изначально я пытался связать свой контейнер в моем docker -компонентном файле с помощью 'links' (ниже приведен фрагмент моей настройки docker -compose в данный момент)

    mariadb:
      image: mariadb:5.5
    php-fpm:
      build: docker/php-fpm
      links:
        - "mariadb:mysql"

На этом этапе MariaDB была доступна путем установки mysql в качестве имени хоста в моем файле конфигурации вместо 127.0.0.1. Тем не менее, я хотел сохранить 127.0.0.1.

После небольшого копания я нашел это сообщение в блоге , где объясняется, как настроить контейнеры, чтобы к нему можно было добраться через localhost или 127.0.0.1

Это работает, как я и ожидал, но у него есть недостаток.

Без Docker я могу запускать PHP сценарии, которые использовать основные модули magento, загружая его. Но с Docker и настройкой поста в блоге я больше не могу это делать, поскольку Magento странно ожидает имя хоста БД с именем "mysql".

Есть ли в любом случае docker - сделать так, чтобы контейнер был доступен с localhost и именем хоста?

без Docker, если я установлю MariaDB на своем хост-компьютере, я смогу подключиться к его экземпляру через 127.0.0.1:3306 или mysql://. Я хочу получить похожее поведение.

Ответы [ 2 ]

0 голосов
/ 11 марта 2020

Как сказал @ Сай Кумар , вы можете подключить контейнеры docker к сети host и затем использовать localhost для доступа к сервисам. Но проблема в том, что порт будет зарезервирован этим контейнером и не будет доступен до тех пор, пока он не будет удален.

Но из вашего вопроса мое предложение привлекло следующее предложение

Без Docker, я могу запустить PHP скрипты, которые используют модули ядра magento, загружая его. Но с Docker и настройкой поста в блоге я больше не могу этого делать, поскольку Magento странно ожидает имя хоста БД с именем "mysql"

Так что, если я правильно понимаю, Magento ожидает подключения к MySQL с mysql в качестве имени хоста вместо localhost. Если это так, это может быть легко решено.

Как?

Итак, в docker существует концепция, называемая обнаружением службы. Я объяснил то же самое во многих моих ответах. По сути, он разрешает IP-адреса контейнеров по имени хоста / псевдонимом контейнера. Так что вместо соединения между контейнерами с использованием IP-адреса вы можете подключаться между ними с помощью их имени хоста, так что даже если контейнер перезапускается (что приводит к изменению IP), Docker позаботится о разрешении его в соответствующий контейнер.

Работает только с пользовательскими сетями. Поэтому вы можете создать мостовую сеть и подключить к ней и Magento, и Mysql. и укажите container_name как mysql для mysql, или вы также можете использовать псевдоним, как упомянуто здесь . Так что все вместе, пример docker compose будет

version: '3'
services:
  mariadb:
    image: mariadb:5.5
    container_name: mysql #This can also be used but I always prefer using aliases
    networks:
      test:
        aliases:
          - mysql #Any container connected to test network can access this simply by using mysql as hostname   
  php-fpm:
    build: docker/php-fpm
    networks:
      test:
        aliases:
          - php-fpm
networks:
  test:
    external: true

Больше ссылок
1. Сеть в Compose .
2. Docker Сеть .

0 голосов
/ 11 марта 2020

Да, вы можете подключиться через вашу базу данных к localhost или 127.0.0.1. Но это возможно только при создании docker -композитной сети в режиме host . Но когда вы устанавливаете свою docker сеть в режиме host , концепция контейнеров не будет работать. Поэтому вам нужно выбрать хост или мост сетевой режим

Вы можете найти сеть в docker -compose

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