source

PHP PDO를 사용하여 도커와 함께 실행되는 로컬 MariaDB에 연결할 수 없습니다.

itover 2023. 1. 25. 08:32
반응형

PHP PDO를 사용하여 도커와 함께 실행되는 로컬 MariaDB에 연결할 수 없습니다.

로컬 개발을 위해 MariaDB, PHP-FPM 및 Nginx를 사용하는 로컬 Docker 컴포넌트 스택을 머신 상에서 실행하고 있습니다.브라우저에서 http://localhost:8080/의 Nginx에서 제공하는 웹 페이지에 정상적으로 액세스할 수 있습니다.호스트 127.0.0.1 포트 8889에서 로컬 GUI DB 브라우저인 TablePlus를 사용하여 데이터베이스에 성공적으로 연결할 수도 있습니다.사용자와 함께 동작합니다.root및 패스워드root(다만 이상하게도 Docker compose에서 MYSQL_USER, MYSQL_PASSWORD env 변수로서 설정된 다른 사용자에게는 충분하지 않습니다).

어쨌든, 다음의 PHP 코드를 사용해 PHP/PDO에 접속하려고 하면, 같은 credential이 됩니다.

$db = new PDO('mysql:host=localhost;port=8889;dbname=words', 'root', 'root');

...알겠습니다.Error: SQLSTATE[HY000] [2002] No such file or directory

편집: 및 사용 시:

$db = new PDO('mysql:host=127.0.0.1;port=8889;dbname=words', 'root', 'root');

...알겠습니다.Error: SQLSTATE[HY000] [2002] Connection refused

왜요?

(다음은 Docker 컴파일입니다.

version: "3"

services:

  mariadb:
    image: mariadb:10.5
    container_name: mariadb-10.5
    restart: unless-stopped
    ports:
      # port 3306 is the default port for mariadb, forwarded to 8889 on the local machine
      - 8889:3306
    volumes:
      - ./mysql:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - MYSQL_USER=${MYSQL_USER}
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}

  php-fpm:
    image: bitnami/php-fpm:7.4
    container_name: phpfpm-7.4
    restart: unless-stopped
    ports:
      - 9000:9000
    volumes:
      - ${WWW_DOCUMENT_ROOT}:/app

  nginx:
    image: bitnami/nginx:1.20
    container_name: nginx-1.20
    restart: always
    ports:
      - 8080:8080
    volumes:
      - ./nginx/logs:/opt/bitnami/nginx/logs/
      - ./nginx/server-blocks/default.conf:/opt/bitnami/nginx/conf/server_blocks/default.conf:ro
      - ${WWW_DOCUMENT_ROOT}:/app
    depends_on:
      - mariadb
      - php-fpm

)

@danblack의 답변에 따르면 DB에 대한 연결은 Docker 컨테이너 내부에서 다른 컨테이너로 이루어지므로 다음과 같습니다.

  1. 컨테이너 간의 연결은 항상 재매핑되지 않은 포트를 사용합니다.따라서 DB 컨테이너에 연결하려면 재매핑된 노출된 8889 포트가 아닌 내부 MariaDB 표준 포트 3306을 사용해야 합니다.

  2. DB의 호스트 이름은 DB 컨테이너 이름이어야 합니다(이 경우 MariaDB 컨테이너 이름).mariadb-10.5)가 아닙니다.127.0.0.1또는localhost.

따라서 모든 PHP/PDO 연결 개체는 다음과 같습니다.

$db = new PDO('mysql:host=mariadb-10.5;dbname=words', 'root', 'root');

언급URL : https://stackoverflow.com/questions/71230710/cant-connect-to-local-mariadb-running-with-docker-with-php-pdo

반응형