Подключение php 5.5 к MSSQL с помощью dblib с помощью Docker - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть Dockerfile, который получает образ php5.5, а затем устанавливает пару расширений (freetds-dev sendmail libpng-dev zlib1g-dev unixodbc tdsodbc nano).Затем добавляет freetds.conf, а также apache-default conf.

Затем у меня есть docker-composer.yml, который создает файл docker, но также принимает выполненный образ microsoft/mssql-server-linux.

Я отключаю MSSQL и могу подключить его через PHPStorm, но не могу подключиться к нему с помощью PHP.

Это моя строка подключения:

$dsn = "dblib:host=127.0.0.1:1433;dbname=table;";
$pdo = new PDO($dsn, "sa", "yourStrong(!)Password", [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
        PDO::ATTR_STRINGIFY_FETCHES => true,
    ]);

Она не будет подключаться, ивыдает ошибку

SQLSTATE[HY000] Unable to connect: Adaptive Server is unavailable or does not exist (severity 9)' in /var/www/html.

Я знаю, что используемые драйверы установлены правильно, потому что я могу найти их при использовании phpinfo();.

Это в моем freetds.conf

[mssql]
    host = 127.0.0.1
    port = 1433
    tds version = 7.0

Это мой docker-compose:

version: "3"
services:
  php:
    container_name: php55
    build: ./php
    links:
      - mssql
    ports:
      - "8086:80"
      - "8089:443"
    volumes:
      - ./www:/var/www/html
  mssql:
    container_name: mssql
    image: microsoft/mssql-server-linux:latest
    ports:
      - "1433:1433"
    environment:
      ACCEPT_EULA: Y
      SA_PASSWORD: yourStrong(!)Password

Чего мне не хватает?

Ответы [ 2 ]

1 голос
/ 18 апреля 2019

Проблема была с сетью.Только использование ссылок не работает.Поэтому я создал новую сеть с docker network create simple-network и добавил в нее оба моих контейнера.Затем я запустил docker inspect network simple-network, чтобы получить IP-адрес моей базы данных MSSQL.Итак, я получил IP и использовал его в качестве хоста.

Я думаю, что вы можете сделать это с помощью сети в docker-composer, что, вероятно, намного лучше.

0 голосов
/ 17 апреля 2019

Проблема двоякая:
1. Ваш контейнер MSSQL прослушивает 127.0.0.1, который представляет собой петлевой интерфейс, доступный только внутри контейнера MSSQL.
2. Ваш php-контейнер пытается подключиться к базе данных на dblib:host=127.0.0.1:1433. Опять же, этот экземпляр интерфейса 127.0.0.1 доступен только внутри контейнера php.

Исправить:
1. Пусть ваша база данных MSSQL прослушивает адрес 0.0.0.0 через порт 1433.
2. Измените строку подключения на: $dsn = "dblib:host=mssql:1433;dbname=table;";. * Имя хоста mssql будет преобразовано в правильный IP-адрес контейнера сетью Docker.

Поскольку сеть явно не определена, docker-compose создаст сеть по умолчанию, к которой подключены оба контейнера.

Надеюсь, это поможет!

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