🗃️

Docker + Laravel + Oracleの開発環境の構築方法

2021/07/12に公開

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.zipinstantclient-sdk-linux.x64-12.2.0.1.0.zip を zipのまま phpフォルダに配置してください。

Dockerfileの内容を以下にします。

/docker/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
https://github.com/yajra/laravel-oci8

$ composer require yajra/laravel-oci8:^8

config/app.php に以下を追加します。

config/app.php
'providers' => [
    //
    Yajra\Oci8\Oci8ServiceProvider::class,
],

以下のコマンドを実行します。
実行後、config/oracle.php が生成されます。

$ php artisan vendor:publish --tag=oracle

docker-compose.ymlにoracleの設定を追加します。
imageのバージョンは上で作成したバージョンを記述します。
※ PHP や nginx のコンテナの記述は省略しています。

docker-compose.yml
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情報を以下に変更します。

.env
DB_CONNECTION=oracle
DB_HOST=oracle
DB_PORT=1521
DB_DATABASE=XE
DB_USERNAME=system
DB_PASSWORD=secret

以上の設定が完了した状態で、artisanコマンドを叩くと問題なくmigrateを行うことができるはずです。

$ php artisan migrate

Discussion