#chiroito ’s blog

Java を中心とした趣味の技術について

Docker 上に構築した Oracle Database のパスワードを変える

 Oracle 公式の Docker イメージで Oracle Database を構築すると docker run した時にパスワードが出力されます。(パスワードは下のZ6koiFT2K8A=)

> docker run --name orcl oracle/database:12.1.0.2-ee

ORACLE AUTO GENERATED PASSWORD FOR SYS, SYSTEM AND PDBAMIN: Z6koiFT2K8A=

 セキュリティ要件を満たすパスワードや自分が憶えやすいパスワードに変更するのではないでしょうか。 また、うっかり見忘れたり、久しぶりに起動したためどんなパスワードを設定したか忘れてしまうこともあるかと思います。
 Oracle Database には様々な管理者があるため、自分しか使わない環境でしたら全てのパスワードを同一にしたいところですが個別に変更することが大変だったり、そもそも Oracle Database に詳しくないためパスワードを変える方法が分からなかったりというこもあるでしょう。
 Oracle 公式の Docker イメージに含まれてる管理者のパスワードを一括で変更するシェルを使うことで、管理者のパスワードを一括で変更することが出来ます。

次の通り、 orcl という名前の Docker コンテナで Oracle Database が動いているものとします。

> docker ps
CONTAINER ID   IMAGE                         COMMAND                  CREATED       STATUS       PORTS                    NAMES
5712e265f393   oracle/database:12.1.0.2-ee   "/bin/sh -c $ORACLE_B"   8 hours ago   Up 7 hours   0.0.0.0:1521->1521/tcp   orcl

 パスワードの設定は、ワークディレクトリにある setPassword.sh を使用して、第一引数にパスワードを与えることで設定できます。今回の例ではパスワードとして pAssw0rd を指定します。

> docker exec orcl ./setPassword.sh pAssw0rd
The Oracle base remains unchanged with value /opt/oracle

SQL*Plus: Release 12.1.0.2.0 Production on Wed Dec 28 15:09:24 2016

Copyright (c) 1982, 2014, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL>
User altered.

SQL>
User altered.

SQL>
Session altered.

SQL>
User altered.

SQL> Disconnected from Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

これだけでパスワードの設定変更は完了です。確認のためユーザ名に sys、パスワードに新しく設定したパスワード、ロールに SYSDBA 権限を選択してデータベースサーバへログインしてみてください。

公式 Oracle Database の Docker イメージを構築

Oracle 公式のスクリプトを使用して Oracle Database を Docker 上に構築します。今回は Oracle Database Enterprise Edition 12.1.0.2.0 を構築します。

データベースを構築するまでの手順は次の通りです。

  1. oracle/docker-images の準備
  2. インストールバイナリの準備
  3. Oracle Database 環境の作成
  4. データベースの作成
  5. 接続確認

oracle/docker-images の準備

Oracle 社公式の Dockerイメージを作成するスクリプト群が Github 上で公開されています。[Clone or download]ボタンを押してダウンロードするか、Git を使用してダウンロードしてください。

github.com

docker-images/OracleDatabase ディレクトリが Oracle Database 用のスクリプト群です。

インストールバイナリの準備

インストールバイナリは次のリンクからOTNライセンスに同意の上ダウンロードします。インストールするエディションと OS ごとにバイナリが異なります。エディションを選択の上、Linux x86-64 の File 1 と File 2 の両方をダウンロードしてください。今回は 12.1.0.2.0 の Enterprise Edition を使用します。

Oracle Database ソフトウェア・ダウンロード

ダウンロードした 2 つのバイナリは zip 形式のまま docker-images/OracleDatabase/dockerfiles/12.1.0.2 ディレクトリへ格納してください。

Oracle Database 環境の作成

Oracle Database の環境作成はシェルスクリプトを実行するだけです。シェルスクリプトには引数としてバージョンとエディションを選択します。現時点でのバージョンは 11.2.0.2 と 12.1.0.2 を選択できます。今後新しいバージョンがリリースされると選択できるバージョンが変わる可能性がありますのでご注意ください。選択できるエディションは選択したバージョンによって異なります。バージョンに 11.2.0.2 を選択すると Expres Edition (XE)、12.1.0.2 を選択すると Standard Edition 2 (SE)、Enterprise Edition (EE) から選択できます。

シェルスクリプトは docker-images/OracleDatabase/dockerfiles にある buildDockerImage.sh を使用します。引数は -v オプションに続いてバージョンを指定し、選択したエディションによって XE が -x、SE が -s、EE が -e を指定します。

今回はOracle Database Enterprise Edition 12.1.0.2 の環境を作成します。

> cd docker-images/OracleDatabase/dockerfiles
> ./buildDockerImage.sh -v 12.1.0.2 -e

Oracle Database Docker Image for 'ee' version 12.1.0.2 is ready to be extended:

  --> oracle/database:12.1.0.2-ee

Build completed in 1486 seconds.

データベースの作成

Oracle Database はマルチテナントに対応しており、コンテナデータベースとプラガブルデータベースで構成されています。この Docker イメージではコンテナデータベースと 1 つのプラガブルデータベースを作成します。データベースの作成ではこの 2 つのデータベースの名前を環境変数として指定します。 Oracle Database が使用するポートは作成したデータベースに接続するポートと管理ツールへアクセスするポートがあります。

コンテナデータベースの名前に相当する環境変数は ORACLE_SID、プラガブルデータベースの名前に相当する環境変数は ORACLE_PDB です。データベースへ接続するポートは 1521 、管理ツールへアクセスするポートは 5500 です。また、データベースのデータは /opt/oracle/oradata に格納されます。

今回は、orcl と言う名前のコンテナデータベースと pdb1 という名前のプラガブルデータベースを作成します。両ポートとも Docker ホストの同じポートへバインドし、データの格納されるディレクトリは Docker ホストの /mnt/oradata にマッピングします。 起動すると管理ユーザ用のパスワードが出力されますのでご注意ください。この例ではパスワードは下記のZ6koiFT2K8A=になります。

> docker run --name orcl -p 1521:1521 -p 5500:5500 -v /mnt/oradata:/opt/oracle/oradata \
> -e ORACLE_SID=orcl -e ORACLE_PDB=pdb1 oracle/database:12.1.0.2-ee

ORACLE AUTO GENERATED PASSWORD FOR SYS, SYSTEM AND PDBAMIN: Z6koiFT2K8A=

LSNRCTL for Linux: Version 12.1.0.2.0 - Production on 28-DEC-2016 02:07:20

Copyright (c) 1991, 2014, Oracle.  All rights reserved.

Starting /opt/oracle/product/12.1.0.2/dbhome_1/bin/tnslsnr: please wait...

TNSLSNR for Linux: Version 12.1.0.2.0 - Production
System parameter file is /opt/oracle/product/12.1.0.2/dbhome_1/network/admin/listener.ora
Log messages written to /opt/oracle/diag/tnslsnr/cbd0712a61e2/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 12.1.0.2.0 - Production
Start Date                28-DEC-2016 02:07:22
Uptime                    0 days 0 hr. 0 min. 1 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /opt/oracle/product/12.1.0.2/dbhome_1/network/admin/listener.ora
Listener Log File         /opt/oracle/diag/tnslsnr/cbd0712a61e2/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
The listener supports no services
The command completed successfully
Copying database files
27% complete
Creating and starting Oracle instance
45% complete
Completing Database Creation
72% complete
Creating Pluggable Databases
100% complete
Look at the log file "/opt/oracle/cfgtoollogs/dbca/orcl/orcl.log" for further details.

SQL*Plus: Release 12.1.0.2.0 Production on Wed Dec 28 02:22:29 2016

Copyright (c) 1982, 2014, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL>
System altered.

SQL>
Pluggable database altered.

SQL> Disconnected from Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
#########################
DATABASE IS READY TO USE!
#########################
XDB installed.

XDB initialized.
Resize operation completed for file# 4, old size 240640K, new size 250880K
Wed Dec 28 02:22:21 2016
Resize operation completed for file# 4, old size 250880K, new size 256000K
Wed Dec 28 02:22:29 2016
ALTER SYSTEM SET control_files='/opt/oracle/oradata/orcl/control01.ctl' SCOPE=SPFILE;
      ALTER PLUGGABLE DATABASE pdb1 SAVE STATE
Completed:       ALTER PLUGGABLE DATABASE pdb1 SAVE STATE

2016年12月28日現在では Docker ホストが保存領域として NFS や ZFS を使用している場合にはデータベースの作成でエラーが出てしまいます。プルリクをしているのでマージされればこの様な環境でもエラーが起きなくなるはずです。

Fixed :Oracle Database 12c EE -ORA-48122: error with opening the ADR block file by chiroito · Pull Request #242 · oracle/docker-images · GitHub

接続確認

構築したデータベースへ接続してみましょう。 接続するためのツールは、データベースへの接続では Oracle SQL Developer を使用し、管理ツールである Oracle Enterprise Manager Database Express への接続ではブラウザを使用します。 Docker ホストの IP アドレスは 192.168.0.3 です。環境に応じて適宜読み替えてください。

Oracle SQL Developer

図はプラガブルデータベースへの接続例です。プラガブルデータベースへの接続はユーザ名に sys 、パスワードに先ほど出力された Z6koiFT2K8A=、ロールに SYSDBA を選択、ホスト名に Docker ホストの IP アドレス、ポートに 1521、サービス名に ORACLE_PDB で指定した pdb1 を指定します。 f:id:chiroito:20161228150947p:plain

コンテナデータベースへの接続はサービス名の代わりに SID に ORACLE_SID で指定した orcl を指定します。

Oracle Enterprise Manager Database Express

ブラウザで次の URL へアクセスします。

https://192.168.0.3:5500/em/

ユーザ名に sys 、パスワードに先ほど出力された Z6koiFT2K8A=、SYSDBA 権限を選択し、ログインボタンを押すとログインできます。

f:id:chiroito:20161228210311p:plain

OracleJDKのDocker イメージで任意のアプリケーションを実行する

Oracle JDK の Docker イメージ上で Java SE のアプリケーションを実行するには以下の手順が必要です。

  1. アプリケーションの用意
  2. OracleJDK 環境構築
  3. アプリケーションの実行

アプリケーションの用意

現場で使う場合には CI ツールでビルドされた jar/war/ear などのアーカイブをコピーして実行や、Git などのバージョン管理システムから最新のソースを取得して、maven などでビルドして実行するかと思います。 今回は簡単に試せるように、次のソースコード(HelloWorld.java)を渡して、Java SE のアプリケーションを作成します。

HelloWorld.java

public class HelloWorld {
    public static void main(String[] args){
        System.out.println("Hello World");
    }
}

OracleJDK 環境構築

Java SE のアプリケーションは JDK をインストールされていれば実行可能です。Java EE のアプリケーションを動かす場合には アプリケーションサーバがインストールされている環境が必要ですが、jar ファイルに組み込むアプリケーションサーバの場合は本手順で同様に実行できます。

Oracle JDK のDocker環境構築方法はこちらをご参照ください。

chiroito.hatenablog.jp

Java のアプリケーションを実行するまでの手順はソースコードをクラスファイルへコンパイルして、必要であれば Jar ファイルなどへアーカイブします。 今回はソースファイルが1つだけなのでクラスファイルを作成してアーカイブは行いません。

Dockerfile

FROM oracle/serverjre:8
COPY HelloWorld.java ~/
WORKDIR ~/
RUN javac HelloWorld.java
CMD ["java","HelloWorld"]

アプリケーションの実行

ここまで準備が出来たらビルドして実行します。ビルドや実行のオプションは必要に応じて変更します。

Docker ビルド

docker build -t hello .

Sending build context to Docker daemon 4.096 kB
Step 1 : FROM oracle/serverjre:8
 ---> baadd9279b4b
Step 2 : COPY HelloWorld.java ~/
 ---> 4215555f2923
Removing intermediate container 6701f92ad8e2
Step 3 : WORKDIR ~/
 ---> Running in a07a9ddf6e20
 ---> 441c75073eb9
Removing intermediate container a07a9ddf6e20
Step 4 : RUN javac HelloWorld.java
 ---> Running in 08ab5a1ee051
 ---> 30b2b81f1eb1
Removing intermediate container 08ab5a1ee051
Step 5 : CMD java HelloWorld
 ---> Running in 41a064eb6631
 ---> b87a08d86b08
Removing intermediate container 41a064eb6631
Successfully built b87a08d86b08

実行

最後に、作成したアプリケーションを Docker 上で実行してみましょう。
$ docker run hello

Hello World

これで任意のアプリケーションを実行することが出来るようになります。