Oracle Database 18c XE をDockerで動かしてみる。

このエントリは Oracle Database or GoldenGate Advent Calendar 2018 の Day 16 の記事となります。

 

みなさん、Oracle Database 18c XEを使ってますか?
私はまだ触っていないので、この機会に触ってみようと思います。

ただ、インストールするだけではつまらないので、Docker上で試してみようと思います。


Dockerで使用するには、以下の手順が必要です。

1.OTNからOracle Database 18c XEのrpmをダウンロード
2.githubからDockerイメージビルド用のスクリプトをダウンロード
3.イメージビルド用のスクリプトを実行
4.作成したイメージからコンテナ起動

 

以下手順となります。

#イメージビルド用のスクリプトをダウンロード

git clone https://github.com/oracle/docker-images

###OTNからoracle-database-xe-18c-1.0-1.x86_64.rpm をダウンロード後,docker-images/OracleDatabase/SingleInstance/dockerfiles/18.4.0にコピーする

#ビルド用ディレクトリに移動
cd docker-images/OracleDatabase/SingleInstance/dockerfiles

#ビルド用スクリプトの実行

 ./buildDockerImage.sh -v 18.4.0 -x
Checking if required packages are present and valid...
oracle-database-xe-18c-1.0-1.x86_64.rpm: OK
==========================
DOCKER info:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 18.09.0
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: c4446665cb9c30056f4998ed953e6d4ff22c7c39
runc version: 4fc53a81fb7c994640722ac585fa9ca548971871
init version: fec3683
Security Options:
apparmor
seccomp
Profile: default
Kernel Version: 4.15.0-1021-azure
Operating System: Ubuntu 16.04.5 LTS
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 15.67GiB
Name: ubuntu
ID: UMRP:RMHM:6DWI:WKXZ:SP7X:OTU2:2RPM:HEPS:ZUBX:UHOC:XTM5:EWGE
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
Product License: Community Engine

WARNING: No swap limit support
==========================
Building image 'oracle/database:18.4.0-xe' ...
Sending build context to Docker daemon 2.574GB
Step 1/11 : FROM oraclelinux:7-slim
7-slim: Pulling from library/oraclelinux
f25d82609194: Pull complete
Digest: sha256:2ed2820810409491b0d8fced14b5f6b3fd8206eb8fbf5f9138d825c5a98db020
Status: Downloaded newer image for oraclelinux:7-slim
---> b19454a5f17a
Step 2/11 : MAINTAINER Gerald Venzl <gerald.venzl@oracle.com>
---> Running in 37ba5ba2c6bb
Removing intermediate container 37ba5ba2c6bb
---> 0748a837c0e0
Step 3/11 : ENV ORACLE_BASE=/opt/oracle ORACLE_HOME=/opt/oracle/product/18c/dbhomeXE ORACLE_SID=XE INSTALL_FILE_1="oracle-d
atabase-xe-18c-1.0-1.x86_64.rpm" RUN_FILE="runOracle.sh" PWD_FILE="setPassword.sh" CONF_FILE="oracle-xe-18c.conf" CHECK
_DB_FILE="checkDBStatus.sh" INSTALL_DIR="$HOME/install" ORACLE_DOCKER_INSTALL="true"
---> Running in 4cdf61b6978f
Removing intermediate container 4cdf61b6978f
---> 96cf7c299f79
Step 4/11 : ENV PATH=$ORACLE_HOME/bin:$PATH
---> Running in 9b8829c378bf
Removing intermediate container 9b8829c378bf
---> 024269c36e3a
Step 5/11 : COPY $INSTALL_FILE_1 $RUN_FILE $PWD_FILE $CHECK_DB_FILE $INSTALL_DIR/
---> 55182b72d69b
Step 6/11 : COPY $CONF_FILE $INSTALL_DIR/
---> eb5cfe6434a6
Step 7/11 : RUN cd $INSTALL_DIR && yum -y install oracle-database-preinstall-18c file openssl $INSTALL_FILE_1 && rm -rf /var/ca
che/yum && mkdir -p $ORACLE_BASE/scripts/setup && mkdir $ORACLE_BASE/scripts/startup && ln -s $ORACLE_BASE/scripts /docker-
entrypoint-initdb.d && mkdir -p $ORACLE_BASE/oradata /home/oracle && chown -R oracle:oinstall $ORACLE_BASE/oradata /home/oracle
&& mv $INSTALL_DIR/$RUN_FILE $ORACLE_BASE/ && mv $INSTALL_DIR/$PWD_FILE $ORACLE_BASE/ && mv $INSTALL_DIR/$CHECK_DB_FILE $O
RACLE_BASE/ && mv $INSTALL_DIR/$CONF_FILE /etc/sysconfig/ && ln -s $ORACLE_BASE/$PWD_FILE / && cd $HOME && rm -rf $INST
ALL_DIR && target_txt=$(cat /etc/security/limits.d/oracle-database-preinstall-18c.conf | grep -e 'oracle *hard *memlock*') && s
ed -i "/^$target_txt/ c#$target_txt" /etc/security/limits.d/oracle-database-preinstall-18c.conf && chmod ug+x $ORACLE_BASE/*.sh
---> Running in 7a576c1cc0ae
Loaded plugins: ovl
Examining oracle-database-xe-18c-1.0-1.x86_64.rpm: oracle-database-xe-18c-1.0-1.x86_64
Marking oracle-database-xe-18c-1.0-1.x86_64.rpm to be installed
Resolving Dependencies
--> Running transaction check
---> Package file.x86_64 0:5.11-35.el7 will be installed
---> Package openssl.x86_64 1:1.0.2k-16.0.1.el7 will be installed
~~~~~~~~
xorg-x11-utils.x86_64 0:7.5-23.el7
xorg-x11-xauth.x86_64 1:1.0.9-1.el7
xz.x86_64 0:5.2.2-1.el7

Complete!

Removing intermediate container 7a576c1cc0ae
---> cd3099f0db97
Step 8/11 : VOLUME ["$ORACLE_BASE/oradata"]
---> Running in 8f34c92a369d
Removing intermediate container 8f34c92a369d
---> be8fc9066c53
Step 9/11 : EXPOSE 1521 8080 5500
---> Running in 2720d5113806
Removing intermediate container 2720d5113806
---> 0bf8facf860f
Step 10/11 : HEALTHCHECK --interval=1m --start-period=5m CMD "$ORACLE_BASE/$CHECK_DB_FILE" >/dev/null || exit 1
---> Running in 8119ffac1a9a
Removing intermediate container 8119ffac1a9a
---> 1677191ded41
Step 11/11 : CMD exec $ORACLE_BASE/$RUN_FILE
---> Running in 58f63241b643
Removing intermediate container 58f63241b643
---> 99a04dbc81a6
[Warning] One or more build-args [DB_EDITION] were not consumed
Successfully built 99a04dbc81a6
Successfully tagged oracle/database:18.4.0-xe

Oracle Database Docker Image for 'xe' version 18.4.0 is ready to be extended:

--> oracle/database:18.4.0-xe

Build completed in 985 seconds.

#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
oracle/database 18.4.0-xe 99a04dbc81a6 8 minutes ago 8.43GB
oraclelinux 7-slim b19454a5f17a 4 weeks ago 117MB


###### コンテナの起動 メモリの割り当ては1GB パスワードはoracle123 マウントポイントは /docker/oracle
docker run -d -v /dev/shm --tmpfs /dev/shm:rw,nosuid,nodev,exec,size=1g
--name xe-18c --hostname xe-18c 
-p 1521:1521 -p 8080:8080 -p 5500:5500  
-e ORACLE_PWD=oracle123 
-v /docker/oracle:/opt/oracle/oradata 
oracle/database:18.4.0-xe

#databaseの作成状況の確認
docker logs xe-18c

##以下のような出力があれば、databaseを使用可能

#########################
DATABASE IS READY TO USE!
#########################

#コンテナの操作はsshではなく、docker execで行う

docker exec -ti xe-18c /bin/bash

#DBへの接続

sqlplus sys/oracle123@//localhost:1521/XE as sysdba
sqlplus system/oracle123@//localhost:1521/XE
sqlplus pdbadmin/oracle123@//localhost:1521/XEPDB1

 

皆さん、良いクリスマスを!

Oracle RAC on Kubernetes

JPOUG Advent Calendar 2017の9日目のエントリーです。

今回は Oracle RAC on Kubernetesについて書きます。

 

情報はKubernetes 1.7ベースです

 

Oracle RAC on XXを作る際に共通して考慮する必要があるのが

 

です。

 

  • 共有ディスク

検証用途ではiscsinfsが使われていると思います。

Kubernetes(docker含む)では「コンテナ内」からiscsiを扱うことは難しいため、nfsを使います。

 

クラウド環境やコンテナ環境ではネットワークが一本しかない、固定IPを指定できない、マルチキャスト対応してない など様々な制約があります 。

これらの制約に対応する為、仮想ネットワーク(vxlan)を使います。vxlanはユニキャストモード使用します。

 

  • ホスト名

一般的なホスト名変更方法(/etc/hostname 変更)でうまくいかないことが多い(再起動すると環境側でホスト名がリセットされたり、/etc/hostnameが編集不可だったり)ので、ホスト名を変更するサービスを作成して対応しています。

 

  • 名前解決

 クラウド環境やコンテナ環境側のDNSに仮想ネットワーク(vxlan)に対応したDNSレコードを追加出来ないことが多いので

各ノードにローカルDNS(dnsmasq)を作成し、本来のDNSにforwardしています

 

Oracle RAC on Kubernetesでは上記に加え、

 

  • コンテナの配置
  • コンテナ間の名前解決
  • systemd
  • 特権モード
  • /dev/shm

 

で対応が必要です。

 

  • コンテナの配置

1ホストにつき、1DBコンテナ起動してほしいのですべてのコンテナでcontainerPortとhostPortを同一にして1ホストにつき、1コンテナ起動するようにしています。

 

  • コンテナ間の名前解決

 コンテナ(pod)間で名前解決するにはsubdomainを使用する必要があるようです。(自信ないのでくわしい人教えて下さい)

 

  • systemd

 公式Oracle Linuxのイメージはsystemdが含まれていませんので、systemdが含まれたイメージを自作する必要があります。

 

  • 特権モード

 systemdやvxlanを動作させるために特権モード

(securityContext:
privileged: true)

 でコンテナを起動します

 

  • /dev/shm

 デフォルトは64MBで、ASMインスタンスが起動出来ません。

そのため/dev/shmを1200mでマウントし直すsystemdサービスを作成して対応しています

 


f:id:KNOPP:20171208212018j:image


f:id:KNOPP:20171208212030j:image

手順は、今後以下URLで公開予定です

 https://github.com/s4ragent/rac_on_xx/tree/master/k8s

 

その他

 JPOUG in 15 minutes #6で使用した資料(Oracle RAC on Docker)はこちら

https://www.slideshare.net/ohshimamasaki/oracle-rac-on-docker

 

手順はこちら

https://github.com/s4ragent/rac_on_xx/tree/master/docker

 

Oracle Linux 7でyumコマンド実行時の注意点

本エントリとは直接関連しませんが、まずは宣伝から。

宣伝その1

JPOUGのイベントが11月17日にあります
http://www.jpoug.org/2017/09https://jpoug.doorkeeper.jp/events/65435

テーマは「Docker」。Dockerized Sessionのみです。

 今回は私も、Oracle RAC on Dockerというタイトルで登壇致します。まだ席に余裕がありますので、興味がある方は是非。

 

宣伝その2

今年もAdvent Calendaerやります
https://jpoug.doorkeeper.jp/events/67051

 

一年の終わりにOracleというキーワードで記事を書いてみませんか?

 

ここで本題です。

Oracle Linux 7で環境構築するときにCentOS7の手順を参考にすると思いますが、たまにyum コマンドでそんなパッケージないよ とエラーがでるときがあります。

 

 そんなときは

--enablerepo=ol7_addons --enablerepo=ol7_optional_latest

をつけて実行します

 

自分もちょいちょい忘れて、ドハマリするのでメモ用でした

Google Compute EngineでNested KVMを使えるようにする

本エントリとは直接関連しませんが、まずは宣伝から。

JPOUGのイベントが11月17日にあります
http://www.jpoug.org/2017/09

テーマは「Docker」。Dockerized Sessionのみです。

 

今回は私も、Oracle RAC on Dockerというタイトルで登壇致します。
まだ席に余裕がありますので、興味がある方は是非。

 

さて本題です。
Microsoft Azureに続き、Google Compute EngineでもNested VMが可能になったようです。
https://cloud.google.com/compute/docs/instances/enable-nested-virtualization-vm-instances

 

今回は、Google Compute EngineでNested KVMを試してみようかと思ったのですが、
上記URLを見る限り、そのままではNested KVMはつかえないようです。(専用のイメージ作成が必要)

そこで、Nested KVMが使えるイメージを作成します。
作成手順は以下です。

 

1.仮想化用のライセンスキーを割り当てて、カスタムイメージを作成  今回は、ubuntu 16.04を使用します

gcloud compute images create nested-test --source-image-family=ubuntu-1604-lts --source-image-project=ubuntu-os-cloud --licenses https://www.googleapis.com/compute/v1/projects/vm-options/global/licenses/enable-vmx

 

2.カスタムイメージからVMインスタンスを起動

gcloud compute instances create testvm --machine-type g1-small --network "default" --can-ip-forward --maintenance-policy MIGRATE --scopes "https://www.googleapis.com/auth/devstorage.read_write,https://www.googleapis.com/auth/logging.write" --image nested-test --boot-disk-type "pd-ssd" --boot-disk-device-name testvm --boot-disk-size 200 --zone us-central1-c

3.VMインスタンスに接続し、必要なパッケージをインストール

sudo apt-get update
sudo apt-get install kvm virt-manager libvirt-bin bridge-utils

 

lsmod でkvmがロードされていればKVMが使用出来るはずです。


kvm 593920 1 kvm_intel
irqbypass 16384 1 kvm

Oracle RAC on Docker

JPOUG Advent Calendar( https://jpoug.doorkeeper.jp/events/53797 )と Docker Advent Calendar2 (http://qiita.com/advent-calendar/2016/docker2 )の4日目です。

Oracle RAC on Dockerの作成スクリプトgithub(https://github.com/s4ragent/rac_on_xx)で公開していますので、その紹介です

概要

  • 基本情報
- -
OS(イメージ) Oracle Linux 7.2
Storage NFS4 with Flex ASM
L2 実装方式 vxlan
DNS 各コンテナ上にdnsmasq
  • Network 情報 (3-nodes RACの場合)
hostname/container name/vip eth0 vxlan0(public) vxlan1(internal) vxlan2(asm)
storage 10.153.0.50 - - -
node001 10.153.0.51 192.168.0.51 192.168.100.51 192.168.200.51
node002 10.153.0.52 192.168.0.52 192.168.100.52 192.168.200.52
node003 10.153.0.53 192.168.0.53 192.168.100.53 192.168.200.53
node001.vip - 192.168.0.151 - -
node002.vip - 192.168.0.152 - -
node003.vip - 192.168.0.152 - -
scan1.vip - 192.168.0.31 - -
scan2.vip - 192.168.0.32 - -
scan3.vip - 192.168.0.33 - -
  • Storage 情報
Diskgroup name use asm device path redundancy size(MB) size(MB)(3-nodes RACの場合)
VOTE ocr and voting disk /u01/oradata/vote.img external 5120 + ( num_of_nodes * 1024 ) 8192
DATA Database files /u01/oradata/data.img external 5120 + ( num_of_nodes * 1024 ) 8192
FRA flash recovery area /u01/oradata/fra.img external 5120 5120

必要なもの

  • ubuntu/debian(Kernel 3.18 or later), CentOS/RHEL/OEL 7.2
  • docker 1.12
  • ansible 2.0 or later
  • Oracle 12c Release 1 (12.1) Clusterware and Database software
  • 1コンテナにつき、1core CPU および 4GB Memory

注意

各コンテナはprivilegedモードで起動するため、 検証環境でのみ使用してください

インストール方法

git clone https://github.com/s4ragent/rac_on_xx

使いかた

Oracle 12c Release 1 (12.1) Clusterware とDatabase software をdocker hostにダウンロード/展開します

#mkdir -p /media
#unzip linuxamd64_12102_database_1of2.zip -d /media
#unzip linuxamd64_12102_database_2of2.zip -d /media
#unzip linuxamd64_12102_grid_1of2.zip -d /media
#unzip linuxamd64_12102_grid_2of2.zip -d /media

#ls -al /media
total 16
drwxr-xr-x 4 root root 4096 May  1 21:56 .
drwxr-xr-x 3 root root 4096 May  1 21:53 ..
drwxr-xr-x 7 root root 4096 Jul  7  2014 database
drwxr-xr-x 7 root root 4096 Jul  7  2014 grid

dockerutil.sh runall を実行します (optionつけない場合は 3-nodes RACを作成します)

##create 3-nodes RAC#
#cd rac_on_xx/docker
#bash dockerutil.sh runall

5-nodes RACを作成したい場合は以下

##create 5-nodes RAC#
#cd rac_on_xx/docker
#bash dockerutil.sh runall 5

その後、最初のコンテナ(node001)にログインしたい場合は以下

#docker exec -ti node001 /bin/bash

最初のコンテナ(node001)でORACLEのコマンドを実行したい場合 (例. crsctl status res -t)

#docker exec -ti node001 /u01/app/12.1.0/grid/bin/crsctl status res -t

最初のコンテナ(node001)を停止したい場合

#bash dockerutil.sh stop 1

ストレージ用のコンテナ(storage)を停止したい場合

#bash dockerutil.sh stop storage

最初のコンテナ(node001)を起動したい場合

#bash dockerutil.sh start 1

コンテナを全て起動する場合

#bash dockerutil.sh startall

コンテナを全て削除する場合

#bash dockerutil.sh deleteall

制限事項

docker save非対応

guacamole を使う その3  (docker SSL対応編)

本エントリとは直接関連しませんが、まずは宣伝から。

https://jpoug.doorkeeper.jp/events/51429

まだ席に余裕がありますので、興味がある方は是非。

 

 

ここからが本題です。
今回もその1,2から続きguacamoleです。
2の手順でも十分問題なく、使えるのですが、ゲートウェイサーバを外部に、置いたりする場合
通信をSSL化したい場合があります。

手順そのものは、以下のURL(guacamoles公式サイト)にあるので、そう難しくはないのですが、
http://guacamole.incubator.apache.org/doc/gug/proxying-guacamole.html

今回はその2に引き続きDocker コンテナで完結させたいと思います。
その2で作成したコンテナがそのまま起動していることを前提とします


#コンテナの作成
docker run --name nginx --link guacamole:guacamole -d -p 443:443 nginx

 

#nginxコンテナにログイン
docker exec -ti nginx /bin/bash

 

#オレオレ証明書の作成(ブラウザで証明書のエラーが出ても気にしないことにします)
cd /opt/nginx/certs
openssl genrsa -out server.key 4096
openssl req -new -batch -key server.key -out server.csr
openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt

 

#nginxのconf作成
cat > /etc/nginx/conf.d/default.conf <<'EOF'
server {
listen 443;
ssl_certificate /opt/nginx/certs/server.crt;
ssl_certificate_key /opt/nginx/certs/server.key;

ssl on;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "ECDHE+RSAGCM:ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:!EXPORT:!DES:!3DES:!MD5:!DSS";

location /guacamole/ {
proxy_pass http://guacamole:8080/guacamole/;
proxy_buffering off;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
access_log off;
}
}
EOF

exit

 

#nginx コンテナの再起動
docker stop nginx
docker start nginx

上記設定後、ブラウザから以下のURLへアクセスするとguacamoleにログインできます


https//<dockerホストのIPアドレス>:443/guacamole

guacamole を使う その2  (docker DB連携なし編)

本エントリとは直接関連しませんが、まずは宣伝から。

https://jpoug.doorkeeper.jp/events/51429

まだ席に余裕がありますので、興味がある方は是非。

 

 

ここからが本題です。

今回もその1から続きguacamoleです。

knopp.hatenablog.jp

その1ではCentOS7+yumでのインストール方法を紹介しましたが、

yumからですと、最新版ではなく、少々古いバージョンのインストールとなります。

スマホタブレット対応など、最新版の機能を使いたい場合は、

このエントリのようにdockerを使うのがお手軽です。

基本的には、公式ドキュメントに記載の方法でよいのですが、

公式ドキュメントの方法では、DB連携(MySQL/PostgreSQL)前提となってしまいます。

DB連携するほどでもない(またはリソースケチりたい場合)は

今回紹介する手順になります。

 

<構成>
・OS CentOS7.2

・docker 1.12
・guacd/guacamole (tomcat) 別コンテナ

・guacd/guacamole 0.9.9(執筆時点)
・DB連携なし


<インストール方法>

#guacamoleのパスワードをmd5hashで取得
#ここではguacamoleには、gucauser/Guac123!でログインすることとする。
#echo -n 'Guac123!' | md5sum | awk '{print $1}'
#6e9b83fc538318184ca185a44c06d235

 

#コンテナの起動

#docker run --name guacd -d glyptodon/guacd

#docker run --name guacamole --link guacd:guacd -d -p 8080:8080 glyptodon/guacamole /bin/sh -c "cd /usr/local/tomcat && exec catalina.sh run"

 

#コンテナ内で操作

#docker exec -ti guacamole /bin/bash

#mkdir -p /root/.guacamole

#cat > /root/.guacamole/guacamole.properties <<'EOF'

guacd-hostname: guacd

guacd-port: 4822

EOF

 

 

#user-mapping.xml(認証情報)の編集
#ここではguacamoleには、gucauser/Guac123!でログインすることとする。
#接続先は適宜編集してください

#接続先は guacdコンテナからみた接続先であることを注意

#docker ホストに接続するようにしたいのであれば、

#locahostではなく、docker ホストのIP(通常 172.17.0.1)にする
#cat >/root/.guacamole/user-mapping.xml<<'EOF'
<user-mapping>
     <authorize username="guacuser" password="6e9b83fc538318184ca185a44c06d235" encoding="md5">
         <connection name="doccker-host-ssh">
             <protocol>ssh</protocol>
             <param name="hostname">172.17.0.1</param>
             <param name="port">22</param>
         </connection>
         <connection name="RDP">
             <protocol>rdp</protocol>
             <param name="hostname">localhost</param>
             <param name="port">3389</param>
         </connection>
        <connection name="VNC">
            <protocol>vnc</protocol>
            <param name="hostname">localhost</param>
            <param name="port">5901</param>
        </connection>
     </authorize>
</user-mapping>
EOF

 

 

#guacamole コンテナからログアウト

#exit

#guacamole コンテナ再起動

#docker restart guacamole

 

以下のURLでアクセスできます

https//<dockerホストのIPアドレス>:8080/guacamole