[Database, Docker] Creating and Oracle Database Docker image

原文はこちら。
https://blogs.oracle.com/developer/entry/creating_and_oracle_database_docker

Oracle Database用のDockerビルドファイルがGitHubにリリースされています。
Oracle Database on Docker
https://github.com/oracle/docker-images/tree/master/OracleDatabase
これらのビルドファイルを使うと、Oracle Databaseの自身のDockerイメージを作成できます。Dockerをご存知ない方は、以下のリンクをどうぞ。
Docker
https://www.docker.com/
Linuxコンテナテクノロジーをベースとした、アプリケーションなどをコンテナ化することができる非常にクールなテクノロジーです。データベースのコンテナ化までに要する時間はそれほどかからず、特に開発、検証環境のためには有用です。Oracleが提供しているビルドファイルを使ってOracle Databaseをコンテナ化する方法を見ていきましょう。

What you need

Environment

テストに使った環境は以下の通りです。
  • Oracle Linux 7.2 (4.1.12-32.2.1.el7uek.x86_64)
  • Docker 1.10.3 (docker-engine.x86_64 1.10.3-1.0.3.el7)
  • Oracle Database 12.1.0.2 Enterprise Edition

Docker setup

まず、Dockerをセットアップしますが、幸運にもDockerがPublic Yumパッケージとして提供されているので、これは非常に簡単です。作業はdocker-engineパッケージをrootユーザとしてインストールするだけでOKです。
[root@localhost ~]# yum install docker-engine
Loaded plugins: langpacks, ulninfo
Resolving Dependencies
--> Running transaction check
---> Package docker-engine.x86_64 0:1.10.3-1.0.3.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

=====================================================================================================================================
 Package                           Arch                      Version                               Repository                     Size
=====================================================================================================================================
Installing:
 docker-engine                     x86_64                    1.10.3-1.0.3.el7                      ol7_addons                    9.6 M

Transaction Summary
=====================================================================================================================================
Install  1 Package

Total download size: 9.6 M
Installed size: 41 M
Is this ok [y/d/N]: y
Downloading packages:
docker-engine-1.10.3-1.0.3.el7.x86_64.rpm                                                                     | 9.6 MB  00:00:03
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
   Installing :  docker-engine-1.10.3-1.0.3.el7.x86_64                                                                              1/1
  Verifying  :  docker-engine-1.10.3-1.0.3.el7.x86_64                                                                              1/1

Installed:
  docker-engine.x86_64 0:1.10.3-1.0.3.el7

Complete!
[root@localhost ~]#
これでDockerのインストールは終了です。Dockerを開始してイメージビルドを実行する前に、デフォルト設定を微調整して、Oracle Database用に十分なディスクサイズを提供することを確認する必要があります。Dockerはデフォルトのコンテナサイズの最大値が10GBです。このサイズは、通常Dockerコンテナ内で実行するアプリケーションにとっては十分なサイズではありますが、Oracle Database Enterprise Edition実行のためには上限を拡大する必要があります。この例では、15GBまで拡張し、コンテナ内でOracle Databaseとデータをホストできるようにします。もちろん、要件に合わせて上限をもっと大きな値にすることもできます。このデフォルト値を増加するためには、 storage-opt dm.basesize というストレージオプションを所望の15GBに設定する必要があります。このオプションを/etc/sysconfig/docker-storageというファイルに追記することで上限を拡大することができます。
[root@localhost ~]# cat /etc/sysconfig/docker-storage
# This file may be automatically generated by an installation program.

# By default, Docker uses a loopback-mounted sparse file in
# /var/lib/docker.  The loopback makes it slower, and there are some
# restrictive defaults, such as 100GB max storage.

# If your installation did not set a custom storage for Docker, you
# may do it below.

# Example: Use a custom pair of raw logical volumes (one for metadata,
# one for data).
#  DOCKER_STORAGE_OPTIONS = --storage-opt  dm.metadatadev=/dev/mylogvol/my-docker-metadata --storage-opt  dm.datadev=/dev/mylogvol/my-docker-data

DOCKER_STORAGE_OPTIONS=--storage-opt dm.basesize=15G
これで、systemctlを使ってDockerを開始する準備が整いました。
[root@localhost ~]# systemctl start docker
[root@localhost ~]#
先ほど指定したコンテナサイズの上限値の設定が受け入れられたことを、docker infoを使って確認することができます(確認するためにはDockerを起動しておく必要があります)。
[root@localhost ~]# docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 1.10.3
Storage Driver: devicemapper
 Pool Name: docker-251:0-203798656-pool
 Pool Blocksize: 65.54 kB
Base Device Size: 16.11 GB
 Backing Filesystem:
 Data file: /dev/loop0
 Metadata file: /dev/loop1
 Data Space Used: 391.4 MB
 Data Space Total: 107.4 GB
 Data Space Available: 48.37 GB
 Metadata Space Used: 774.1 kB
 Metadata Space Total: 2.147 GB
 Metadata Space Available: 2.147 GB
 Udev Sync Supported: true
 Deferred Removal Enabled: false
 Deferred Deletion Enabled: false
 Deferred Deleted Device Count: 0
 Data loop file: /var/lib/docker/devicemapper/devicemapper/data
 WARNING:  Usage of loopback devices is strongly discouraged for production use.  Either use `--storage-opt dm.thinpooldev` or use `--storage-opt  dm.no_warn_on_loop_devices=true` to suppress this warning.
 Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata
 Library Version: 1.02.107-RHEL7 (2015-12-01)
Execution Driver: native-0.2
Logging Driver: json-file
Plugins:
 Volume: local
 Network: null host bridge
Kernel Version: 4.1.12-32.2.1.el7uek.x86_64
Operating System: Oracle Linux Server 7.2
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 7.795 GiB
Name: localhost.localdomain
ID: AWF3:DGIQ:YX2P:5BWD:KDQP:G3T3:6UNP:UE2W:POTZ:G4VZ:7IYV:BPIB

Obtaining the required files

Dockerが起動すれば、イメージの作成を始めることができます。上述の通り、まずOracle DatabaseのインストールバイナリとDockerビルドファイルの両方が必要で、どちらも入手は簡単です。Oracle Databaseのインストールバイナリについては、通常ダウンロードされる場所からダウンロードします。おそらくOracle Technology Networkがよく利用される場所でしょう。
Oracle Technology Network
ダウンロードが完了したら、イメージ作成に取りかかることができます。 oracle ユーザーで以下の手順を進めます。
[oracle@localhost ~]$ ls -al
total 2625120
drwx------. 15 oracle oracle       4096 Jul 22 13:21 .
drwxr-xr-x.  3 root   root           19 Mar 25 20:03 ..
-rw-------.  1 oracle oracle        566 Mar 25 20:52 .bash_history
-rw-r--r--.  1 oracle oracle         18 Sep 11  2015 .bash_logout
-rw-r--r--.  1 oracle oracle        193 Sep 11  2015 .bash_profile
-rw-r--r--.  1 oracle oracle        231 Sep 11  2015 .bashrc
drwx------. 10 oracle oracle       4096 Mar 25 19:06 .cache
drwxr-xr-x. 15 oracle oracle       4096 Mar 25 19:06 .config
drwxr-xr-x.  2 oracle oracle          6 Mar 25 19:05 Desktop
drwxr-xr-x.  2 oracle oracle          6 Mar 25 19:05 Documents
drwxr-xr-x.  2 oracle oracle          6 Mar 25 19:05 Downloads
-rw-------.  1 oracle oracle         16 Mar 25 19:05 .esd_auth
-rw-------.  1 oracle oracle       4030 Mar 25 20:48 .ICEauthority
-rw-------.  1 oracle oracle         57 Mar 25 19:55 .lesshst
-rw-r--r--.  1 oracle oracle 1673544724 Jul 22 13:21 linuxamd64_12102_database_1of2.zip
-rw-r--r--.  1 oracle oracle 1014530602 Jul 22 13:22 linuxamd64_12102_database_2of2.zip
drwx------.  3 oracle oracle         18 Mar 25 19:05 .local
drwxr-xr-x.  4 oracle oracle         37 Mar 25 19:40 .mozilla
drwxr-xr-x.  2 oracle oracle          6 Mar 25 19:05 Music
drwxr-xr-x.  2 oracle oracle          6 Mar 25 19:05 Pictures
drwxr-xr-x.  2 oracle oracle          6 Mar 25 19:05 Public
drwx------.  2 oracle oracle          6 Mar 25 19:33 .ssh
drwxr-xr-x.  2 oracle oracle          6 Mar 25 19:05 Templates
drwxr-xr-x.  2 oracle oracle          6 Mar 25 19:05 Videos
続いて、Dockerビルドファイルをダウンロードする必要がありますが、色々な方法があります。Gitリポジトリを直接クローンすることもできますが、簡単のため、かつGitに詳しくない人のことを考慮して、GitHubのダウンロードオプションを使うことにします。メインリポジトリに移動し、[Clone or download]の緑色のボタンを確認し、そのボタンをクリックして、”Download Zip”を選択します。
Official source for Docker configurations, images, and examples of Dockerfiles for Oracle products and projects
https://github.com/oracle/docker-images/
その他、リポジトリを直接静的URLからダウンロードすることもできます。
https://github.com/oracle/docker-images/archive/master.zip
[oracle@localhost ~]$ wget https://github.com/oracle/docker-images/archive/master.zip
--2016-07-22 13:30:14--  https://github.com/oracle/docker-images/archive/master.zip
Resolving github.com (github.com)... 192.30.253.112
Connecting to github.com (github.com)|192.30.253.112|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://codeload.github.com/oracle/docker-images/zip/master [following]
--2016-07-22 13:30:14--  https://codeload.github.com/oracle/docker-images/zip/master
Resolving codeload.github.com (codeload.github.com)... 192.30.253.120
Connecting to codeload.github.com (codeload.github.com)|192.30.253.120|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 4064219 (3.9M) [application/zip]
Saving to: ‘master.zip’

100%[===========================================================================================>]  4,064,219    393KB/s   in 6.9s

2016-07-22 13:30:21 (577 KB/s) - ‘master.zip’ saved [4064219/4064219]
Zipファイルをダウンロードしたら、ファイルを展開します。
[oracle@localhost ~]$ unzip master.zip
Archive:  master.zip
ce91c58275d24df32b3f5d3b8a68000ade61d562
   creating: docker-images-master/
 extracting: docker-images-master/.gitattributes
  inflating: docker-images-master/.gitignore
  inflating: docker-images-master/.gitmodules
...
...
...
  inflating: docker-images-master/README.md
[oracle@localhost ~]$

Building the Oracle Database Docker image

必要なファイルが全てそろったので、Dockerイメージを作成します。docker-images-master/OracleDatabaseのREADME.mdという個別のファイルがあり、このファイルでビルドプロセスを詳細に説明しています。
README.md - Oracle Database on Docker
https://github.com/oracle/docker-images/blob/master/OracleDatabase/README.md
 docker-images-master/OracleDatabase/dockerfiles にある buildDockerImage.sh というシェルスクリプトファイルは、ビルドにおける細々複雑な作業をします。ビルドの際には、正しいバージョンのディレクトリにインストールファイルをコピーすることが必要です。Oracle Database 12.1.0.2 EEイメージを作成する予定なので、ファイルを  docker-images-master/OracleDatabase/dockerfiles/12.1.0.2 にコピーする必要があります。
[oracle@localhost ~]$ cd docker-images-master/OracleDatabase/dockerfiles/12.1.0.2/
[oracle@localhost 12.1.0.2]$ cp ~/linuxamd64_12102_database_* .
[oracle@localhost 12.1.0.2]$ ls -al
total 2625144
drwxrwxr-x. 2 oracle oracle       4096 Jul 22 13:50 .
drwxrwxr-x. 4 oracle oracle         62 Jul 21 14:07 ..
-rw-rw-r--. 1 oracle oracle        515 Jul 21 14:07 Checksum.ee
-rw-rw-r--. 1 oracle oracle        523 Jul 21 14:07 Checksum.se2
-rw-rw-r--. 1 oracle oracle      12738 Jul 21 14:07 dbca.rsp
-rw-rw-r--. 1 oracle oracle       9118 Jul 21 14:07 db_inst.rsp
-rw-rw-r--. 1 oracle oracle       5491 Jul 21 14:07 Dockerfile.ee
-rw-rw-r--. 1 oracle oracle       5508 Jul 21 14:07 Dockerfile.se2
-rwxr-xr-x. 1 oracle oracle        773 Jul 21 14:07 installPerl.sh
-rw-r--r--. 1 oracle oracle 1673544724 Jul 22 13:50 linuxamd64_12102_database_1of2.zip
-rw-r--r--. 1 oracle oracle 1014530602 Jul 22 13:50 linuxamd64_12102_database_2of2.zip
-rwxr-xr-x. 1 oracle oracle        120 Jul 21 14:07 runOracle.sh
buildDockerImage.sh シェルスクリプトファイルを呼び出す準備ができました。このスクリプトは複数のパラメータを取ります。-v でバージョンを指定、-e でEnterprise Editionを作成することを指示、 -p でDBAアカウントのパスワードを指定します。Dockerは root で動作するため、Dockerデーモンと通信するためにroot権限が必要です。 oracle ユーザーは既にsudoersに含まれているため、 sudo でroot権限で実行することができます。
[oracle@localhost 12.1.0.2]$ cd ..
[oracle@localhost dockerfiles]$ sudo ./buildDockerImage.sh -v 12.1.0.2 -e -p LetsDocker
[sudo] password for oracle:
Checking if required packages are present and valid...
linuxamd64_12102_database_1of2.zip: OK
linuxamd64_12102_database_2of2.zip: OK
=====================
Building image 'oracle/database:12.1.0.2-ee' ...
Sending build context to Docker daemon 2.688 GB
Step 1 : FROM oraclelinux:latest
latest: Pulling from library/oraclelinux
10ec637c060c: Pull complete
Digest: sha256:583f9e880f9228894555775c720d32eb22bf09cd13009c036d8f19b3257ccb41
Status: Downloaded newer image for oraclelinux:latest
...
...
...
Step 27 : CMD $ORACLE_BASE/runOracle.sh
 ---> Running in f536fc46e81e
 ---> a31ab247296b
Removing intermediate container f536fc46e81e
Successfully built a31ab247296b

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

    --> oracle/database:12.1.0.2-ee

  ORACLE PASSWORD (SYS, SYSTEM, PDBADMIN): LetsDocker

  Build completed in 1204 seconds.

[oracle@localhost dockerfiles]$

Starting and connecting to the Oracle Database in a Docker container

ビルドが成功すれば、Oracle DatabaseをDockerコンテナ内で開始、実行できます。 docker run コマンドに適切なパラメータを付けて呼び出すだけでOKです。重要なパラメータの一つに、コンテナ内部のポート番号を外部世界とマッピングする -p  があります。当然ながら、Dockerコンテナの外部からデータベースに接続するため、このパラメータを使う必要があります。別の有用なパラメータには --name があります。これを使うと、指定した名前で新たにDockerコンテナを作成することができます。このパラメータを使うと、自動生成されたIDや名前を使わずに指定した名前でコンテナを参照することができます。
[oracle@localhost dockerfiles]$ sudo docker run -p 1521:1521 --name gvenzl oracle/database:12.1.0.2-ee

LSNRCTL for Linux: Version 12.1.0.2.0 - Production on 25-JUL-2016 17:23:07

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/78c750640f31/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                25-JUL-2016 17:23:09
Uptime                    0 days 0 hr. 0 min. 0 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Default Service           ORCLCDB
Listener Parameter File   /opt/oracle/product/12.1.0.2/dbhome_1/network/admin/listener.ora
Listener Log File         /opt/oracle/diag/tnslsnr/78c750640f31/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

SQL*Plus: Release 12.1.0.2.0 Production on Mon Jul 25 17:23:09 2016

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

Connected to an idle instance.

SQL> ORACLE instance started.

Total System Global Area 1610612736 bytes
Fixed Size            2924928 bytes
Variable Size          520097408 bytes
Database Buffers     1073741824 bytes
Redo Buffers           13848576 bytes
Database mounted.
Database opened.
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
Mon Jul 25 17:23:23 2016
===========================================================
Dumping current patch information
===========================================================
No patches have been applied
===========================================================
Starting background process CJQ0
Mon Jul 25 17:23:23 2016
CJQ0 started with pid=29, OS id=194
Completed: ALTER DATABASE OPEN
Mon Jul 25 17:23:24 2016
db_recovery_file_dest_size of 4560 MB is 0.00% used. This is a
user-specified limit on the amount of space that will be used by this
database for recovery-related files, and does not reflect the amount of
space available in the underlying filesystem or ASM diskgroup.
利便性のため、コンテナ開始スクリプトはOracle Databaseを起動するだけでなく、Oracle Databaseのalert.logファイルを tail -f で表示します。これは簡単に潜在的な問題の目星を付けやすくするためです。コンテナが動作し、1521/tcpが外部世界にマッピングされているので、コンテナ内のデータベースに接続することができます。
[oracle@localhost ~]$ sql system/LetsDocker@//localhost:1521/ORCLPDB1

SQLcl: Release 4.2.0.16.175.1027 RC on Mon Jul 25 13:31:03 2016

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

Last Successful login time: Mon Jul 25 2016 13:31:04 -04:00

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> grant connect, resource to gvenzl identified by supersecretpwd;

Grant succeeded.

SQL> conn gvenzl/supersecretpwd@//localhost:1521/ORCLPDB1
Connected.

Stopping the Oracle Database Docker container

Dockerコンテナを停止したい場合は、 docker stop コマンドを使って停止できます。このコマンドにコンテナ名を付けて呼び出すだけです。
[oracle@localhost ~]$ sudo docker stop gvenzl
gvenzl

Summary

これで、Dockerを使ってOracle Databaseをコンテナ化する方法のチュートリアルは終了です。OracleはOracle Databaseの他のEditionのビルドファイルも提供しており、手順は上述のものとほぼ同じですが、ビルドファイルに付属するREADME.mdを常に参照するよう心がけてください。
Oracle Database on Docker
https://github.com/oracle/docker-images/tree/master/OracleDatabase

0 件のコメント:

コメントを投稿