🦔

【Docker】Oracleを無料で簡単にローカルに構築する

2022/02/20に公開

はじめに

Oracleは商用というイメージがあって、ライセンスもめちゃ高い。
インストールしたらしたで、環境を結構汚してくれて…アンインストールも面倒だったという結構前の印象が残ってた。

今回Docker使って、わりと簡単にインストールができたので、その方法をまとめていこうかなと思います。

環境

以下のような環境で確認しています。

  • Oracle Database 21c Express Edition
    機能制限や、パフォーマンスの制限、パッチ提供が受けれないなどあるものの無料で利用できます。使えない機能というのも、わりと限定的なため一般的な利用であれば全然問題ないと思います。
  • Windows 10
  • Visual Studio Code
  • Git
  • docker-desktop

目標

コマンド一つで、以下のことまで出来上がっていること

  • Oracleのサービスが起動している
  • PDBTABLESPACEUSERの作成が完了している
  • 権限周りの設定が完了している
  • テーブルの作成が完了し、テストデータが投入されていること

構築の流れ

  • Oracleのイメージ作成
    MySQLのように公式がDockerイメージを配布しているわけではないので、ビルドを実行しイメージを作成する必要があります。
  • dockerコンテナ作成/起動
    docker-compose.ymlを作成し、↑で作成したイメージからコンテナを作成&起動します。
  • いろいろなSQL実行
    • コンテナ作成時に1回だけ実行する
      • PDBの作成
      • TABLESPACEの作成
      • 権限周りの設定
    • コンテナ起動毎に毎回実行
      • USERDROP&CREATE
      • TABLECREATE
      • テストデータのINSERT

(1)Oracle Database イメージの作成

MySQLと違い、Docker Imageは配布していないのでイメージをビルドするところからです。

リポジトリのクローン

任意のディレクトリに、公式リポジトリをクローンします。

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

ORACLE EXPRESS EDITIONのダウンロード

https://www.oracle.com/jp/database/technologies/xe-downloads.html

ここから、Express Editionをダウンロードします。

Oracle Database 21c Express Edition for Linux x64 ( OL7 )を使って環境構築していきます。OL7OL8は、OSのバージョンの違いなので、基本的な流れは同じかなとは思ってますが…検証はしていないです。

リポジトリにダウンロードしたOracleを配置

上でダウンロードしたOracleをクローンしたリポジトリの以下ディレクトリに配置します。

docker-images\OracleDatabase\SingleInstance\dockerfiles\21.3.0

21.3.0のディレクトリは、ダウンロードしたOracleと合わせてください。

イメージ作成シェルの実行

cd docker-images\OracleDatabase\SingleInstance\dockerfiles\
.\buildContainerImage.sh -v 21.3.0 -x -i

パラメータ設定の細かいところは公式ドキュメントを参照してください

生成物確認

$ docker images
REPOSITORY        TAG         IMAGE ID       CREATED       SIZE
oracle/database   21.3.0-xe   6d27683dbb4b   13 days ago   6.54GB

イメージがビルドされ、dockerに登録されていることが確認できた。

(2)コンテナ作成&起動

ymlファイル作成

任意のディレクトリにdocker-compose.ymlを作成します。

docker-compose.yml
version: '3'

services:
  db:
    image: oracle/database:21.3.0-xe
    container_name: oracle21c
    ports:
      - 1521:1521
    volumes:
      - db-store:/opt/oracle/oradata
    environment:
      - ORACLE_PWD=passw0rd
volumes:
  db-store:

単純な、ymlファイルなので説明割愛。

Express Editionでは、Standard Editionと比べて、設定できる項目が結構少ないです。
設定できるパラメータなどは、公式ドキュメント:express editionを参照

作成 & 起動

docker-compose up -d

で起動&作成します。

docker-compose logs

でログ確認して以下のようなログが出てれば、Oracleが正常に起動しているかと思います。

#########################
DATABASE IS READY TO USE!
#########################

接続確認

  • 作成したコンテナに入って、sqlplusで起動確認してみます
    デフォルトでは、以下の3ユーザでログインできるようになっているはずです
exec -it oracle21c /bin/sh
sqlplus sys/<ymlで設定したパスワード>@//localhost:1521/XE as sysdba
sqlplus system/<ymlで設定したパスワード>@//localhost:1521/XE
sqlplus pdbadmin/<ymlで設定したパスワード>@//localhost:1521/XEPDB1

※ ExpressEditionでは、SIDはXE固定になります。

  • 接続ツールでも確認してみます

これでもDBとしては使えるのですが、普通はsysユーザとかでつながないと思います。コンテナ作成と同時にユーザとか一式を作成していきます。

(3)環境構築用SQL実行

  • コンテナ作成の時に、一度だけ実行するSQL
  • コンテナ起動のたびに、毎回実行するSQL
    をそれぞれ作成していきます。

概要

  • 以下のディレクトリにマウントするだけで、実行してくれます
    • コンテナ作成時に実行:
      /opt/oracle/scripts/setup or /docker-entrypoint-initdb.d/startup
    • コンテナ起動時に実行:
      /opt/oracle/scripts/startup or /docker-entrypoint-initdb.d/startup
  • .shファイル(カレントユーザでの実行) or .sqlファイル(sysdbaでの実行)が配置できます
  • 名前順に実行されるため、01_などのプレフィックスをつけることが推奨されています。

コンテナの削除

上で一度コンテナ作っている場合は、setupに配置したスクリプトを実行してくれないので削除します。その際利用しているvolumeも一緒に削除します。

docker-compose stop
docker rm oracle21c
docker volume rm oracle_db-store

ymlファイル修正

docker-compose
version: '3'

services:
  db:
    image: oracle/database:21.3.0-xe
    container_name: oracle21c
    ports:
      - 1521:1521
    volumes:
      - db-store:/opt/oracle/oradata
      - ./script/startup:/opt/oracle/scripts/startup # 追加
      - ./script/setup:/opt/oracle/scripts/setup  # 追加
    environment:
      - ORACLE_PWD=passw0rd
volumes:
  db-store:

ローカルのdocker-compose.ymlがあるディレクトリに、./script/startup/./script/setup/を作成する。

setup スクリプト作成

コンテナ作成時に実行するスクリプトを./script/startupに作成する

01_setup.sh
# pdb作成用ディレクトリ
mkdir /opt/oracle/oradata/XE/pdb01
02_setup.sql
-- PDBの新規作成(pdb$seedから作成)
CREATE PLUGGABLE DATABASE pdb01 ADMIN USER pdb01admin IDENTIFIED BY passw0rd
file_name_convert = ('/opt/oracle/oradata/XE/pdbseed/','/opt/oracle/oradata/XE/pdb01/');

-- PDBの起動
ALTER PLUGGABLE DATABASE pdb01 OPEN;

-- PDBの自動起動設定
ALTER PLUGGABLE DATABASE pdb01 SAVE STATE;

-- PDB切り替え(これがないと、コンテナ再起動時に「ORA-01109: database not open」が発生)
ALTER SESSION SET CONTAINER=pdb01;

-- ロール権限付与 
GRANT DBA TO PDB_DBA;

-- 表領域作成
CREATE TABLESPACE users
DATAFILE '/opt/oracle/oradata/XE/pdb01/users01.dbf' SIZE 300M
AUTOEXTEND ON NEXT 500K MAXSIZE UNLIMITED;

startup スクリプト作成

01_create_user.sql
-- PDBへ切り替え
ALTER SESSION SET CONTAINER=pdb01;

-- ユーザ削除
DROP USER hogeuser CASCADE;

-- ユーザ作成
CREATE USER hogeuser IDENTIFIED BY passw0rd
DEFAULT TABLESPACE users
QUOTA UNLIMITED ON users
TEMPORARY TABLESPACE temp;

-- 作成ユーザへ権限付与
GRANT CREATE SESSION TO hogeuser;
GRANT RESOURCE TO hogeuser;
GRANT UNLIMITED TABLESPACE TO hogeuser;
02_create_tb_sample.sql
-- PDBへ切り替え
ALTER SESSION SET CONTAINER=pdb01;

-- テーブル作成するユーザ(変数定義)
DEFINE USER_NAME='hogeuser';

-- テーブル作成
CREATE TABLE &USER_NAME..tb_sample
(
    col1 VARCHAR2(10) NOT NULL,
    col2 VARCHAR2(50),
    col3 VARCHAR2(30),
    CONSTRAINT pk1 PRIMARY KEY(col1)
 ) 
;

-- データ挿入
INSERT INTO &USER_NAME..tb_sample values('111', '2221', '3331');
INSERT INTO &USER_NAME..tb_sample values('112', '2222', '3332');
INSERT INTO &USER_NAME..tb_sample values('113', '2223', '3333');
INSERT INTO &USER_NAME..tb_sample values('114', '2224', '3334');
INSERT INTO &USER_NAME..tb_sample values('115', '2225', '3335');
INSERT INTO &USER_NAME..tb_sample values('116', '2226', '3336');
INSERT INTO &USER_NAME..tb_sample values('117', '2227', '3337');
COMMIT;

接続確認

作成したユーザでログインして、テーブルが作成されていることを確認します。

さいごに

基本的に、コピペでも大体なんとかなるのでは…ってところまで書いた。また使うときになったら、簡単に使えそう。

Oracleも久々だったので、だいぶ調べるのに時間がかかった。使う分にはDBの設定回りのこと気にしないからなぁ・・・参考にさせてもらったサイトにはだいぶ助けられた感じです。

参考にしたサイト

DockerでOracle Databaseを使う
Dockerを使って環境を汚さずOracle Databaseを触ってみる

マルチテナントとは?
PDBの作成方法
Oracleプラガブル・データベースPDB【表領域・ユーザーの作成手順】

Discussion