Docker + Laravel + Oracleの開発環境の構築方法
macOSでのDockerを使ったLaravel + Oracleの開発環境を構築する方法を共有します。
各バージョン
PHP 7.4
Laravel 8.47.0
Oracle 11.2.0.2
macOS Catalina
Docker 20.10.6
docker-compose 1.29.1
OracleのDocker imageの作成
まずは、公式のOracle から配布されているdocker-imagesをローカルにcloneします。
$ git clone https://github.com/oracle/docker-images.git
※ イメージを作成するだけなので、cloneの場所はどこでも構いません。
そしてOracleのサイトから、目的のバージョンのzipファイルをダウンロードします。
※ ダウンロードにはOracleのアカウント登録が必要です。
今回は、バージョン 11.2.0.2 を使用するのでこちらのリンクから
Oracle Database 11gR2 Express Edition for Linux x64
をダウンロードします。
cloneしたリポジトリのOracleDatabase/SingleInstance/dockerfiles/11.2.0.2 内にダウンロードした
oracle-xe-11.2.0-1.0.x86_64.rpm.zip
をzipのまま配置します。
OracleDatabase/SingleInstance/dockerfilesに移動し、以下のコマンドを実行します。
$ ./buildContainerImage.sh -v 11.2.0.2 -x
以下のメッセージが表示されたら成功になります。
Oracle Database Docker Image for 'xe' version 11.2.0.2 is ready to be extended:
--> oracle/database:11.2.0.2-xe
Build completed in ○○ seconds.
docker imagesのコマンドを叩くと、oracle/databaseのイメージが表示されるはずです。
$ docker images
REPOSITORY TAG
oracle/database 11.2.0.2-xe
PHPコンテナの作成
Oracle instant client から instantclient-basicとinstantclient-sdk をダウンロードします。
下のバージョンのファイルを使用します。
instantclient-basic-linux.x64-12.2.0.1.0.zip
instantclient-sdk-linux.x64-12.2.0.1.0.zip
プロジェクト内に docker/php/Dockerfileを作成し、ダウンロードした
instantclient-basic-linux.x64-12.2.0.1.0.zip
と instantclient-sdk-linux.x64-12.2.0.1.0.zip
を zipのまま phpフォルダに配置してください。
Dockerfileの内容を以下にします。
FROM php:7.4-fpm
RUN apt-get update && \
apt-get install -y git \
libfreetype6-dev \
libjpeg62-turbo-dev \
libpng-dev \
libonig-dev && \
docker-php-ext-install gd bcmath
ENV LD_LIBRARY_PATH /usr/local/instantclient/
ENV TNS_ADMIN /usr/local/instantclient/
COPY instantclient-basic-linux.x64-12.2.0.1.0.zip /tmp
COPY instantclient-sdk-linux.x64-12.2.0.1.0.zip /tmp
RUN apt-get update && \
apt-get install -y zip unzip libaio1 wget && \
unzip /tmp/instantclient-basic-linux.x64-12.2.0.1.0.zip -d /usr/local/ && \
unzip /tmp/instantclient-sdk-linux.x64-12.2.0.1.0.zip -d /usr/local/ && \
ln -s /usr/local/instantclient_12_2 /usr/local/instantclient && \
ln -s /usr/local/instantclient/libclntsh.so.12.1 /usr/local/instantclient/libclntsh.so && \
export LD_LIBRARY_PATH=/usr/local/instantclient && \
docker-php-ext-configure oci8 --with-oci8=instantclient,/usr/local/instantclient && \
docker-php-ext-install oci8 && \
docker-php-ext-configure pdo_oci --with-pdo-oci=instantclient,/usr/local/instantclient,12.2 && \
docker-php-ext-install pdo_oci && \
rm -rf /usr/local/*.zip
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
WORKDIR /var/www/html
#WORKDIRは場所は、Nginxのコンテナ等の適宜調整が必要です。
Dockerfileをビルドし、コンテナに入りcomposerでLaravelをインストールしてください。
LaravelからOracleへの接続
Oracleに接続するために必要なライブラリのインストールと設定を行います。
laravel-oci8
$ composer require yajra/laravel-oci8:^8
config/app.php
に以下を追加します。
'providers' => [
//
Yajra\Oci8\Oci8ServiceProvider::class,
],
以下のコマンドを実行します。
実行後、config/oracle.php
が生成されます。
$ php artisan vendor:publish --tag=oracle
docker-compose.ymlにoracleの設定を追加します。
imageのバージョンは上で作成したバージョンを記述します。
※ PHP や nginx のコンテナの記述は省略しています。
version: '3'
services:
oracle:
image: oracle/database:11.2.0.2-xe
container_name: oracle
shm_size: 1g
ports:
- 1521:1521
environment:
ORACLE_PWD: secret
ORACLE_CHARACTERSET: AL32UTF8
TZ: Asia/Tokyo
restart: always
volumes:
- oradata:/u01/app/oracle/oradata
volumes:
oradata:
shm_size
指定しないと、下のエラーが表示されてしまいます。
Error: The container doesn't have enough memory allocated.
A database XE container needs at least 1 GB of shared memory (/dev/shm).
ports
ORACLE DBへ接続する際には1521ポートを使用するのが慣例となっているらしいです。
environment
ORACLE_PWD
: これで sys と systemユーザーの初期パスワードが secret になります。
ORACLE_CHARACTERSET
: データベース作成時の文字コード。
TZ
: タイムゾーン。
※ sys
, system
ユーザー
Oracle Databaseをインストール時に自動的に作成されるユーザー。
volumes
の場所
11g XEのマッピンング先は、/u01/app/oracle/oradata
になります。
バージョンによってマッピンング先は変わるようなので注意が必要です。
Laravelの .env
のDB情報を以下に変更します。
DB_CONNECTION=oracle
DB_HOST=oracle
DB_PORT=1521
DB_DATABASE=XE
DB_USERNAME=system
DB_PASSWORD=secret
以上の設定が完了した状態で、artisanコマンドを叩くと問題なくmigrateを行うことができるはずです。
$ php artisan migrate
Discussion