Docker-Oracle11XEの導入
メモリ1GBのチープなマシンに、Dockerを使ってOracle11XE(Express Edition)を導入しました。
背景
以前は、あるお客様のVPSを使わせていただき、オラクル12cのDockerコンテナを導入して使っていました。
そのVPSは、メモリ2GBでCPUは3コア。特にリソースを意識することなくインストールできました。
今回は、個人で契約した格安VPS(メモリ1G、CPU2コア)にオラクルのDockerコンテナを導入しました。
いくつかトラブルもありましたが、無事導入に成功はしましたので、記事にしておきます。
Oracle12c起動せず
こちらの手順に従って、前述のチープなマシンに12cをインストールしたところ、コンテナは起動しますがログにエラーが出力されており、導入に失敗しました。
$docker logs -f oracle
[WARNING] [DBT-11209] Current available physical memory is less than the required physical memory (2,048MB) for creating the database.
—— 中略 ——
/opt/oracle/checkDBStatus.sh: line 26: sqlplus: command not found
##########################################
################ E R R O R #################
DATABASE SETUP WAS NOT SUCCESSFUL!
Please check output for further info!
################# E R R O R################
#########################################
ログを出力したところ、上記のようにメモリ不足のためデータベースの作成に失敗しているようです。
Dockerコンテナは起動するのですが、データベースが存在しないためオラクルインスタンスは起動していない状況です。
そこで、別なバージョンであればメモリ要件が緩和されているのではと思い、後述のDockerイメージ作成用のスクリプト群を確認すると、以下のバージョンがサポートされているようです。
11.2.0.2、12.1.0.2、12.2.0.1、18.3.0、18.4.0、19.3.0
11.2.0.2(Oracle11XE)のシステム要件(下記)では、メモリが最小256Mですのでこのバージョンを導入します。
導入作業
以下のように、CentOS+Dockerの環境上に、オラクル11gXEのコンテナを導入します。
インストール媒体の入手と配置
1.インストール媒体の入手
以下のサイトからOracle11gXEのインストール媒体(oracle-xe-11.2.0-1.0.x86_64.rpm.zip、約300MB)を入手します。
入手にはオラクルのアカウント登録(無償)が必要です。
https://www.oracle.com/database/technologies/xe-prior-releases.html
2.Dockerイメージ作成用スクリプトを入手
次に、GitHubからDockerイメージを作成するためのスクリプトを入手します。以下のコマンドではカレントディレクトリ(以降、$HOME)に展開されます。
$ git clone https://github.com/oracle/docker-images.git
3.インストール媒体の配置
入手したインストール媒体(oracle-xe-11.2.0-1.0.x86_64.rpm.zip)を、2.で入手したDockerイメージ作成用スクリプトの以下のディレクトリに配置(移動やコピー)します。
$HOME/docker-images/OracleDatabase/SingleInstance/dockerfiles/11.2.0.2
コンテナのビルド
1.ディレクトリの移動
インストール用のスクリプトのある以下のディレクトリへ移動します。
$HOME/docker-images/OracleDatabase/SingleInstance/dockerfiles/
2.物件配置状況の確認
インストール媒体を配置したディレクトリのファイルを確認します。
[takamoto@Moselle dockerfiles]$ ls -l 11.2.0.2/
total 308524
drwxrwxr-x 2 takamoto takamoto 4096 Oct 4 15:30 .
drwxrwxr-x 8 takamoto takamoto 4096 Oct 3 17:12 ..
-rw-rw-r– 1 takamoto takamoto 70 Oct 3 17:12 Checksum.xe
-rw-rw-r– 1 takamoto takamoto 3597 Oct 3 17:12 Dockerfile.xe
-rwxrwxr-x 1 takamoto takamoto 999 Oct 3 17:12 checkDBStatus.sh
-rw-r–r– 1 takamoto takamoto 315891481 Oct 4 15:28 oracle-xe-11.2.0-1.0.x86_64.rpm.zip
-rw-rw-r– 1 takamoto takamoto 7088 Oct 3 17:12 runOracle.sh
-rw-rw-r– 1 takamoto takamoto 193 Oct 3 17:12 setPassword.sh
-rw-rw-r– 1 takamoto takamoto 2943 Oct 3 17:12 xe.rsp
拡張子.xeのファイルがあることからも、インストールのターゲットがOracle11XEであることがわかります。
ここで注意ですが、ディレクトリ名は11.2.0.2なのですが、OracleXE11は11.2.0.1しか入手できません。(11.0.2.2のXEが存在するかは不明)
実際には、末端のレビジョンが異なっていても問題なくインストールできます。
3.Dockerコンテナビルドスクリプトの実行
以下のようにDockerコンテナのビルド用スクリプトを実行します。
$ ./buildDockerImage.sh -v 11.2.0.2 -x -i
スクリプトの引数は以下のようになっています(buildDockerImage.shの抜粋)ので、上記はバージョンを指定しチェックサムを無視してExpressEditionの導入指定をしたことになります。
———————– buildDockerImage.shの抜粋 —————————
Parameters:
-v: version to build
Choose one of: $(for i in $(ls -d */); do echo -n “${i%%/} “; done)
-e: creates image based on ‘Enterprise Edition’
-s: creates image based on ‘Standard Edition 2’
-x: creates image based on ‘Express Edition’
-i: ignores the MD5 checksums
-o: passes on Docker build option
約1分でビルドが完了し、以下のようなメッセージが表示されれば、コンテナのビルドは成功です。
Successfully built cac7cdd96396
Successfully tagged oracle/database:11.2.0.2-xe
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 63 seconds.
コンテナの起動とログ確認
1.docker-compose.yamlの作成
コンテナ起動は、”docker run”でも可能ですが、引数が多いためdocker-composeにてコンテナを起動します。
任意のディレクトリに、以下のdocker-compose.yamlファイルを作成します。
—————————– docker-compose.yaml の内容 ————————–
version: ‘2’
services:
db:
image: oracle/database:11.2.0.2-xe
container_name: oracle
ports:
– XXXX:1521
– XXXX:5500
volumes:
– /home/takamoto/oracle/oradata:/opt/oracle/oradata
environment:
– ORACLE_PWD=PASSWORD
– ORACLE_PDB=DBNAME
shm_size: 1g
おそらく、”volumes”タグは不要です。この理由は、XEは表領域に設定するファイルを任意に設定できない(システム固定)ためです。
また、”shm_size”タグを設定しておかないと、実装メモリの少ないマシンでは起動に失敗します。
2.コンテナ起動
docker-composeにて、コンテナを起動します。
$ docker-compose up -d
Creating oracle … done
3.ログ確認
最後にログを確認します。
$ docker logs -f oracle
以下のようなログが表示されれば、オラクルインスタンスの起動は完了です。
SQL> Disconnected from Oracle Database 11g Express Edition Release 11.2.0.2.0 – 64bit Production
#######################
DATABASE IS READY TO USE!
#######################
The following output is now a tail of the alert.log:
Current log# 5 seq# 4 mem# 0: /u01/app/oracle/oradata/XE/redo05.log
ALTER DATABASE DROP LOGFILE GROUP 1
Deleted Oracle managed file /u01/app/oracle/fast_recovery_area/XE/onlinelog/o1_mf_1_hqlzqkw8_.log
Completed: ALTER DATABASE DROP LOGFILE GROUP 1
ALTER DATABASE DROP LOGFILE GROUP 2
Deleted Oracle managed file /u01/app/oracle/fast_recovery_area/XE/onlinelog/o1_mf_2_hqlzql3c_.log
Completed: ALTER DATABASE DROP LOGFILE GROUP 2
Cleared LOG_ARCHIVE_DEST_1 parameter default value
Using LOG_ARCHIVE_DEST_1 parameter default value as /u01/app/oracle/product/11.2.0/xe/dbs/arch
ALTER SYSTEM SET db_recovery_file_dest=” SCOPE=BOTH;
参考
私の環境ではユーザーsysで接続しようとすると以下のように失敗しました。
[takamoto@Moselle oracle]$ docker container exec -it oracle
bash-4.2# sqlplus /nolog
SQL> connect sys as sysdba
ERROR:
ORA-12547: TNS:lost contact
解決方法としては、コンテナ内のオラクルの実行モジュールのパーミッションを変更することで接続に成功しました。
bash-4.2# chmod 6751 /$ORACLE_HOME/bin/oracle
bash-4.2# sqlplus /nolog
SQL> connect sys as sysdba
Enter password:
Connected.
SQL>
これは、結構有名な話のようで、ネット上にも色々情報がありました。
まとめ
最初は12cが起動できず、悩みましたが、私が使う機能は11gで十分だったので、悪くない選択だったかなと思います。
また、オラクル12cの場合は、インストール媒体が2GB(11XEは300MB)、コンテナ作成時間が10分以上(11XEは1分)でしたので、11XEは相当に軽いといえます。