こちらの記事を参考に、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>