source

도커가 PHP로 mariadb에 연결할 수 없습니다.

lovecheck 2023. 1. 2. 22:42
반응형

도커가 PHP로 mariadb에 연결할 수 없습니다.

Docker는 처음이라 PHP를 사용하여 MariaDB 컨테이너에 연결하는 방법을 찾고 있지만 성공하지 못했습니다.

stackoverflow와 google에서 검색해 보았지만, 도움이 되는 정보를 찾을 수 없었기 때문에, 도움이 되었으면 합니다.

이상한 점은 JetBrains DataGrip에서 localhost, mysql, root, admin을 사용하여 MariaDB에 연결하려고 하면 데이터베이스에는 연결할 수 있지만 PDO에는 연결할 수 없다는 것입니다.

시간 내주셔서 정말 감사합니다

다음은 프로젝트 파일입니다.

이것은 저의 docker-compose.yml 파일입니다.

version: "3.1"
services:

  nginx:
    image: nginx:alpine
    container_name: nginx
    volumes:
      - ./config/nginx/nginx.conf:/etc/nginx/conf.d/default.conf
    ports:
      - "80:80"
    links:
       - php

  php:
    image: php:7.1-fpm
    container_name: php
    links:
      - mariadb:mysql
    volumes:
      - ./public:/public
    ports:
      - "9000:9000"

  mariadb:
    image: mariadb:10.1
    container_name: database
    environment:
      MYSQL_ROOT_PASSWORD: admin
    ports:
      - "3306:3306"

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: phpmyadmin
    links:
      - mariadb
    ports:
      - 8183:80
    environment:
      PMA_HOST: mariadb
      PMA_USER: root
      PMA_PASSWORD: admin
      PMA_ARBITRARY: 1

nginx.conf 파일:

server {
    listen 80 default;

    client_max_body_size 108M;

    access_log /var/log/nginx/application.access.log;


    root /public;
    index index.php;

    if (!-e $request_filename) {
        rewrite ^.*$ /index.php last;
    }

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PHP_VALUE "error_log=/var/log/nginx/application_php_errors.log";
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
        include fastcgi_params;
    }

}

그리고 내 index.php 파일은

<?php

    $servername = "localhost";
    $username = "root";
    $password = "admin";
    $database = "mysql";

    try {
        $conn = new PDO("sqlite:host=".$servername.";dbname=" . $database, $username, $password);
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        $sql = $conn->prepare("SELECT * FROM testDB");
        $sql->execute();

        while($result = $sql->fetch(PDO::FETCH_ASSOC)){
            $result['myTestData'];
        }

    }
    catch(PDOException $e) {
        echo "Connection failed: " . $e->getMessage();
    }

?>

이는 호스트 이름을 사용하여 데이터베이스 서버에 접속하려고 하기 때문입니다.localhostphp 컨테이너에서 php 컨테이너로 해결됩니다(와 동일).127.0.0.1).

변경하셔야 합니다.$servernamecompose 파일의 mariadb 서비스 이름과 동일한 변수입니다."mariadb".

이 경우 단일 기본 네트워크에 있는 모든 컨테이너는 서비스 이름(특히)으로 해결됩니다. 그렇기 때문에 링크가 필요하지 않습니다. 이 링크는 다소 권장되지 않습니다.

또한 (만일을 위해) DB 컨테이너가 실제로 시작되었고 연결을 수신할 준비가 되었는지 확인하십시오.처음 시작하는 데 시간이 좀 걸려요.

직접 만들어 보세요.Dockerfilemysql ext를 설치합니다.도커 구성 yml은 따로 둡니다.

FROM php:7.1-fpm

RUN docker-php-ext-install pdo pdo_mysql

docker-timeout.yml:

 php:
    build: .
    container_name: php
    links:
      - mariadb:mysql
    volumes:
      - ./public:/public
    ports:
      - "9000:9000"

언급URL : https://stackoverflow.com/questions/46508038/docker-cant-connect-to-mariadb-with-php

반응형