こちらの記事を参考に、Oracle 19cをWindows 10上のDockerで動かしてみた。
[環境情報]
Windows 10 Pro (OSビルド19042.746)
Docker Desktop 3.1.0 (51484)
Oracle Database 19.3.0
VS Code 1.52.1
Remote - Containers v0.155.1
[セットアップ]
▼Dockerイメージの準備
git cloneの手順は参考記事と同じ。
git clone https://github.com/oracle/docker-images.git
以下の公式サイトから、Linux x86-64用の「19.3 - Enterprise Edition (also includes Standard Edition 2)」のZIPファイルをダウンロードする*1。
ファイル名はLINUX.X64_193000_db_home.zipとなっていた。
ダウンロードしたZIPファイルを、クローンしたリポジトリに配置する。
cd docker-images/OracleDatabase/SingleInstance/dockerfiles/19.3.0 cp ~/Downloads/LINUX.X64_193000_db_home.zip .
Dockerイメージをビルドする。参考記事では12cを利用していたが、バージョンの指定を19c用に変更した。マシンスペックが貧弱だったのか、ビルドには30分ちょっとかかった。
cd .. ./buildDockerImage.sh -v 19.3.0 -e -i
▼Dockerの設定
プロジェクトディレクトリを作成する。
mkdir ./oracle_test
データ永続化用のディレクトリを作成する。
mkdir ./oracle_test/oradata chmod 777 ./oracle_test/oradata
参考記事に書かれているように、続けて./oracle_test/docker-compose.ymlファイルを作成してもよい。
しかし、用意されているOracle Linux 7イメージには、viなどのテキストエディタがインストールされていないため、設定ファイルの変更などが難しい。参考記事に記載のとおりdocker exec -it (コンテナ名) bashでコンテナに接続した場合、sudoコマンドも利用できないため、viをインストールすることができない。
これは、docker exec -it -u root (コンテナ名) bashとルートアカウントでコンテナに接続することで回避できる。こうするとyum install viコマンドでviをインストールでき、コンテナライフが少しマシになる。
今回は、コンテナの設定ファイルの修正のほか、初期化パラメータファイルの書き換えなども必要となった。そのため、慣れているVS Codeでファイルの編集もできるようにVS Codeの拡張機能Remote - Containersを利用する。
Remote - Containersのための設定ファイル(./oracle_test/.devcontainer/devconntainer.json)を作成する。
{
"name": "Oracle19 on Docker",
"dockerComposeFile": [
"../docker-compose.yml"
],
"service": "db",
"workspaceFolder": "/workspace",
"settings": {
"terminal.integrated.shell.linux": null
},
"extensions": []
}
また、Remote - Containersのためのワークスペースディレクトリを作成する。
mkdir ./oracle_test/workspace
最後に、./oracle_test/docker-compose.ymlファイルを作成する。ファイルの中身は以下の通り。
version: '2'
services:
db:
image: oracle/database:19.3.0-ee
container_name: oracle19
ports:
- 1521:1521
- 5500:5500
volumes:
- .oradata:/opt/oracle/oradata
- .workspace:/workspace:cached
environment:
# これがDBユーザーのパスワード
- ORACLE_PWD=Oracle19
- ORACLE_PDB=oracle
Remote - Containers拡張機能をインストールしたVS Codeでこのプロジェクトディレクトリ(./oracle_test)を開くと、自動的にOracle Database入りのコンテナが起動する。
残念ながら、Oracle Databaseの初回起動にもやはり30分程度の時間がかかる。2回目以降もそれなりに時間がかかる。Mac上でDockerを実行してもこれは変わらないらしい。
Oracle Databaseが起動したら、VS Codeのターミナルを開くと、以下のようにコンテナ内からコマンドを実行することができる。
[oracle@affb23e08e80 workspace]$ sqlplus SYSTEM/Oracle19@ORCLCDB SQL*Plus: Release 19.0.0.0.0 - Production on Thu Jan 28 19:02:46 2021 Version 19.3.0.0.0 Copyright (c) 1982, 2019, Oracle. All rights reserved. Last Successful login time: Thu Jan 28 2021 18:53:31 +00:00 Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.3.0.0.0 SQL>
[マルチテナント環境の共通ユーザー接頭辞]
マルチテナント・コンテナ・データベースとしてOracle Databaseをセットアップしている場合、COMMON_USER_PREFIXパラメータが有効になる。
これにより、Oracle Databaseにユーザーを作成する際は、共通の接頭辞をつけていないといかのようにエラーとなってしまう。
SQL> CREATE USER kdnakt IDENTIFIED BY dummypassword; CREATE USER kdnakt IDENTIFIED BY dummypassword * ERROR at line 1: ORA-65096: invalid common user or role name
このサイトを参考にしながら、COMMON_USER_PREFIXを空文字に修正することで、プレフィクス制限を回避する。
SQL> ALTER SYSTEM SET common_user_prefix='' scope=spfile; System altered. SQL>
ここで、sqlplusから直接Oracle Databaseを再起動しようとすると権限不足のエラーが表示された。
SQL> STARTUP FORCE ORA-01031: insufficient privileges
権限のあるユーザーで実行すればよいのだが、その方法がいまいちわからなかった。
ので、諦めてDockerコンテナを再起動することにした。VS Codeのコマンドから、Rebuild Containerを選択すると再起動できる。

コンテナが起動したあと、さらにDBが起動するのを待って、再びVS Codeのターミナルを開いてsqlplusで接続する。
COMMON_USER_PREFIXの設定値を確認すると、意図どおり変更できていた。
SQL> SHOW PARAMETER common_user_prefix; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ common_user_prefix string SQL>
ユーザーを作成してみると、今度は接頭辞なしで問題なく作成できた。
SQL> CREATE USER kdnakt IDENTIFIED BY dummypassword; User created. SQL>