読者です 読者をやめる 読者になる 読者になる

メンチカツには醤油でしょ!!

ITエンジニア徒然 (AWS/Java/JavaScript/Google Spreadsheets/Jenkins/Mac/外部コミュニティ・勉強会レポ)

Docker上にOracle 11g XEを立てた

概要

Oracle公式のDockerfileを使ってみようとする⇒挫折
・Cent OSをDockerに構築してその上にOracleを入れてみようとする⇒挫折
・結局、公開されているDockerイメージを利用した^^;

Oracle公式Dockerfile

Oracle公式のDockerfileはGitHubに公開されているので、それをpullします。
Database 11g XEだけでなくイロイロあります。

github.com

docker buildしてみた

> docker build -t oracle/database:11.2.0.2-xe .
Sending build context to Docker daemon 315.9 MB
Step 1 : FROM oraclelinux:latest
latest: Pulling from library/oraclelinux
2c48edfee2a0: Pull complete
Digest: sha256:d447e228f31c753842d0de64a610a0b480b6c7b850c27813a67fd8e7a938ccee
Status: Downloaded newer image for oraclelinux:latest
---> 27a5201e554e
Step 2 : MAINTAINER Gerald Venzl <gerald.venzl@oracle.com>
---> Running in 115230e1e281
---> 685367d4776e
Removing intermediate container 115230e1e281
Step 3 : ENV ORACLE_BASE /u01/app/oracle ORACLE_HOME /u01/app/oracle/product/11.2.0/xe ORACLE_SID XE INSTALL_FILE_1 "oracle-xe-11.2.0-1.0.x86_64.rpm.zip" INSTALL_DIR "$HOME/install" CONFIG_RSP "xe.rsp" RUN_FILE "runOracle.sh" PWD_FILE "setPassword.sh"
---> Running in 60b6cb2d79f1
---> 4403e1ec55f6
Removing intermediate container 60b6cb2d79f1
Step 4 : ENV PATH $ORACLE_HOME/bin:$PATH
---> Running in 19d7514185b8
---> 003431fa2357
Removing intermediate container 19d7514185b8
Step 5 : COPY $INSTALL_FILE_1 $CONFIG_RSP $RUN_FILE $PWD_FILE $INSTALL_DIR/
---> ff6b7a15489c
Removing intermediate container c5aef6be100e
Step 6 : RUN yum -y install unzip libaio bc initscripts net-tools openssl && yum clean all && cd $INSTALL_DIR && unzip $INSTALL_FILE_1 && rm $INSTALL_FILE_1 && rpm -i Disk1/*.rpm && mkdir $ORACLE_BASE/oradata && chown -R oracle:dba $ORACLE_BASE && mv $INSTALL_DIR/$CONFIG_RSP $ORACLE_BASE/ && mv $INSTALL_DIR/$RUN_FILE $ORACLE_BASE/ && mv $INSTALL_DIR/$PWD_FILE $ORACLE_BASE/ && ln -s $ORACLE_BASE/$PWD_FILE / && cd $HOME && rm -rf $INSTALL_DIR && chmod u+x $ORACLE_BASE/$RUN_FILE && chmod u+x $ORACLE_BASE/$PWD_FILE
---> Running in 7abd1f727b8d
Loaded plugins: ovl, ulninfo
Package initscripts-9.49.37-1.0.1.el7.x86_64 already installed and latest version
Resolving Dependencies
--> Running transaction check
---> Package bc.x86_64 0:1.06.95-13.el7 will be installed
---> Package libaio.x86_64 0:0.3.109-13.el7 will be installed
---> Package net-tools.x86_64 0:2.0-0.17.20131004git.el7 will be installed
---> Package openssl.x86_64 1:1.0.1e-60.el7 will be installed
--> Processing Dependency: make for package: 1:openssl-1.0.1e-60.el7.x86_64
---> Package unzip.x86_64 0:6.0-16.el7 will be installed
--> Running transaction check
---> Package make.x86_64 1:3.82-23.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
bc x86_64 1.06.95-13.el7 ol7_latest 114 k
libaio x86_64 0.3.109-13.el7 ol7_latest 24 k
net-tools x86_64 2.0-0.17.20131004git.el7 ol7_latest 303 k
openssl x86_64 1:1.0.1e-60.el7 ol7_latest 713 k
unzip x86_64 6.0-16.el7 ol7_latest 169 k
Installing for dependencies:
make x86_64 1:3.82-23.el7 ol7_latest 420 k
Transaction Summary
================================================================================
Install 5 Packages (+1 Dependent package)
Total download size: 1.7 M
Installed size: 4.1 M
Downloading packages:
--------------------------------------------------------------------------------
Total 144 kB/s | 1.7 MB 00:12
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : 1:make-3.82-23.el7.x86_64 1/6
Installing : 1:openssl-1.0.1e-60.el7.x86_64 2/6
Installing : libaio-0.3.109-13.el7.x86_64 3/6
Installing : bc-1.06.95-13.el7.x86_64 4/6
Installing : net-tools-2.0-0.17.20131004git.el7.x86_64 5/6
Installing : unzip-6.0-16.el7.x86_64 6/6
Verifying : unzip-6.0-16.el7.x86_64 1/6
Verifying : net-tools-2.0-0.17.20131004git.el7.x86_64 2/6
Verifying : 1:make-3.82-23.el7.x86_64 3/6
Verifying : bc-1.06.95-13.el7.x86_64 4/6
Verifying : libaio-0.3.109-13.el7.x86_64 5/6
Verifying : 1:openssl-1.0.1e-60.el7.x86_64 6/6
Installed:
bc.x86_64 0:1.06.95-13.el7 libaio.x86_64 0:0.3.109-13.el7
net-tools.x86_64 0:2.0-0.17.20131004git.el7 openssl.x86_64 1:1.0.1e-60.el7
unzip.x86_64 0:6.0-16.el7
Dependency Installed:
make.x86_64 1:3.82-23.el7
Complete!
Loaded plugins: ovl, ulninfo
Cleaning repos: ol7_UEKR4 ol7_latest
Cleaning up everything
Archive: oracle-xe-11.2.0-1.0.x86_64.rpm.zip
creating: Disk1/
creating: Disk1/upgrade/
inflating: Disk1/upgrade/gen_inst.sql
creating: Disk1/response/
inflating: Disk1/response/xe.rsp
inflating: Disk1/oracle-xe-11.2.0-1.0.x86_64.rpm
/var/tmp/rpm-tmp.5IMzrT: line 257: [: 18446744073692774399: integer expression expected
/var/tmp/rpm-tmp.5IMzrT: line 271: [: 18446744073692774399: integer expression expected
sysctl: setting key "fs.file-max": Read-only file system
Executing post-install steps...
You must run '/etc/init.d/oracle-xe configure' as the root user to configure the database.
---> 058b551531b8
Removing intermediate container 7abd1f727b8d
Step 7 : VOLUME $ORACLE_BASE/oradata
---> Running in 3ef38035a446
---> e2aeba219239
Removing intermediate container 3ef38035a446
Step 8 : EXPOSE 1521 8080
---> Running in 8bbb79e5d9c9
---> dbab7fccbb6c
Removing intermediate container 8bbb79e5d9c9
Step 9 : CMD $ORACLE_BASE/$RUN_FILE
---> Running in 1bd7bb583e92
---> 553f53c97c0b
Removing intermediate container 1bd7bb583e92
Successfully built 553f53c97c0b
SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.

なんかエラーが…
これはDocker 0.11以降では /proc と /sys へのアクセスが制限されているためです。

runしてみるも

> docker run oracle/database:11.2.0.2-xe
Error: The container doesn't have enough memory allocated.
A database XE container needs at least 1 GB of shared memory (/dev/shm).
You currently only have 64 MB allocated to the container.

上記のエラーが出ないのでなんか動きそうな予感はありますが、
Dockerコンテナ内にアサインされるメモリを1GB以上取れと言っています。

ためらいつつも

> docker run -m 1g oracle/database:11.2.0.2-xe

変わらず…
しかも上記のメッセージはOracleのシェルが出しているメッセージなのでググってもあまり出てこない。

諦め。

Cent OSのDockerコンテナ上にOracleをインストール

ならばCent OSの上にOracleを入れればいいじゃない。
ということで、
https://hub.docker.com/_/centos/
Docker Hubのオフィシャルリポジトリcentosから

> docker pull centos:6

Cent OSなのと6な理由は過去にやったことがあるからで、特に拘りはアリマセン。

Cent OSへのOracleインストールはコチラのサイトが大変参考になりますし
Docker上でない場合はこの通りにやればできます。

itmemo.net-luck.com

ちなみにDocker内でも自身のマシン名を調べるコマンドはhostnameで
Docker内のCentから抜ける時はctrl+p ⇒ ctrl+qの順に入力します。
再度入る時はdocker attach [コンテナID]です。
exitで出るとコンテナが止まります…((((;゚Д゚))))

しかしDocker上ではやはり上記の問題があり、サイトの手順の
oracle-xe configureの所で

# /etc/init.d/oracle-xe configure
/etc/init.d/oracle-xe: line 69: /etc/init.d/functions: No such file or directory
Oracle Database 11g Express Edition Configuration
-------------------------------------------------
This will configure on-boot properties of Oracle Database 11g Express
Edition. The following questions will determine whether the database should
be starting upon system boot, the ports it will use, and the passwords that
will be used for database accounts. Press <Enter> to accept the defaults.
Ctrl-C will abort.

Specify the HTTP port that will be used for Oracle Application Express [8080]:8080

Specify a port that will be used for the database listener [1521]:1521

Specify a password to be used for database accounts. Note that the same
password will be used for SYS and SYSTEM. Oracle recommends the use of
different passwords for each database account. This can be done after
initial configuration:
Confirm the password:

Do you want Oracle Database 11g Express Edition to be started on boot (y/n) [y]:y

Starting Oracle Net Listener...Done
Configuring database...
Database Configuration failed. Look into /u01/app/oracle/product/11.2.0/xe/config/log for details

# sqlplus system/oracle as sysdba
SQL*Plus: Release 11.2.0.2.0 Production on Wed Dec 28 19:36:55 2016
Copyright (c) 1982, 2011, Oracle. All rights reserved.
ERROR:
ORA-01031: insufficient privileges

Enter user-name: system
Enter password:
ERROR:
ORA-01034: ORACLE not available
ORA-27101: shared memory realm does not exist
Linux-x86_64 Error: 2: No such file or directory
Process ID: 0
Session ID: 0 Serial number: 0

こうなってしまうのです。
なんか無理そう・・・?

結局公開されているDockerイメージを使用

結局公開されているDockerイメージの中からMost downloads, most starsのwnameless/oracle-xe-11gを使いました。

https://hub.docker.com/r/wnameless/oracle-xe-11g/

> docker pull wnameless/oracle-xe-11g
Using default tag: latest
latest: Pulling from wnameless/oracle-xe-11g
af49a5ceb2a5: Pull complete
8f9757b472e7: Pull complete
e931b117db38: Pull complete
47b5e16c0811: Pull complete
9332eaf1a55b: Pull complete
c7acd40e5fcb: Pull complete
a92639a21ac4: Pull complete
Digest: sha256:b1cc05f5b1b12d1080f4278c23875a3f107abd5db4e5e4a7ef6e60a0e3abf787
Status: Downloaded newer image for wnameless/oracle-xe-11g:latest

> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
wnameless/oracle-xe-11g latest 38037473cce1 4 weeks ago 2.234 GB

> docker run -d -p 49160:22 -p 49161:1521 -e ORACLE_ALLOW_REMOTE=true wnameless/oracle-xe-11g
763e774da74b75442959ec40ef9ee5663dff0c436481044bb8e82dd659a4eb48

> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
763e774da74b wnameless/oracle-xe-11g "/bin/sh -c '/usr/sbi" 8 days ago Up 3 seconds 8080/tcp, 0.0.0.0:49160->22/tcp, 0.0.0.0:49161->1521/tcp furious_yalow

github.com

の通りに他のマシンや親ホストのSQL Developerから

hostname: localhost
port: 49161
sid: xe
username: system
password: oracle

で繋がりました\(^o^)/

f:id:ryoichi0102:20170106135712j:plain

データの永続化について

DBのデータはDockerイメージ内に格納されているので
データの永続化(データの外出し)については今後検討といった所。
(まぁJenkinsで定期的にバックアップ取ってあげれば良いのだけれどもね)

追記:コンテナ外のDDL/SQLで初期化する方法について投稿しました。

ryoichi0102.hatenablog.com