BeginnerEngineerBlog
中の人
中の人

【laravel oracle docker】laravel10.xとoracle21cをdockerで環境構築

公開: 2023-03-18 01:58
更新: 2023-04-07 13:44
1431
環境構築 oracle laravel docker mac
dockerでlaravel10.xとoracle21cで環境構築したので紹介します

こんにちは!

中の人です。

最近laravel10.xとoracle21cで環境構築したので忘れないようにメモろうと思います。

os: mac intel
laravel: 10.x
oracle: 21c
(mac m1は未確認)

参考記事: https://zenn.dev/marushin/articles/d8c8760e978489 (スペシャルサンクス🎉)

変更履歴
20230323
srcディレクトリを作成する記述をしていなかったので追加しました
20230407
sqlクライアントの設定を追加しました


イメージ作成


任意のディレクトリを作成してそのディレクトリ内で

git clone https://github.com/oracle/docker-images.git

でdocker-imagesなるものをclone


こちらにアクセスして

21c Linux x86-64 をzipでダウンロード(オラクルアカウント作成しないとダウンロードできないかも)して、gitcloneしたファイル群の以下の場所に配置

                                                                👇 ダウンロードしたzipファイル
docker-images/OracleDatabase/SingleInstance/dockerfiles/21.3.0/LINUX.X64_213000_db_home.zip

dockerfilesの階層に行って
cd docker-images/OracleDatabase/SingleInstance/dockerfiles

以下コマンドを実行(多分めちゃくちゃ時間がかかる)
./buildContainerImage.sh -v 21.3.0 -x -i

ちなみにちょいちょいコケる可能性があります

以下私が遭遇したエラーで覚えている内容と解決方法

・容量が足りません的なエラーが発生 -> https://itedge.stars.ne.jp/docker_image_oracle_database_19c_error/#buildDockerImagesh1 こちらを参考にdockerDesktopの設定ResoucesのAdvancedのVirtual disk limitのサイズを上げたら突破した(メモリも上げた方がいいかも)

・oracle-database-xe-21c-1.0-1.x86_64の解凍中にエラーが発生 -> 何度か上記イメージ作成のコマンド(./build~~)を打っていたら突破した

他にも色々あった気がしますが忘れてしまいました🙇‍♂️

上手く作成できたら

  Oracle Database container image for 'xe' version 21.3.0 is ready to be extended: 
    
    --> oracle/database:21.3.0-xe

  Build completed in 674 seconds.

こんな感じで終わります。

docker images

REPOSITORY                   TAG              IMAGE ID       CREATED          SIZE
oracle/database              21.3.0-xe        fbf0460bd29d   3 minutes ago   6.54GB

こんな感じでイメージが作成されていれば成功

そしたらgitcloneしたdocker-imagesディレクトリは削除して大丈夫です。(多分)
(また、チームとシェアするならdocker hubにアップしましょう。やり方はこちらが参考になります!!)


環境構築


そしたらlaravelが動く環境を構築していきます

ファイル構成


完成後ファイル構成は以下のようになります
root
├── docker
│   ├── nginx
│   │   └── default.conf
│   ├── oracle
│   │   └── oradata
│   └── php
│       ├── Dockerfile
│       ├── entrypoint.sh
│       ├── instantclient-basic-linux.x64-21.9.0.0.0dbru.zip
│       ├── instantclient-sdk-linux.x64-21.9.0.0.0dbru.zip
│       └── php.ini
├── docker-compose.yml
├── .env
└── src (laravelのファイル群)
    ├── ...

oracleに接続するためのzipファイルをダウンロードする



Version 21.9.0.0.0 (Requires glibc 2.14)の
・Basic Package(zip) instantclient-basic-linux.x64-21.9.0.0.0dbru.zip
・SDK Package(zip) instantclient-sdk-linux.x64-21.9.0.0.0dbru.zip

の二つをダウンロードして以下の位置に配置
root
├── docker
│   └── php
│       ├── instantclient-basic-linux.x64-21.9.0.0.0dbru.zip
│       └── instantclient-sdk-linux.x64-21.9.0.0.0dbru.zip

完成後のファイル構成に向かって色々追加


root/docker-compose.yml

version: '3'

services:
  app:
    build:
      context: .
      dockerfile: ./docker/php/Dockerfile
      args:
        XDEBUG_INSTALL: "${XDEBUG_INSTALL:-false}"
    ports:
      - "9000:9000"
      - "4430:443"
    volumes:
      - "./src:/var/www/html:${VOLUME_CONSISTENCY:-consistent}"
    environment:
      - HOST_UID
      - XDEBUG_CLIENT_HOST
      - "XDEBUG_CLIENT_PORT=${XDEBUG_CLIENT_PORT:-9000}"
      - "XDEBUG_INSTALL=${XDEBUG_INSTALL:-false}"
    depends_on:
      - oracle

  web:
    image: nginx:1.23.3
    volumes:
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
      - "./src:/var/www/html"
    ports:
      - "${WEB_HOST_PORT:-80}:80"
    depends_on:
      - app

  oracle:
    image: oracle/database:21.3.0-xe
    container_name: oracle
    shm_size: 1g
    ports:
      - 1521:1521
      - 5500:5500
    volumes:
      - ./docker/oracle/oradata:/opt/oracle/oradata
    environment:
      - ORACLE_PWD=passw0rd
      - ORACLE_CHARACTERSET=AL32UTF8
      - TZ=Asia/Tokyo

  mailcatcher:
    image: schickling/mailcatcher
    ports:
      - "1080:1080"
      - "1025:1025"


root/.env

XDEBUG_INSTALL=true
HOST_UID=501
XDEBUG_CLIENT_HOST=host.docker.internal
XDEBUG_CLIENT_PORT=9003
WEB_HOST_PORT=8080



root/docker/php/Dockerfile

FROM php:8.2.3-fpm

ENV APACHE_DOCUMENT_ROOT /var/www/html

RUN apt-get update \
  && apt-get install --no-install-recommends -y \
    apt-transport-https \
    apt-utils \
    build-essential \
    curl \
    debconf-utils \
    gcc \
    git \
    vim \
    zip \
    gnupg2 \
    libfreetype6-dev \
    libicu-dev \
    libjpeg62-turbo-dev \
    libpng-dev \
    libpq-dev \
    libzip-dev \
    locales \
    ssl-cert \
    unzip \
    zlib1g-dev \
    iputils-ping \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/* \
  && echo "en_US.UTF-8 UTF-8" >/etc/locale.gen \
  && locale-gen \
  ;

ENV LD_LIBRARY_PATH /usr/local/instantclient/
ENV TNS_ADMIN /usr/local/instantclient/

COPY ./docker/php/instantclient-basic-linux.x64-21.9.0.0.0dbru.zip /tmp
COPY ./docker/php/instantclient-sdk-linux.x64-21.9.0.0.0dbru.zip /tmp

RUN apt-get update && \
    apt-get install -y zip unzip libaio1 wget && \
    unzip /tmp/instantclient-basic-linux.x64-21.9.0.0.0dbru.zip -d /usr/local/ && \
    unzip /tmp/instantclient-sdk-linux.x64-21.9.0.0.0dbru.zip -d /usr/local/ && \
    ln -s /usr/local/instantclient_21_9 /usr/local/instantclient && \
    ln -s /usr/local/instantclient/libclntsh.so.21.1 /usr/local/instantclient/lnlibclntsh.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

RUN pecl install apcu && echo "extension=apcu.so" > /usr/local/etc/php/conf.d/apc.ini

RUN curl -sS https://getcomposer.org/installer \
    |  php -- \
        --filename=composer \
        --install-dir=/usr/local/bin \
    && chown www-data /var/www \
    && chmod g+s /var/www/html

RUN curl -SL https://deb.nodesource.com/setup_14.x | bash
RUN apt-get install -y nodejs && \
  npm install -g npm@latest && \
  npm install -g @vue/cli

ARG XDEBUG_INSTALL
ARG BOOL=true

RUN if [ ${XDEBUG_INSTALL} = ${BOOL} ]; then \
      pecl install xdebug-3.2.0 && docker-php-ext-enable xdebug; \
    fi

COPY ./docker/php/php.ini /usr/local/etc/php/php.ini
COPY ./docker/php/entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

CMD ["php-fpm"]


ちなみに
ln -s /usr/local/instantclient/libclntsh.so.21.1 /usr/local/instantclient/lnlibclntsh.so && \

参考にさせていただいた記事では

libclntsh.so && \

となっていましたが、すでにそのリンク名?あります的なエラーが発生したので

lnlibclntsh.so && \

と適当な別名にしたらエラー出ませんでした。もしかしたらこのバージョンではそもそも必要ない記述かもしれません。(よくわかっていません)
(気になった方は調べてみてください!)

root/docker/php/entrypoint.sh

#!/bin/sh

if [ -n "${HOST_UID}" -a "${HOST_UID}" != "$(id -u www-data)" ]; then
    usermod -u "${HOST_UID}" www-data
fi

if [ -n "${HOST_GID}" -a "${HOST_GID}" != "$(id -g www-data)" ]; then
    groupmod -g "${HOST_GID}" www-data
fi

if [ ${XDEBUG_INSTALL} = true ]; then
ini=$(cat << EOS
xdebug.client_host=${XDEBUG_CLIENT_HOST:-$(ip route | awk 'NR==1 {print $3}')}
xdebug.client_port=${XDEBUG_CLIENT_PORT}
xdebug.start_with_request=yes
xdebug.remote_cookie_expire_time=3600
xdebug.mode=debug
EOS
)
echo "${ini}" >> /usr/local/etc/php/conf.d/php.ini
fi

exec docker-php-entrypoint "$@"


権限を変更
chmod 777 entrypoint.sh 

root/docker/php/php.ini

opcache.max_accelerated_files = 20000
opcache.memory_consumption=256
realpath_cache_size = 4096K
realpath_cache_ttl = 600
; 一行改行を入れておく

root/docker/nginx/default.conf

server {
    listen 80;
    root /var/www/html/public;
    index index.php index.html;
    server_name php-docker.local;

    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;

    location / {
        try_files $uri /index.php$is_args$args;
    }

    location ~ \.php$ {
        fastcgi_read_timeout 365d;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        internal;
    }

    location ~ \\.php$ {
        return 404;
    }
}


mkdir src

今の時点は
root
├── .env
├── docker
│   ├── nginx
│   │   └── default.conf
│   └── php
│       ├── Dockerfile
│       ├── entrypoint.sh
│       ├── instantclient-basic-linux.x64-21.9.0.0.0dbru.zip
│       ├── instantclient-sdk-linux.x64-21.9.0.0.0dbru.zip
│       └── php.ini
├── docker-compose.yml
└── src

コンテナを立ち上げる


rootディレクトリで以下を実行
docker-compose build


docker-compose up

一発目のupはoracleコンテナめっちゃ立ち上がるの遅いです。
2回目以降は割とスムーズに立ち上がります。

ちゃんと立ち上がるとターミナルのログに


こんな感じで準備オッケーです的なログが出力されます

で、この時点でoracleディレクトリが作成されます(先にoradataまで作っておいても問題ないです)

root
├── .env
├── docker
│   ├── nginx
│   │   └── default.conf
│   ├── oracle 👈 upで自動的に作成される
│   │   └── oradata
│   │       ├── .XE.created
│   │       ├── XE
│   │       │   ├── ...
│   │       └── dbconfig
│   │           └── ...
│   └── php
│       ├── Dockerfile
│       ├── entrypoint.sh
│       ├── instantclient-basic-linux.x64-21.9.0.0.0dbru.zip
│       ├── instantclient-sdk-linux.x64-21.9.0.0.0dbru.zip
│       └── php.ini
├── docker-compose.yml
└── src

環境構築は以上になります。


laravel関連


laravelのインストール


rootディレクトリで

docker-compose exec app bash

でappコンテナの中へ

composer create-project laravel/laravel:^10.0 .

root/src/の中にlaravelがインストールされたと思います


oracleに接続するためのライブラリ追加


oracleに接続するためのライブラリをインストールします

appコンテナ内でこいつをインストールします

composer require yajra/laravel-oci8:^10

root/src/config/app.phpに以下を追加

    'providers' => [

        /*
         * Laravel Framework Service Providers...
         */
        Illuminate\Auth\AuthServiceProvider::class,
        ....
        // 👇 こいつを追加
        Yajra\Oci8\Oci8ServiceProvider::class,
    ],


php artisan vendor:publish --tag=oracle

を実行

root/src/config/にoracle.phpが追加されてれば成功?です

env修正


root/src/.envを以下のように修正

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

MAIL_MAILER=smtp
MAIL_HOST=mailcatcher
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"
...

データベース接続用の設定とメールキャッチャーの設定をします

データベース作成


appコンテナ内で

php artisan migrate

成功すると


こんなログが出力されます


動作確認


ブラウザに表示されるか確認


ブラウザで

http://localhost:8080/

にアクセス


おー

データベースへの接続の確認


migrateが成功しているので大丈夫だと思いますが、seederにサンプルデータがあるので流し込んでtinkerで確認してみたいと思います

root/src/database/seeders/DatabaseSeeder.phpのコメントアウトを外す

    ...
    public function run(): void
    {
        \App\Models\User::factory(10)->create();

        \App\Models\User::factory()->create([
            'name' => 'Test User',
            'email' => 'test@example.com',
        ]);
    }
    ...

appコンテナ内で

php artisan db:seed

を実行


と表示されたら成功

appコンテナ内で

php artisan tinker

を実行

で、

DB::table('users')->get();

と入力


こんな感じでusersが取得できました

ちゃんとデータベースが機能しているのが確認できましたね!


cloudbeaverの設定と確認


そしたらデータベースの中身を見やすくするためにsqlクライアントを設定します

http://localhost:4040

にアクセス


こんな画面が表示されたかと思います

続いてNEXTを押して


左下のADMINISTRATOR CREDENTIALSのloginとpasswordを設定します
これはcloudbeaverにログインする情報になります
今回はわかりやすくデータベースのusername(system)とpassword(password)をそのまま設定します

そしたらNEXTを押して


FINISHします

すると多分先ほど入力したusernameとpasswordの入力を求められると思うので入力してログインしましょう


ログインしたら画面右上の歯車マークからAdministrationを選択


+ ADDをクリック


Oracleを選択


そしたら
  • Connection name: 適当で大丈夫
  • Host: oracle(docker-compose.ymlのoracleのサービス名)
  • Port: 1521
  • Database: XE
  • User name: system
  • User password: password
  • Service type: SID
  • Role: NORMAL

を設定して右上のCREATEをクリック


そしたら左上のCloudBeaverのロゴをクリックすると先ほど設定したコネクションが表示されているのでハンバーガーメニューのOpenをクリック



Schemasをクリックして表示された一覧から「SYSTEM」をOpen
多分一番下にUSERSテーブルがあると思うのでOpen


先ほどシードしたusersを確認することができました!

mailcatcherの確認


mailcatcherでメールがキャッチできるか確認します

root/src/routes/web.phpを編集

<?php

use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Mail; // 👈 追加

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider and all of them will
| be assigned to the "web" middleware group. Make something great!
|
*/

Route::get('/', function () {

    // 👇 こいつを追加
    Mail::raw('こんにちお', function ($message) {
        $message
            ->to('beginnerengineerblog@sample.com')
            ->bcc('beginnerengineer@sample.com')
            ->subject('Hello Beginner Engineer!');
    });

    return view('welcome');
});

http://localhost:8080/
にアクセスしてから以下にアクセス
http://localhost:1080/


大丈夫そうですね!


xdebugの確認


そしたら上記のweb.phpを以下のように編集

Route::get('/', function () {
    phpinfo(); // 👈 こいつを追加
    return view('welcome');
});

http://localhost:8080/

にアクセス


ちゃんと設定した値が設定されてるので大丈夫でしょう


終わりに


先人の方々はすごいですね本当いつも助けられています🙇‍♂️

今回laravel10とoracle21とどちらも最新(2023/3/17現在)での環境構築ということでしたが、oracle導入の手順は参考記事にさせていただいた内容とほとんど変わりなくなんとかできました。

また、oracle21cですが、
oracleでは本番環境でも使用できますみたいな感じで言ってますが、実際本番環境で使うのは少しリスクになりそうな気がします。
不安な場合は19cを利用するのがベストっぽいですね!
もし19cで構築する場合も参考記事や本記事を参考にして構築してみてください!

また、mac m1でもできましたとかあればコメントいただけると幸いです!


ということで

お疲れ様でした。
0
0
0
3
通信エラーが発生しました。
【広告】
似たような記事