在某些情况下,PHP无法解析mysql容器名称
我有一个遗留的PHP应用程序。它使用mysqli来制作mysql的东西。所以在配置中,我有DSN字符串来连接mysql服务。那样在某些情况下,PHP无法解析mysql容器名称,mysql,docker,hostname,Mysql,Docker,Hostname,我有一个遗留的PHP应用程序。它使用mysqli来制作mysql的东西。所以在配置中,我有DSN字符串来连接mysql服务。那样 mysql://username:password@db_主机名/dbname Mysqli返回错误 警告:mysqli::real\u connect():php\u network\u getaddresses:getaddrinfo失败:名称或服务未知 但是如果我用这个手动连接 mysqli::real\u connect(“db\u主机名”) 警告:mysql
mysql://username:password@db_主机名/dbname
Mysqli返回错误
警告:mysqli::real\u connect():php\u network\u getaddresses:getaddrinfo失败:名称或服务未知
但是如果我用这个手动连接
mysqli::real\u connect(“db\u主机名”)
警告:mysqli::real_connect():(HY000/1045):用户@'172.21.0.3的访问被拒绝(使用密码:否)
real\u connect(“user@db_hostname“
,real\u connect(“mysql:db\u hostname”)
,real\u connect(“mysql:host=db\u hostname”)
无法解析主机地址
我做错了什么
docker-compose.yml:
version: "3"
services:
nginx:
image: nginx:1.13-alpine
volumes:
- ./docker/nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro
- ./docker/nginx/errors.log:/var/logs/errors.log
- ./docker/nginx/access.log:/var/logs/access.log
- ./:/var/www/html
ports:
- "8081:80"
command: nginx -g "daemon off;"
php:
build:
context: ./docker/
dockerfile: php.Dockerfile
user: "1000"
volumes:
- ./docker/timezone.php.ini:/usr/local/etc/php/conf.d/timezone.php.ini:ro
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
- ./:/var/www/html
db_hostname:
image: mysql:5.5
user: "1000"
environment:
- MYSQL_DATABASE=db
- MYSQL_ROOT_PASSWORD=root
- MYSQL_USER=user
- MYSQL_PASSWORD=user
volumes:
- ./docker/mysql:/var/lib/mysql
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
由于缺少链接,您需要使用php创建db容器。当您将db与PHP链接时,可以从PHP的localhost访问它 这是我修改您的docker compose文件,因为我喜欢alpine everywhere;)。我使用adminer和linkwithdb来验证连接,而不是代码级检查。因为我没有php docker文件,所以我创建了包含php7的php:alpine
version: "3"
services:
nginx:
image: nginx:1.13-alpine
container_name: nginx
ports:
- "8081:80"
command: nginx -g "daemon off;"
db:
image: mysql:5.5
environment:
MYSQL_ROOT_PASSWORD: example
php:
image: php:alpine
container_name: php
tty: true
links:
- db
adminer:
image: adminer
container_name: adminer
ports:
- 8080:8080
links:
- db
然后我在php容器中安装了mysqli
docker exec -it php ash
并在命令下运行
docker-php-ext-install mysqli;
然后创建test.php
这里的服务器名是db。注意,您的服务器名将是指向php的db容器名。
如果您在php容器中ping db,它将ping db容器
<?php
$servername = "db";
$username = "root";
$password = "example";
// Create connection
$conn = new mysqli($servername, $username, $password);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
echo "Connected successfully";
?>
这里是adminer,它也与db链接
因为缺少链接使用php连接db容器。当您将db与PHP链接时,可以从PHP的localhost访问它 这是我修改您的docker compose文件,因为我喜欢alpine everywhere;)。我使用adminer和linkwithdb来验证连接,而不是代码级检查。因为我没有php docker文件,所以我创建了包含php7的php:alpine
version: "3"
services:
nginx:
image: nginx:1.13-alpine
container_name: nginx
ports:
- "8081:80"
command: nginx -g "daemon off;"
db:
image: mysql:5.5
environment:
MYSQL_ROOT_PASSWORD: example
php:
image: php:alpine
container_name: php
tty: true
links:
- db
adminer:
image: adminer
container_name: adminer
ports:
- 8080:8080
links:
- db
然后我在php容器中安装了mysqli
docker exec -it php ash
并在命令下运行
docker-php-ext-install mysqli;
然后创建test.php
这里的服务器名是db。注意,您的服务器名将是指向php的db容器名。
如果您在php容器中ping db,它将ping db容器
<?php
$servername = "db";
$username = "root";
$password = "example";
// Create connection
$conn = new mysqli($servername, $username, $password);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
echo "Connected successfully";
?>
这里是adminer,它也与db链接
docker compose rm-v使用并删除MySQL卷 卷数:
/docker/mysql:/var/lib/mysql->pathmysql
/etc/timezone:/etc/timezone:ro
/etc/localtime:/etc/localtime:ro
docker编写rm-v
使用并删除MySQL卷
卷数:
/docker/mysql:/var/lib/mysql->pathmysql
/etc/timezone:/etc/timezone:ro
/etc/localtime:/etc/localtime:ro
mysq://user:pass@主机/dbname
。但在docker容器中,它无法解析主机,但可以使用gethostbyname
访问主机。使用DSN无法解决此问题,为什么?是否使用docker-compose.yml配置文件?你能提供吗?@Chrysovalantis Koutsoumpos addedHost地址看起来不错。我认为你不知何故没有传递密码。查看mysqli::real\u connect文档,我发现您必须像real\u connect::real\u connect('db\u hostname','user','user','db')这样连接您尝试过吗?还可以尝试使用根凭据。您是否尝试从应用程序外部访问它,从SequelPro访问fe?并尝试在db_主机名服务中公开端口。端口:-“3306:3306”在dev和prod服务器上,它仅与DSN连接字符串一起工作。就像这个-mysq://user:pass@主机/dbname
。但在docker容器中,它无法解析主机,但可以使用gethostbyname
访问主机。使用DSN是无法解决的,为什么?非常感谢你。。。我花了两天的时间试图解决这个问题,但最终,你的答案奏效了。非常感谢你。。。我花了两天时间想弄明白这个问题,但最后,你的答案奏效了。