我有一个获取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
我可能缺少什么?
答案 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将创建一个默认网络,两个容器都连接到该默认网络。
希望这会有所帮助!