使用Docker将php 5.5与dblib连接到MSSQL

时间:2019-04-17 18:51:26

标签: php sql-server docker

我有一个获取php5.5映像的Dockerfile,然后安装了两个扩展(freetds-dev sendmail libpng-dev zlib1g-dev unixodbc tdsodbc nano)。然后添加一个freetds.conf和一个apache-default conf。

然后我有一个docker-composer.yml,它可以构建dockerfile,但也可以完成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 个答案:

答案 0 :(得分:1)

问题出在网络上。仅使用链接无效。因此,我使用docker network create simple-network创建了一个新网络,然后将两个容器都添加到了该网络。然后,我运行docker inspect network simple-network来获取我的MSSQL数据库的IP。所以我获得了IP,并将其用作主机。

我认为您可以通过docker-composer中的网络来做到这一点,这可能会更好。

答案 1 :(得分:0)

问题有两个:
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的{​​{1}}地址上进行监听。
2.将您的连接字符串更改为: 1433$dsn = "dblib:host=mssql:1433;dbname=table;";主机名将通过Docker网络解析为正确的容器IP。

由于您没有明确定义网络,所以docker-compose将创建一个默认网络,两个容器都连接到该默认网络。

希望这会有所帮助!

相关问题