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

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

新規登録して質問してみよう
ただいま回答率
86.12%
docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Docker

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

解決済

Docker上のphpMyAdminにログインしようとすると「mysqli::real_connect():(HY000/2002)」のエラーがでます。

y_programming
hoshi_no_senshi

総合スコア46

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Docker

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

2回答

0リアクション

0クリップ

466閲覧

投稿2022/09/26 08:03

編集2022/09/26 11:33

前提

docker-composeを使い、webという名前のコンテナとdbという名前のコンテナの計2つのコンテナを作成しました。
webコンテナにはPHP、phpMyAdmin、Apacheがはいっています。
dbコンテナには、MySQLがはいっています。
http://localhost:8080/phpmyadmin/ 」 にアクセスすると、正しくエラーなしでphpMyAdminの
ログイン画面が表示されるのですが、ユーザ名とパスワードを入力してログインしようとしても、

  • MySQL サーバにログインできません
  • mysqli::real_connect(): (HY000/2002): No such file or directory

の2つのエラーが表示され、ログインすることができない状態です。
何が原因でログインに失敗したいのかご存じの方がいらっしゃれば教えていただきたいのです!
Dockerのコンテナ起動に使用した各種ファイルの構成は、以下のようになっております。

_ディレクトリ構成図

phpmyadmin_test/  ├ web/  │ ├ conf/  │ │ ├ httpd.conf  │ │ └ phpMyAdmin.conf  │ │  │ └ html/  │   └ index.php  │  ├ docker-compose.yml  ├ Dockerfile_db  └ Dockerfile_web

合計で6つのファイルがありますので、以下にその6ファイルについて内容を記載します。
teratailの1万文字の文字数制限に抵触したため、6つのうち5つしかペーストする事ができませんでした。
「phpmyadmin_test/web/conf/httpd.conf」は記載しておりませんが、必須という場合はほかの手段で定時いたします。

phpmyadmin_test/web/conf/phpMyAdmin.conf

# phpMyAdmin - Web based MySQL browser written in php # # Allows only localhost by default # # But allowing phpMyAdmin to anyone other than localhost should be considered # dangerous unless properly secured by SSL Alias /phpMyAdmin /usr/share/phpMyAdmin Alias /phpmyadmin /usr/share/phpMyAdmin <Directory /usr/share/phpMyAdmin/> AddDefaultCharset UTF-8 <IfModule mod_authz_core.c> # Apache 2.4 <RequireAny> #Require ip 127.0.0.1 #Require ip ::1 Require all granted </RequireAny> </IfModule> <IfModule !mod_authz_core.c> # Apache 2.2 Order Deny,Allow Deny from All Allow from 127.0.0.1 Allow from ::1 </IfModule> </Directory> <Directory /usr/share/phpMyAdmin/setup/> Require local </Directory> # These directories do not require access over HTTP - taken from the original # phpMyAdmin upstream tarball # <Directory /usr/share/phpMyAdmin/libraries/> Require all denied </Directory> <Directory /usr/share/phpMyAdmin/templates/> Require all denied </Directory> <Directory /usr/share/phpMyAdmin/setup/lib/> Require all denied </Directory> <Directory /usr/share/phpMyAdmin/setup/frames/> Require all denied </Directory> # This configuration prevents mod_security at phpMyAdmin directories from # filtering SQL etc. This may break your mod_security implementation. # #<IfModule mod_security.c> # <Directory /usr/share/phpMyAdmin/> # SecRuleInheritance Off # </Directory> #</IfModule>

phpmyadmin_test/web/html/index.php

<?php phpinfo();

phpmyadmin_test/dockerハイフンcompose.yml

version: '3.7' services: db: container_name: db restart: always build: context: . dockerfile: Dockerfile_db tty: true environment: MYSQL_ROOT_PASSWORD: root MYSQL_USER: user MYSQL_PASSWORD: user MYSQL_HOST: db LANG: 'en_US.UTF-8' ports: - "3306:3306" privileged: true networks: - app-net web: container_name: web restart: always build: context: . dockerfile: Dockerfile_web volumes: - ./web/html:/data/www/html - ./web/conf/httpd.conf:/etc/httpd/conf/httpd.conf - ./web/conf/phpMyAdmin.conf:/etc/httpd/conf.d/phpMyAdmin.conf ports: - "8080:80" privileged: true tty: true environment: - PMA_ARBITRARY=1 - PMA_USER=user - PMA_PASSWORD=user - PMA_HOST=db - PMA_PORT=3306 depends_on: - db networks: - app-net networks: app-net: driver: bridge

phpmyadmin_test/Dockerfile_db

FROM almalinux:9.0 RUN set -x && \ dnf -y update && \ dnf -y upgrade && \ dnf install -y which && \ dnf install -y procps && \ dnf install -y epel-release && \ dnf -y install pcre-devel && \ dnf -y install expat-devel && \ dnf -y install wget && \ dnf -y install make && \ dnf -y install gcc && \ dnf -y install firewalld && \ #MySQLをインストール dnf upgrade --refresh -y && \ dnf install mysql mysql-server -y CMD ["/sbin/init"]

phpmyadmin_test/Dockerfile_web

FROM almalinux:9.0 RUN set -x && \ dnf -y update && \ dnf -y upgrade && \ dnf install -y which && \ dnf install -y procps && \ dnf install -y epel-release && \ dnf -y install pcre-devel && \ dnf -y install expat-devel && \ dnf -y install wget && \ dnf -y install make && \ dnf -y install gcc && \ dnf -y install mysql && \ #PHPとApacheのインストール dnf upgrade --refresh -y && \ rpm --import http://rpms.remirepo.net/RPM-GPG-KEY-remi && \ dnf install dnf-utils http://rpms.remirepo.net/enterprise/remi-release-9.rpm -y && \ dnf module enable php:remi-8.1 -y && \ dnf install php php-cli -y && \ mkdir /data && \ mkdir /data/www && \ mkdir /data/www/html && \ #phpMyAdminのインストール dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm -y && \ dnf install https://rpms.remirepo.net/enterprise/remi-release-9.rpm -y && \ dnf install https://rpms.remirepo.net/enterprise/9/remi/x86_64/php-fedora-autoloader-1.0.1-2.el9.remi.noarch.rpm -y && \ dnf --enablerepo=remi install phpMyAdmin -y && \ ln -s /usr/share/phpMyAdmin/ /data/www/html/phpmyadmin CMD ["/sbin/init"]

実現したいこと

phpMyAdminのログインを成功させ、管理画面のなかにはいりたいのです!

実際におこなった作業の流れ

phpmyadmin_testフォルダにて、構築作業を以下の流れでおこないました。

> ls Mode LastWriteTime Length Name ---- ------------- ------ ---- d----- 2022/09/26 14:29 web -a---- 2022/09/26 14:34 998 docker-compose.yml -a---- 2022/09/26 14:35 509 Dockerfile_db -a---- 2022/09/26 14:39 1246 Dockerfile_web

docker-composeのビルドができるディレクトリにいることを確認しました。
ビルドを行います。

> docker-compose build --no-cache

ビルドが終わったので、コンテナを起動します。

> docker-compose up -d Creating network "phpmyadmin_test_app-net" with driver "bridge" Creating db ... done Creating web ... done

コンテナが起動したことを確認しました!

> docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e1ddafcb8ae8 phpmyadmin_test_web "/sbin/init" 26 seconds ago Up 25 seconds 0.0.0.0:8080->80/tcp web 225b93ad7b32 phpmyadmin_test_db "/sbin/init" 28 seconds ago Up 27 seconds 0.0.0.0:3306->3306/tcp db

まだApacheが立ち上がっていないので、立ち上げるためにwebコンテナにログインします。

> docker exec -it web /bin/bash

Apacheを起動しました。

# systemctl start httpd

Apacheを起動できたのでwebコンテナからログアウトします。

# exit exit

MySQLを起動するなど準備があるので、dbコンテナにログインします。

> docker exec -it db /bin/bash

いったんパスワードなしでMySQLにログインできるよう設定し、MySQLを起動します。
(どうも初期設定だとパスワードを使用してのMySQLログインができないようでした)

# systemctl set-environment MYSQLD_OPTS="--skip-grant-tables" # systemctl start mysqld

MySQLへログインします。(「mysql -u root」の場合エラーが出るようでしたので、-hのオプションを使いエラー回避します)

# mysql -h 127.0.0.1 -u root ↓ mysql> flush privileges; Query OK, 0 rows affected (0.08 sec) ↓ mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'rootpass'; Query OK, 0 rows affected (0.01 sec) ↓ mysql> quit Bye ↓ # systemctl stop mysqld ↓ # systemctl unset-environment MYSQLD_OPTS ↓ systemctl start mysqld ↓ # mysql -h 127.0.0.1 -u root -prootpass ↓ mysql> CREATE USER 'root'@'%' IDENTIFIED BY 'rootpass'; Query OK, 0 rows affected (0.02 sec) ↓ mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; Query OK, 0 rows affected (0.01 sec) ↓ mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec) ↓ mysql> exit Bye ↓ # systemctl start firewalld ↓ # firewall-cmd --permanent --add-service=mysql success ↓ # systemctl restart firewalld ↓ # exit

ためしたこと

webコンテナから、MySQLがインストールされているdbコンテナのMySQLへのログインできるかためしてみました。行ったコマンドは以下のものです!

webコンテナからdbコンテナのMySQLへログインができるか検証するため、まずはwebコンテナへログインします。

> docker exec -it web /bin/bash

そして、webコンテナから、dbコンテナのIPアドレス(もしくはコンテナID)を指定して、dbコンテナのMySQLへログインします。

# mysql -h dbコンテナのIPアドレス -P 3306 -u root -prootpass

※あらかじめdbコンテナへログインし、「hostname -i」でdbコンテナのIPアドレスを取得し、それを「-h」のあとにつけました。
結果、以下のようにwebコンテナからdbコンテナへログインすることができました。
webコンテナからdbコンテナのMySQLへはいることができるということが確認できたため、
webコンテナのphpMyAdminにログインし、dbコンテナのMySQLのデータベースを参照したり更新したり
できるようになりそうと考えました。

# mysql -h 172.22.0.2 -P 3306 -u root -prootpass

そして目的である、
http://localhost:8080/phpmyadmin/
へアクセスし、ログインを成功させたいのです!
上記のURLにアクセスしてみると、phpMyAdminのログイン画面がエラー無しで表示されます。
イメージ説明
ここまでは異常なしと考えておりましたが、ユーザ名とパスワードを入力してのログインに失敗するため、
その原因を特定し解決したく今回の質問を投稿させていただきました。
イメージ説明
ユーザ名:root
パスワード:rootpass

こちらを入力しログインしようとしても失敗してしまう、というのが現状となります。
dockerタグとphpMyAdminタグが適切かと思ったのですが、関連すると思われるタグをつけております。
タグ付けが適切な状態か判断できておらず、そちらについてご指摘がございましたら、頂戴できますと幸いです。
よろしくお願いいたします。
また、関連するファイルに提示漏れがあればそちらについてもご指摘をいただけますと嬉しいです。


追記をします!(2022年9月26日20時33分)

webコンテナには「/var/lib/mysql/mysql.sock」が存在しない様子

> docker exec -it web /bin/bash [root@3a6b90c1d94d /]# mysql -u root -p Enter password: ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) [root@3a6b90c1d94d /]# ls /var/lib/mysql/ | grep mysql.sock ls: cannot access '/var/lib/mysql/': No such file or directory [root@3a6b90c1d94d /]# ls /var/lib/ alternatives httpd phpMyAdmin rpm-state tpm2-tss dnf misc private selinux games php rpm systemd

今回webコンテナとdbコンテナの計2つのコンテナをつくっておりますが、webコンテナの方で「mysql.sock」がないらしいことがわかりました。
webコンテナからdbコンテナのMySQLにログインするときにエラーが出ないのは前述のとおりですが、webコンテナのなかではエラーがでていました。上記の「mysql -u root -p」で発生したエラーの「ERROR 2002 (HY000)~」という内容は、phpMyAdminでログインに失敗した時に画面表示された「mysqli::real_connect(): (HY000/2002): No such file or directory」と酷似しているため、webコンテナ側に「/var/lib/mysql/mysql.sock」が存在しないのが今回のエラーの原因と信じ、どうすればエラーが消えるか引き続き調査をしていきます!

dbコンテナに「/var/lib/mysql/mysql.sock」が存在する様子

> docker exec -it db /bin/bash [root@89a91b163c4f /]# ls /var/lib/mysql/ | grep mysql.sock mysql.sock mysql.sock.lock

以下のような質問にはリアクションをつけましょう

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

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

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

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

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

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

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Docker

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