【Docker】Oracleを無料で簡単にローカルに構築する
はじめに
Oracleは商用というイメージがあって、ライセンスもめちゃ高い。
インストールしたらしたで、環境を結構汚してくれて…アンインストールも面倒だったという結構前の印象が残ってた。
今回Docker
使って、わりと簡単にインストールができたので、その方法をまとめていこうかなと思います。
環境
以下のような環境で確認しています。
- Oracle Database 21c Express Edition
機能制限や、パフォーマンスの制限、パッチ提供が受けれないなどあるものの無料で利用できます。使えない機能というのも、わりと限定的なため一般的な利用であれば全然問題ないと思います。 - Windows 10
- Visual Studio Code
- Git
- docker-desktop
目標
コマンド一つで、以下のことまで出来上がっていること
- Oracleのサービスが起動している
-
PDB
、TABLESPACE
、USER
の作成が完了している - 権限周りの設定が完了している
- テーブルの作成が完了し、テストデータが投入されていること
構築の流れ
- Oracleのイメージ作成
MySQL
のように公式がDockerイメージを配布しているわけではないので、ビルドを実行しイメージを作成する必要があります。 - dockerコンテナ作成/起動
docker-compose.yml
を作成し、↑で作成したイメージからコンテナを作成&起動します。 - いろいろな
SQL
実行- コンテナ作成時に1回だけ実行する
-
PDB
の作成 -
TABLESPACE
の作成 - 権限周りの設定
-
- コンテナ起動毎に毎回実行
-
USER
のDROP
&CREATE
-
TABLE
のCREATE
- テストデータの
INSERT
-
- コンテナ作成時に1回だけ実行する
(1)Oracle Database イメージの作成
MySQL
と違い、Docker Imageは配布していないのでイメージをビルドするところからです。
リポジトリのクローン
任意のディレクトリに、公式リポジトリをクローンします。
git clone https://github.com/oracle/docker-images.git
ORACLE EXPRESS EDITIONのダウンロード
ここから、Express Editionをダウンロードします。
Oracle Database 21c Express Edition for Linux x64 ( OL7 )
を使って環境構築していきます。OL7
とOL8
は、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
を作成します。
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
ユーザとかでつながないと思います。コンテナ作成と同時にユーザとか一式を作成していきます。
SQL
実行
(3)環境構築用- コンテナ作成の時に、一度だけ実行する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ファイル修正
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
に作成する
# pdb作成用ディレクトリ
mkdir /opt/oracle/oradata/XE/pdb01
-- 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 スクリプト作成
-- 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;
-- 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を触ってみる
Discussion