目次
Docker 化された Oracle 19.3.0 で DB の起動時間を 45 分から 3 分に短縮
公式ガイドを使用してOracle EE 19.3.0のdockerイメージを構築したところ、起動時間は45分以上かかりました。統合テスト中にそれを使用したかったので、時間が許容できませんでした。この時間を 3 分未満に短縮することができました。以下にこれを行う方法についてのガイドを紹介します。さらに、あまり人気のない Docker 機能の使用。乞うご期待!
oracle/docker-image 19.3.0 の構築と実行
- GitHub から公式プロジェクトをダウンロードhttps://github.com/oracle/docker-images
LINUX.X64_193000_db_home.zip
Oracle Web サイトhttps://www.oracle.com/database/technologies/oracle19c-linux-downloads.htmlから公式データベース インストール ファイルをダウンロードします。- プロジェクト内の適切なディレクトリに配置します。
/OracleDatabase/SingleInstance/dockerfiles/19.3.0
- 重要!ファイルを開いて
/OracleDatabase/SingleInstance/dockerfiles/19.3.0/Dockerfile
行を削除しますVOLUME ["$ORACLE_BASE/oradata"]
。その理由については後ほど説明します。 - 実行する
./buildDockerImage.sh -v 19.3.0
- 待って。
最後のコマンドが終了したとき (しばらく時間がかかります)。ローカルの Docker リポジトリで Oracle データベースを使用できるようにする必要があります。これで、イメージを開始できます。
docker run -d -p 5500:5500 -p 1521:1521 -e ORACLE_PWD=GG_PASS oracle/database:19.3.0-ee
コマンドには約 45 分かかり、データベースが起動して実行されるはずです。ここで少し驚かれるかもしれませんが、はい、新しい Oracle DB を起動するのはそれほど高速ではありません。データベースは、最初の実行時に初期インストールのような処理を実行します。このアプローチは、ディスク容量を大幅に節約できるため、合理的です。
データベースを構成して起動を待たないようにする方法は?
コンテナーを起動および停止する場合、データベースの起動は非常に高速です (数分)。この利点は、新しいイメージを使用するテスト プロセスまたは CI では機能しません。テスト中は、最小限の構成でデータベースを迅速に起動することが期待されます。できるだけ早く。馬鹿げた45分ではありません。これは受け入れられません。しかし、最初に設定に戻りましょう。
Docker の世界における「クリーンな」構成方法は、Dockerfile を指します。そこにいくつかのコマンドを追加し、イメージをビルドします。繰り返しますが、これには1時間かかります。間違えたら数時間。ここでは、ベスト プラクティスではなくパフォーマンスに焦点を当てたいと思います。DB を構成する最も簡単な方法は、実行中の DB に接続し、いくつかの SQL コマンドを実行することです。を介してこれを実行しましょうsqlplus
。
- Docker 化された DB の ID を見つけます。
docker ps
- DB コンテナ内で bash を開きます。
docker exec -it 0f4acaaca803 /bin/bash
- DB ターミナルを開始します。
sqlplus sys/GG_PASS@//localhost:1521/ORCLCDB as sysdba
この時点で、任意のコマンドを実行してデータベースを構成できます。ユーザーを作成して、いくつかの権限を付与しましょう。
CREATE USER GG_TEST identified BY GG_TEST;
GRANT CREATE ANY MATERIALIZED VIEW, CREATE JOB, CONNECT, RESOURCE, CREATE ANY VIEW TO GG_TEST;
GRANT UNLIMITED TABLESPACE TO GG_TEST;
おめでとう!設定が完了しました。ちょっと待って。構成はコンテナーの実行時に適用されました。そのコンテナを別の場所で起動することはできませんよね? 間違い!をプレゼントしたいと思いますdocker commit
。
非常に便利なコンテナ構成
現在の構成のスナップショットを保存するには、次のコマンドを実行します。
docker commit — author "Author <your@email>" — message "Quick snapshot" 0f4acaaca803 ggajos/oracle-ee:19c-quick
このコマンドは、DB コンテナを一時停止し、スナップショットを実行します。結果は画像に変換され、タグ付けされますggajos/oracle-ee:19c-quick
。これで、特定の瞬間のコンテナをどこでも再作成できるようになりました。DB の状態をすぐにリセットしたい場合にも非常に便利です。スナップショットを実行するには、タグを使用できます。
docker run -d -p 5500:5500 -p 1521:1521 ggajos/oracle-ee:19c-quick
終わり!データベースはすでに起動および構成されているため、起動時間は非常に短くなります (数分)。コマンドを実行する前に適用されたすべての実行時カスタマイズが含まれますdocker commit
。
Dockerfile から VOLUME を削除したのはなぜですか?
外部ボリュームを使用する場合は何も機能しません。これが、volume コマンドが初期の Dockerfile から削除された理由です。Commit コマンドは、外部ボリュームのデータ スナップショットを実行できません (実行すべきではありません)。通常、データ ファイルはコンテナーの外に置きます。しかし、この場合は違います。状態全体を管理できるように、すべてのファイルをコンテナー内に配置する必要があります。
注意!過剰摂取しないでください。
(Oracle の世界では) 驚異的なパフォーマンスを達成しましたが、欠点はほとんどありません。
- 起動時にパラメータを渡すことができなくなりました。公式の Oracle Docker イメージでは、パスワード
-e ORACLE_PWD=GG_PASS
またはその他の引数を渡すことができます。DB スナップショットには、すでに開始されているデータベースが含まれています。引数はすでに消費されています。 - 画像のサイズははるかに大きくなります。バニラの Oracle EE Docker イメージの容量は約 5GB です。上記の操作を実行すると、10 GB を超えるイメージが生成される可能性があります。私の場合は13GBでした。
- イメージには Dockerfile がありません。句内では使用できません
FROM
。ライフサイクルは手動になります。
あなたの場合、すべての欠点が大丈夫かどうかを検討する必要があります。ターゲット データベースで完全な統合テストを実行できることは、大きな利点です。テスト時間は重要です。新しい Oracle DB を数分でローカルまたは CI 上で実行できることは、間違いなく大きな資産です。