質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • CakePHP

    2308questions

    CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

  • Docker

    701questions

    Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

【Docker】mysqlにcakephpから接続できない

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 389

nnahito

score 1706

 はじめに

どうしてもわからないので質問します。

 現状

DokcerでCakePHP3.6の開発環境を作成しております。
しかし、Docker上で動いているはずのMySQLにCakePHPから接続ができません。
IntelliJのDatabaseアクセス機能、WorkBenchからはアクセスできます。

docker-composeファイル、CakePHPの設定は以下になります。

これは何が間違っているのでしょうか。
ご存知の方がいらっしゃいましたら、ご教示頂けますと幸いです。

 docker-composeファイル

version: '3.5'
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: dev
      MYSQL_USER: user
      MYSQL_PASSWORD: user
    volumes:
      - ./data/mysql/conf.d:/etc/mysql/conf.d
      - mysql-storage:/var/lib/mysql
    ports:
      - "13306:3306"
    container_name: my_database_mysql

  nginx:
    image: nginx:mainline-alpine
    ports:
      - "10080:80"
    volumes:
      - ./data/nginx/conf/conf.d:/etc/nginx/conf.d
      - ./log/nginx:/var/log/nginx
      - ./run:/var/run
      - ./htdocs/myproject:/var/www/html/webroot
    environment:
      TZ: "Asia/Tokyo"
    depends_on:
      - phpfpm

  phpfpm:
    build: ./data/php-fpm/
    image: phpfpm:7.2
    environment:
      TZ: "Asia/Tokyo"
    volumes:
      - ./htdocs/:/var/www/html/
      - ./log/php-fpm:/var/log/php-fpm
    depends_on:
      - db
    ports:
      - 8183:10080

volumes:
  mysql-storage:
    driver: local

 CakePHP

'Datasources' => [
        'default' => [
            'className' => 'Cake\Database\Connection',
            'driver' => 'Cake\Database\Driver\Mysql',
            'persistent' => false,
            'host' => 'db',
            /**
             * CakePHP will use the default DB port based on the driver selected
             * MySQL on MAMP uses port 8889, MAMP users will want to uncomment
             * the following line and set the port accordingly
             */
            'port' => '13306',
            'username' => 'user',
            'password' => 'user',
            'database' => 'dev',
            'encoding' => 'utf8mb4',
            'timezone' => '+9:00',
            'flags' => [],
            'cacheMetadata' => true,
            'log' => false,

            /**
             * Set identifier quoting to true if you are using reserved words or
             * special characters in your table or column names. Enabling this
             * setting will result in queries built using the Query Builder having
             * identifiers quoted when creating SQL. It should be noted that this
             * decreases performance because each query needs to be traversed and
             * manipulated before being executed.
             */
            'quoteIdentifiers' => false,

            /**
             * During development, if using MySQL < 5.6, uncommenting the
             * following line could boost the speed at which schema metadata is
             * fetched from the database. It can also be set directly with the
             * mysql configuration directive 'innodb_stats_on_metadata = 0'
             * which is the recommended value in production environments
             */
            //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'],

            'url' => env('DATABASE_URL', null),
        ],
    ],

もちろん'host' => 'db',部分は、locahostや0.0.0.0、127.0.0.0を試しましたがすべて弾かれました。

 ブラウザ

http://localhost:10080/
にアクセスると「server error 」が表示されます。

 出たログのエラー

CakePHPのエラーです(logs/error.log)

Error: [PDOException] SQLSTATE[HY000] [2002] Connection refused
Request URL: /

 試しに作ってみた素のPHP

$pdo = new PDO('mysql:dbname=dev;host=db;', 'user', 'user');

var_dump($pdo);
die;

object(PDO)[15]

エラーではなさそう。

 参考にしたサイト

https://github.com/laradock/laradock/issues/178
https://github.com/docker-library/php/issues/320
http://www.aipacommander.com/entry/2014/05/20/130000
https://stackoverflow.com/questions/40075065/using-docker-i-get-the-error-sqlstatehy000-2002-no-such-file-or-directory
https://qiita.com/Yorinton/items/202cab1b2187ff478ac5

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • xenbeat

    2018/06/09 23:13

    > Docker上で動いているはずのMySQLにCakePHPから接続ができません → 詳細に説明してください。エラーやどこまでどんな調査したか等

    キャンセル

  • asahina1979

    2018/06/09 23:16

    何度か質問に上がってる内容なんでちゃんと調べてください

    キャンセル

  • nnahito

    2018/06/09 23:22

    追記しました。

    キャンセル

回答 2

0

CakePHPのことは良くわかんないんですが
'url' => env('DATABASE_URL', null)をコメントアウトしたらどうなります?

 追記

そもそもDATABASE_URLって設定されているんでしょうか?
Cakeが

'host' => 'db',
'port' => '13306',
'username' => 'user',
'password' => 'user',
'database' => 'dev',


でつなぎにいくのか、'url' => env('DATABASE_URL', null)でつなぎにいくのかわからないですが、
もし前者でつなぎにいくのであれば
'port' => '13306''port' => '3306'にしてみてください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/10 17:56

    ご回答有り難うございます。

    「'url' => env('DATABASE_URL', null)」をコメントアウトし、
    http://localhost:10080 にアクセスした場合、

    'port' => '3306'に変更し、
    http://localhost:10080 にアクセスした場合、

    ともに「Error: [PDOException] SQLSTATE[HY000] [2002] Connection refused」が表示されます。


    なお、「bin/cake migrations migrate」も実行してみましたが、
    'host' => 'db',のときは「Exception: There was a problem connecting to the database: SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: nodename nor servname provided, or not known」が出たため、

    'host' => 'locahost',
    'host' => '127.0.0.0',
    'host' => '0.0.0.0',
    の場合でマイグレーションを試した時、
    それぞれ
    Exception: There was a problem connecting to the database: SQLSTATE[HY000] [2002] Connection refused
    が表示されました。

    キャンセル

0

PDOで接続時は未指定3306、だがcakephpでは指定13306 なんで接続テストでも何でもないですね。(ほぼ問題はここだと思うが)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/10 17:39

    ご回答有り難うございます。
    確かにそのとおりですね。

    以下のようにして試してみたところ、「SQLSTATE[HY000] [2002] Connection refused 」となりました。

    $pdo = new PDO('mysql:dbname=dev;host=db;port=13306', 'user', 'user');

    var_dump($pdo);
    die;

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • CakePHP

    2308questions

    CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

  • Docker

    701questions

    Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです