簡體   English   中英

警告:mysqli::__construct(): (HY000/2002): 連接被拒絕

[英]Warning: mysqli::__construct(): (HY000/2002): Connection refused

他們是docker的新手。獲取phpmyadmin、php,家庭助理工作。 但是我無法很好地配置 docker 以能夠從 php 連接到數據庫。 能幫我看看是什么問題嗎。

我嘗試了一切。 我讀了很多有同樣錯誤的帖子,但無法讓它工作。

非常感謝你

這是我修改的 docker-compose

version: '3.4'
services:
  web:
    build:
      context: ./php
      dockerfile: Dockerfile
    container_name: php73
    depends_on:
      - db
    volumes:
      - ./php:/var/www/html/
    environment:
      MYSQL_HOST: mysql8
      MYSQL_USER: pf
      MYSQL_PASSWWORD: 123456
      MYSQL_DB: ha
    ports:
      - 3001:80
  db:
    container_name: mysql8
    image: mysql:8.0
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_USER: pf
      MYSQL_PASSWWORD: 123456
      MYSQL_DATABASE: ha
    volumes: 
      - /var/lib/mysql
    ports:
      - 6033:3306

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: phpmyadmin
    depends_on: 
      - db
    restart: always
    ports:
      - 8080:80
    environment:
      PMA_ARBITRARY: 1
      PMA_HOST: db
      PMA_PORT: 3306
      MYSQL_USER: pf
      MYSQL_PASSWWORD: 123456
      MYSQL_ROOT_PASSWORD: 123456
    volumes:
      - /sessions

新的 php 示例

<?php
  $host = 'db';
  $user = 'pf';
  $password = '123456';
  $db = 'ha';

  $conn = new mysqli($host,$user,$password,$db,3306);
  if($conn->connect_error) {
    echo 'connection failed' . $conn->connect_error; 
  } 
  echo 'Sucessfully connected msql';
?>

Dockerfile


FROM php:7.3.3-apache
RUN apt-get update && apt-get upgrade -y
RUN docker-php-ext-install mysqli
EXPOSE 80

我的 docker-compose

version: '3.3'
services:
  web:
    build:
      context: ./php
      dockerfile: Dockerfile
    container_name: php73
    depends_on:
      - db
    volumes:
      - ./php:/var/www/html/
    ports:
      - 80:80
  db:
    container_name: mysql8
    image: mysql:8.0
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: mediciones
      MYSQL_USER: root
      MYSQL_PASSWWORD: root
    ports:
      - 6033:3306

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: phpmyadmin
    depends_on: 
      - db
    restart: always
    ports:
      - 8080:80
    environment:
      PMA_ARBITRARY: 1
      PMA_HOST: db
      MYSQL_ROOT_PASSWORT: root

  homeassistant:
    container_name: homeassistant
    restart: unless-stopped
    image: homeassistant/home-assistant
    devices:
      - /dev/ttyUSB0:/dev/ttyUSB0
      - /dev/ttyUSB1:/dev/ttyUSB1
      - /dev/ttyACM0:/dev/ttyACM0
    volumes:
      - ${USERDIR}/docker/homeassistant:/config
      - /etc/localtime:/etc/localtime:ro
      - ${USERDIR}/docker/shared:/shared
      - /dev/serial/by-id/:/dev/serial/by-id/
    network_mode: host
    privileged: true
   

我的 php 示例

<?php
  $host = '127.0.0.1';
  $user = 'root';
  $password = 'root';
  $db = 'ha';

  $conn = new mysqli($host,$user,$password,$db);
  if($conn->connect_error) {
    echo 'connection failed' . $conn->connect_error; 
  } 
  echo 'Sucessfully connected msql';
?>

您在主機端口上公開mysql6033

你試過了嗎:

$conn = new mysqli($host,$user,$password,$db,6033);

假設您的示例代碼在 php 容器中運行:

在這種情況下,使用db作為主機名,使用mediciones作為連接中的數據庫名稱。

對於數據庫容器:

  • MYSQL_USER設置為非 root,因為這會導致潛在的錯誤。 該用戶已獲得MYSQL_DATABASE的訪問權限。
  • 為 /var/lib/mysql 使用持久卷
  • (可選),如果您的家庭助理或 php 沒有創建表,您可以使用 [mysql "Initializing a fresh instance"] https://hub.docker.com/_/mysql ) 來初始化一些表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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