[英]PHP can not resolve mysql container name under certain circumstances
我有舊版PHP應用程序。 它使用mysqli制作mysql東西。 所以在配置中,我有DSN字符串連接到mysql服務。 像那樣
mysql://username:password@db_hostname/dbname
Mysqli返回錯誤
警告:mysqli :: real_connect():php_network_getaddresses:getaddrinfo失敗:名稱或服務未知
但是如果我嘗試使用這個手動連接
mysqli::real_connect("db_hostname")
它顯示警告:mysqli :: real_connect():(HY000 / 1045):用戶'@'172.21.0.3'的訪問被拒絕(使用密碼:NO)
real_connect("user@db_hostname")
, real_connect("mysql:db_hostname")
, real_connect("mysql:host=db_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
由於您缺少將您的db容器與php 鏈接的鏈接 。 當您將db與PHP鏈接時,可以從PHP的localhost訪問它。
這是我修改了您的docker-compose文件,因為我到處都喜歡阿爾卑斯山;)。 而且我使用管理員並與db鏈接以驗證連接,而不是代碼級檢查。 由於我沒有您的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的數據庫容器名稱。 如果您在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";
?>
現在在php容器中運行此文件。 您可以掛載並運行您的php代碼,但這是我所做的測試。 我嘗試以root用戶身份登錄。
php -f test.php
這是管理員,它也與數據庫鏈接
docker-compose rm -v
使用和刪除MySQL卷。
卷數:
./docker/mysql:/var/lib/mysql -> pathmysql
/etc/timezone:/etc/timezone:ro
/etc/localtime:/etc/localtime:ro
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.