簡體   English   中英

PHP在某些情況下無法解析mysql容器名稱

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM