前提・実現したいこと
docker初心者です。
ごくごく単純なphpとDB環境を構築しようと考えております。
DBにはphpmyadminを設定したいと思い作業を進めております。
使用環境
・OS
windows10 pro
・使用したdockerイメージ
mysql:8
php:7.2.1-apache
phpmyadmin/phpmyadmin
下記のようなdocker-compose.ymlを作成しました。
version: "2"
services:
my-mysql:
image: mysql:8
container_name: my-mysql
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=docker
- MYSQL_USER=docker
- MYSQL_PASSWORD=docker
ports:
- "3306:3306"
volumes:
- ./mysql:/var/lib/mysql
my-php:
image: php:7.2.1-apache
container_name: my-php
ports:
- "80:80"
volumes:
- ./html:/var/www/html
links:
- "my-mysql:db"
my-phpmyadmin:
image: phpmyadmin/phpmyadmin
ports:
- "8080:80"
links:
- "my-mysql:db"
「docker-compose up -d」 後に成功していたもの
◎成功したもの
・ホスト側でのhtml・php記述
・phpmyadminの管理者画面へのログイン
・phpmyadminからテーブル('tamago')の作成
発生している問題
phpファイルに接続テスト用のファイルを作成しましたが、
接続ができませんでした。
エラーメッセージは
Fatal error: Uncaught Error: Call to undefined function mysql_connect() in /var/www/html/conect.php:7 Stack trace: #0 {main} thrown in /var/www/html/conect.php on line 7
7行目つまり($connect = mysql_connect($hostname, $username, $password);)
がおかしいといっております。
接続確認ファイル
<?php
$hostname = "localhost";
$username = "docker";
$password = "docker";
$dbname = "docker";
$connect = mysql_connect($hostname, $username, $password);
mysql_select_db($dbname);
$sql = "select * from tamago";
$sqlq = mysql_query($sql, $connect);
while($row = mysql_fetch_array($sqlq)){
echo "接続成功";
}
mysql_free_result($sqlq);
mysql_close($connect);
?>
試したこと
調べてみましたが、もしかして、phpとmysqlを接続するためのPDOなどの記述をしなければいけなかったのでしょうか。
解決策のわかる方いらっしゃいましたら、できましたら「docker-compose.yml」に追記をお願いしたいです。よろしくお願いいたします。
※できましたら、docker-compose.ymlだけの記述だけでfixさせたい気持ちがあります。docker-compose.ymlだけで無理でしたらDockerfileの記述もよろしくお願いいたします。
ファイル更新
「docker-compose.yml」にnetworksの記述を追記しました。
version: "2"
services:
my-mysql:
image: mysql:5.7
container_name: my-mysql
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=docker
- MYSQL_USER=docker
- MYSQL_PASSWORD=docker
ports:
- "3306:3306"
volumes:
- ./mysql:/var/lib/mysql
networks:
- my_network
my-php:
image: php:7.2.1-apache
container_name: my-php
ports:
- "80:80"
volumes:
- ./html:/var/www/html
links:
- "my-mysql:db"
networks:
- my_network
my-phpmyadmin:
image: phpmyadmin/phpmyadmin
ports:
- "8080:80"
links:
- "my-mysql:db"
networks:
- my_network
networks:
my_network:
ホストネームを”my-mysql”に変更しました。
mysql_connect
↓
mysqli_connect
に書き換えて、第四引数に$danameを追記
<?php
$hostname = "my-mysql";
$username = "docker";
$password = "docker";
$dbname = "docker";
$connect = mysqli_connect($hostname, $username, $password, $dbname);
mysql_select_db($dbname);
$sql = "select * from tamago";
$sqlq = mysql_query($sql, $connect);
while($row = mysql_fetch_array($sqlq)){
echo "接続成功";
}
mysql_free_result($sqlq);
mysql_close($connect);
?>
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+1
https://qiita.com/Arturias/items/75828479c1f9eb8d43fa
linksをつけても、localhostで参照できるわけではありません。
https://qiita.com/tamanobi/items/8b8dd64ae1f959f9ff9f
linkは非推奨とのこと、networksを利用することで、ホスト名称も設定
できるので、こちらの方がオススメ。
localhostではなく、コンテナ名で参照できると思います。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
2018/09/14 20:41 編集
ご回答ありがとうございます。
「docker-compose.yml」にnetworksの記述を追記しました。
そして、接続テスト用のphpも少し書き換えましたが、質問です。
>localhostではなく、コンテナ名で参照できると思います。
コンテナ名はこの場合は”my-mysql”で問題ないのでしょうか。
2018/09/15 20:56
2018/09/15 22:16
「172.28.0.0」~「172.28.0.2」と何通りか試してみたのですがエラー内容は変わりませんでした。
inspectの内容から、3つのコンテナ(my-phpとmy-mysqlとlamp2_my-phpmyadmin_1)は同一ネットワーク上にセットされることには成功しているのかなと思うのですが💦。
なかなか原因がつかめずです。
2018/09/15 22:45
2018/09/15 22:48
2018/09/15 23:42 編集
phpのバージョンは「7.2.1」
mysqlのバージョンは「8」
が入っております。
mysqlのバージョンが高すぎてエラーになっているのでしょうか。
(※docker-compose down してymlファイルのイメージをmysql8→mysql5.7に変えて、docker-compose upしなおしてみました。)
教えていただいたとおり、
mysql_connect
↓
mysqli_connect
に変更しました。
そして、mysqli_connectの場合第四引数が必要みたいでしたので$dbnameも追記しました。
http://php.net/manual/ja/function.mysqli-connect.php
(ファイル更新)
エラー文は「Call to undefined function mysqli_connect() 」に変わりました。
2018/09/16 02:02
https://teratail.com/questions/74046
2018/09/16 12:45 編集
上記の記事を読むと、イメージの「php:7.2.1-apache」にはmysqli関連のモジュールがはいっていないのでモジュール関連をインストールしましょうというと理解しました
ですのでビルドと同時にモジュール群のインストールをしなければいけないと思いました。
php/Dockerfileを追記して、モジュールをインストールする文を追記しようと考えております。
http://web-engine.hatenadiary.com/entry/20171210/1512832861
この記事を参考にテストをしてみます。
※Dockerfileについては未知のため少しテストにお時間をください。