shinozaki0815
@shinozaki0815

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

DB接続ができません

Q&A

解決したいこと

DB接続ができずDBにデータをアップロードできません

該当するソースコード

public static function getConnection()
    {
        // データベース接続処理する        
        $mysqli = new mysqli('localhost','root','pass','keijiban_db');
        if($mysqli->connect_error){
            echo $mysqli->connect_error;
            exit();
        } else {
            $mysqli->set_charset("utf8");
     }
     return $mysqli;
    }


docker.compose.yml


    services:
    keijiban_application:
        build: ./docker/php
        container_name: "keijiban_application"
        ports:
            - "8080:80"
        volumes:
            - ./application/docroot:/var/www/html
            - ./application/private:/var/www/private
            - ./docker/php/php.ini:/usr/local/etc/php/conf.d/docker.ini
            - ./docker/php/php-fpm.conf:/etc/php-fpm.d/docker.conf
        
        
    keijiban_db:
        build: 
            context: ./docker/php
            dockerfile: Dockerfile
        platform: linux/x86_64
        image: mysql:5.7
        container_name: "keijiban_db"
        environment:
            MYSQL_DATABASE: "keijiban_db"
            MYSQL_USER: "root"
            MYSQL_PASSWORD: "pass"
            MYSQL_ROOT_PASSWORD: "pass"

        ports:
                - "3306:3306"
        volumes:
            - ./docker/mysql/data:/var/lib/mysql
            - ./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
            - ./docker/mysql/initdb.d:/docker-entrypoint-initdb.d   


0

3Answer

ホスト名にはデータベースのコンテナ名を指定するらしいので、下記のようにしたらつながると思います。

- new mysqli('localhost','root','pass','keijiban_db');
+ new mysqli('keijiban_db','root','pass','keijiban_db');
1Like

Comments

  1. @shinozaki0815

    Questioner

    スクリーンショット 2024-07-11 16.03.59.png
    スクリーンショット 2024-07-11 16.04.20.pngこのようなエラーになってしまうのですが、どうすればよろしいでしょうか?

  2. 一様念のため docker-compose ps でDB立ち上がってるか確認してみてください。

compose.yml の中で、keijiban_db サービスの所に build を書いてしまっているのが問題かと思います。

contextを見ると、keijiban_application と同じものを指しているように見えますので、アプリケーション側と同じ内容のイメージを mysql:5.7 という名前で作ってしまっているのではないでしょうか。
起動確認の結果で、db側コンテナでも 80/tcp が表示されていることが上記の推測を裏付けているかと思います。(mysql DBコンテナがポート80でlistenしているはずがないので)

おそらく利用したいのは DockerHub で公開されている mysql イメージなのだろうとおもいます。
なので、

  • まずローカルに作ってしまった mysql:5.7 を削除する
    • docker rmi mysql:5.7
  • compose.yml の keijiban_db にある build: のセクションを削除する。
    • なにか明確な理由がない限り platform: も不要なので削除してよいと思います。

その後、再度試してみてください。

1Like

すでにcompose.ymlに関する指摘があるので、別の方向で回答します。

mysqlイメージは初回の起動に時間がかかります。docker compose up-dオプションを付けるとバックグランドで実行されてログが出てこないので、オプション無しで起動して確認することをお勧めします。

また、接続確認の方法としては複数の方法で試してみることをお勧めします。例えばphpMyAdminやMySQL workbenchなどのクライアントツールを使ったり、mysqlコマンドを使うなどです。
他の接続方法を試すことで、PHPのコードに問題があるのかMySQLに問題があるのかを判断する材料になります。

0Like

Your answer might help someone💌