ドライバで例外が発生しました:SQLSTATE [HY000] [2002]接続が拒否されました。 - docker - Symfony

ドライバで例外が発生しました:SQLSTATE [HY000] [2002]接続が拒否されました。 - docker - Symfony

私のコード(symfony 5.4)はデータベースにデータを保存できません。これは私の設定です。

docker-compose.yaml

...
#MySQL Service
  db:
    image: mysql:5.7.22
    container_name: db
    restart: unless-stopped
    tty: true
    ports:
      - "3316:3306"
    environment:
      MYSQL_DATABASE: pink
      MYSQL_ROOT_PASSWORD: password
      SERVICE_TAGS: dev
      SERVICE_NAME: mysql
    volumes:
      - dbdata:/var/lib/mysql
      - ./docker/mysql/my.cnf:/etc/mysql/my.cnf
    networks:
      - app-network
...

.env

DATABASE_URL="mysql://root:password@db:3316/pink"

製品コントローラ.php

#[Route('/product/create', name: 'product_create')]
    public function createProduct(ManagerRegistry $doctrine): Response
    {
        $entityManager = $doctrine->getManager();

        $product = new Product();
        $product->setName('Keyboard');
        $product->setPrice(1999);
        $product->setDescription('Ergonomic and stylish!');

        // tell Doctrine you want to (eventually) save the Product (no queries yet)
        $entityManager->persist($product);

        // actually executes the queries (i.e. the INSERT query)
        $entityManager->flush();

        return new Response('Saved new product with id '.$product->getId());

    }

データベース(docker)コンテナが正常に実行されています。以下はテストです。働いた。

mysql --host=127.0.0.1 --user=root --password=password pink --port=3316 --ssl-mode=disabled

私のファイルでは、文字列を上記のdockerコンテナ名に.env変更しました。127.0.0.1db

どんなアイデアがありますか?

答え1

その結果、データベース接続にデフォルトのポート番号(たとえば)を使用する必要があります3306。完全なデータベース文字列は次のとおりです。

DATABASE_URL="mysql://root:password@db:3306/pink"

内部/外部の概念とDockerコンテナのポート番号の可視性についてまだ完全に理解していません。

db:
    ...
    ports:
      - "3316:3306"

答え2

Docrine WSL2を使用して同じ問題が発生し、次の行を追加する必要がありました。/etc/hosts

127.0.0.1 db

.envファイルで次の構成を使用します。

DATABASE_URL="mysql://root:password@db:3306/my_database_name?serverVersion=8.0.3&charset=utf8mb4"

関連情報