php + mongodb のdocker環境の作成 #mongodb #php #docker
■ 概要:
mongodb + php環境の構築メモ等です
dockerを使う例です
・フォルダ構成は、Laravelを使用し。Laravel 7を追加しました
・Laravel 7は、mongodb対応してないようでしたので。
composer でmongoドライバ等を追加する例を探して、mongo操作する形です
■ 環境
mongoDb:
php-fpm : 7.3
Laravel : 7.29
nginx
■ 参考
・先人様の記事を参考しました。
https://access-jp.co.jp/blogs/development/51
https://www.php.net/manual/ja/mongodb.tutorial.library.php
■ 参考の設定
■ 設定など
・docker-compose.yml
/docker-compose.yml
version: '3'
services:
web:
build: ./docker-nginx
ports:
- 80:80
depends_on:
- app
volumes:
- ./:/var/www/html
- ./docker-nginx/default.conf:/etc/nginx/conf.d/default.conf
links:
- app
app:
build: ./docker-php
depends_on:
- mongo
links:
- mongo
volumes:
- ./:/var/www/html
mongo:
image: mongo
# container_name: "mongo"
command:
- mongod
ports:
- 27017:27017
volumes:
- mongo-data:/data/db
mongo-data:
image: busybox
volumes:
mongo-data:
・pecl , やや時間かかりました。
pecl install mongodb
・ php.ini 修正
dockerの場合ですが、パスは探しました ( /usr/local/etc/php )
# php -r "phpinfo();" | grep php.ini
Configuration File (php.ini) Path => /usr/local/etc/php
Loaded Configuration File => /usr/local/etc/php/php.ini
・extension 追加
extension=mongodb.so
・docker-compose を再起動し、
nginx経由で、phpinfo(); を実行すると。mongodb が反映されました
・composer 追加
上記の、php.ini修正が完了してないと、composerがエラーになりました。
composer.phar require "mongodb/mongodb"
・上記で、ドライバ追加まで 完了です。
■ テスト
・フォルダ構成は、Laravel 環境にした例です
php composer.phar create-project --prefer-dist laravel/laravel myblog "7.*"
・ データの追加、 collection にデータ追加しておきます。
db.books.insertMany([
{ "title": "t1", "content" : "c1" },
{ "title": "t2", "content" : "c2" },
{ "title": "t3", "content" : "c3" },
{ "title": "t4", "content" : "c4" },
]);
・検索する例 , vendor/autoload.php を読込み、find で、検索する例
接続先は dockerの場合は、ホスト名で接続できなかった為、コンテナ名 mongoにしました
( new MongoDB\Client("mongodb://mongo:27017"); )
public/test2.php
require '../vendor/autoload.php'; // include Composer's autoloader
//
function test1(){
$client = new MongoDB\Client("mongodb://mongo:27017");
$collection = $client->db1->books;
$result = $collection->find();
foreach ($result as $entry) {
var_dump($entry);
}
}
/// main
test1();
var_dump ("#end-test");
..