ネットワーク作成
docker network create postgresql_php
PHPコンテナ
-vはマウント
docker run --name php73 -dit \
--net=postgresql_php \
-p 8080:80 \
-v /Users/ユーザー/work/Docker/php_postgresql/www:/var/www/html \
php:7.3-apache
PostgreSQLコンテナ
docker run --name postgresphp -dit --net=postgresql_php \
-e POSTGRES_PASSWORD=passworddb \
-e POSTGRES_DB=testdb \
-e POSTGRES_USER=root \
postgres
必要なものインストール
#php73コンテナにログイン
docker exec -it php73 /bin/bash
#必要なパッケージをインストール
apt-get update
apt-get install -y libpq-dev
#pdo_pgsqlモジュールをインストールする
docker-php-ext-install pdo_pgsql
#アパッチを再起動
apache2ctl restart
php73コンテナの「/var/www/html」に下記のindex.phpを作成し、
php.iniの場所を確認
※今回は/Users/ユーザー/work/Docker/php_postgresql/www/をマウントしているのでここにindex.phpを作成するか
docker cp ファイルが置いているパス php73:/var/www/html/のコマンドでコンテナにファイルをコピーするかどちらかである。
<?php phpinfo(); ?>
http://localhost:8080/にアクセス
Configuration File (php.ini) Pathの所にパスが書いてあり/usr/local/etc/php/になっていた
/usr/local/etc/php/の下には下記ファイルがある
php.ini-development テスト環境用
php.ini-production 本番環境用
今回はphp.ini-developmentを編集し、ファイル名をphp.iniにする
下記のピンクの文字を検索し、編集する。
先頭の「;」を削除するのを忘れずに〜
; ★確認必須
default_charset = “UTF-8”
;★PHPの内部文字エンコーディングをUTF-8に設定しています。
internal_encoding = UTF-8
;★HTTP入力用文字エンコーディングの自動変換を無効化しています。
;★HTTP入力用文字エンコーディングとはHTTPリクエストの入力文字エンコーディングのことを指します。
input_encoding = pass
; ★HTTP出力用文字エンコーディングをUTF-8に設定
output_encoding = UTF-8
;★PHPでSSL/TLSを使用するために必要なモジュールです。
;SSL/TLS =プロトコル
;データを暗号化することで、盗聴や改ざんから保護する
;サーバー認証により、通信先が正しいサーバーであることを確認する
;クライアント認証により、通信相手が正しいクライアントであることを確認する
;例えば、HTTPS通信を行う際や、OpenSSLライブラリを使用する際に必要となります。
;OpenSSLライブラリは、SSL/TLSプロトコルを実装したオープンソースのソフトウェアライブラリです。
;主な特徴は以下の通りです。
;SSL/TLSプロトコルのサーバー・クライアント実装を提供
;RSA、DHなどの公開鍵暗号アルゴリズムを実現するための多倍長整数演算ライブラリ関数を含む
;Apache形式のライセンスで、商用・非商用の利用が自由
;ほぼ全てのUnix系、OpenVMS、Windowsなどのプラットフォームで利用可能
;コマンドラインツール(openssl)と、C言語向けのAPIライブラリを提供
;OpenSSLは、SSL/TLSを使ったセキュアな通信を実現するために必要不可欠なライブラリです。
;Webサーバーやクライアントアプリケーション、ネットワーク機器などで広く利用されています。
;ただし、OpenSSLには定期的にセキュリティ脆弱性が見つかるため、常に最新版に更新することが重要です。
;特に、サポート期限が切れたバージョンは、セキュリティリスクが高まるので、早めに新しいバージョンに移行する必要があります。
;以上のように、OpenSSLは、SSL/TLSを実現するための事実上の標準的なライブラリであり、セキュアな通信を実装する上で欠かせないソフトウェアなのです。
extension=openssl
;★pdo_pgsqlモジュールは、PHPからPostgreSQLデータベースにアクセスするために必要なモジュールです。
;PDOインターフェイスを使ってPostgreSQLに接続する際に、このモジュールが必要となります。
extension=pdo_pgsql
;★pgsqlモジュールは、PHPからPostgreSQLデータベースにアクセスするために必要なモジュールです。
;pg_connect()関数などのpgsql拡張モジュールの関数を使ってPostgreSQLに接続する際に、このモジュールが必要となります。
extension=pgsql
; ★確認必須
date.timezone = “Asia/Tokyo”
;★デフォルトで使用する言語を日本語に指定しています。
;これにより、mb_send_mail()などのmbstring関数で日本語のメール送信ができるようになります。
mbstring.language = Japanese
; ★サーバー側で発行していないセッションIDが送られてきた場合、そのセッションIDを受け入れず、新しいセッションIDを発行する
;これにより、セッションフィクセーション攻撃を防ぐことができる
;セッションフィクセーション攻撃とは、攻撃者が偽のセッションIDを作成し、それを別のユーザーに送りつけることで、そのユーザーのセッションを乗っ取る攻撃のことです。
;session.use_strict_mode = 1 を設定することで、サーバー側で発行していないセッションIDは受け入れられなくなり、このような攻撃を防げるのです。
;ただし、この設定を有効にした場合、以前のセッションIDを引き継げなくなるため、ログイン済みのユーザーはログアウトされてしまう点に注意が必要です。
;セキュリティとユーザビリティのトレードオフとなりますが、セキュリティ上の理由からsession.use_strict_mode = 1 を設定することが推奨されています。
session.use_strict_mode = 1
/var/www/html/connect.phpを作成する
<?php
$dbh = new PDO(
'pgsql:host=postgresphp;dbname=testdb',
'root',
'passworddb',
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);
?>
<!DOCTYPE html>
<html long="ja">
<head>
<meta charset="UTF-8">
<title>データベース接続テスト</title>
</head>
<body>
<div>データベース接続に成功しました</div>
</body>
</html>
http://localhost:8080/connect.phpにアクセスして
データベースに接続成功しました。と出ることを確認
※私の場合、なぜかDBのパスワードが設定されていなかったのでpostgresphpコンテナに入ってパスワードを設定した
#postgresphpコンテナに入る
docker exec -it postgresphp bash
#DB接続
psql -U root -d testdb
#rootのパスワードをpassworddbに設定
ALTER USER root WITH PASSWORD 'passworddb';
パスワード認証に失敗したと出たら、設定ファイルを編集する
#postgresphpコンテナに入る ※既に入ってる場合は不要
docker exec -it postgresphp bash
#設定ファイルの場所を検索 今回は/var/lib/postgresql/data/pg_hba.confだった
psql -U root -d testdb -t -P format=unaligned -c 'show hba_file'
pg_hba.confに
host all root 0.0.0.0/0 md5
を追加
一番下から二番目に追加した
——省略——-
local replication all trust
host replication all 127.0.0.1/32 trust
host replication all ::1/128 trust
host all root 0.0.0.0/0 md5
host all all all scram-sha-256