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

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

guacamole を使う その1 (CentOS7+yum 編)

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

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

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

 

 

ここからが本題です。
本エントリは、Oracleから少し外れて、guacamoleというリモートデスクトップゲートウェイの紹介です。

 

通常、LinuxマシンでGUI環境が必要な場合、vncviewer等で
接続する必要があります。

vncviewerをインストールすることが難しい場合もありますし、
他ネットワークだとするとvncのポートが解放されてなかったり
色々と面倒なこともしばしばあります。


そんなとき、非常に便利なのがguacamoleです。

http(s)ベースのリモートデスクトップゲートウェイとして動作するため、
クライアント端末側には、ブラウザさえあればOKです。
(最新バージョン(0.9.9)ではiphoneからも操作できます)

https://guacamole.incubator.apache.org/


今回は、CentOS7(RHEL7/OEL7)での簡単なインストール方法を紹介します。

<構成>
・OS CentOS7.2
・guacd/guacamole (tomcat) 同一マシン構成

・guacd/guacamole 0.8.4(執筆時点)
・DB連携なし
SSL構成なし


<インストール方法>

 

#epel有効化
#rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

 

#必要モジュールインストール
#yum -y install guacamole guacd libguac-client-rdp libguac-client-vnc libguac-client-ssh

 

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

 

#user-mapping.xml(認証情報)の編集
#ここではguacamoleには、gucauser/Guac123!でログインすることとする。
#接続先は適宜編集してください
#cat > /etc/guacamole/user-mapping.xml <<'EOF'
<user-mapping>
     <authorize username="guacuser" password="6e9b83fc538318184ca185a44c06d235" encoding="md5">
         <connection name="localhost ssh">
             <protocol>ssh</protocol>
             <param name="hostname">localhost</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関連サービスの起動/有効化
#
#systemctl start guacd
#systemctl start tomcat
#
#systemctl enable guacd
#systemctl enable tomcat


上記設定後、ブラウザから以下のURLへアクセスするとguacamoleにログインできます
http://guacamoleがインストールされているマシンのIP:8080/guacamole

Google Compute Cloud で Oracle Linux 7.xを使う

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

 

Oracle Database Connect 2016 | Japan Oracle User Group (JPOUG)

 

ここからが本題ですが、以下の関連エントリです。

CentOS6まではcentos2ol.shというスクリプトOracleから提供されていたので、

Oracle Linuxをカスタムインストールせずとも、わりと簡単に使用できていたのですが、

OentOS7には対応していないので、ちょっとした工夫が必要です。

 

Oracle Linux 7 から CentOS7に変換しているブログを見つけたので、

それの応用でCentOS7からOracle Linux 7へ変換することができます。

 

linuxsysconfig.com

 

上記を見ながら作ったスクリプトがこちら。

root権限が必要です。

 

centos72ol7.sh

 #!/bin/bash
curl http://yum.oracle.com/public-yum-ol7.repo -o /etc/yum.repos.d/public-yum-ol7.repo
rpm --import http://public-yum.oracle.com/RPM-GPG-KEY-oracle-ol7
yum -y update yum
yum clean all
rpm -e --nodeps centos-release centos-logos
yum -y install oraclelinux-release oracle-logos
yum -y upgrade
rpm -qa --qf '%{NAME}:%{VENDOR}\n' |  grep  CentOS >> centospacks
cat centospacks | awk -F":" '{print $1}' >> centospacks2
yum -y reinstall --enablerepo=ol7_optional_latest `cat centospacks2`
yum -y update --enablerepo=ol7_optional_latest `cat centospacks2`
rm -f centospacks
rm -f centospacks2
reboot

 

内容的にGCEに依存したものではないので、Windows AzureやEC2等他のクラウドでも

使えると思います。

(AzureやEC2は、Oracle Linux 7のイメージあるので不要ですが)

手っ取り早くOracle Linux 7を使いたい時にはいかがでしょうか?

Google Compute Cloud で Oracle Linux 6.xを使う

以下の関連ネタとなりますが、Google Compute Cloud で Oracle Linux 6.xを使う

方法です。

Microsoft Azureで最新のOracle Linux 6.xを使う - KNOPP’s blog

 

とは言っても、そんなにいばるような話しでもなく、

centos-6のインスタンスを立ち上げた後、Oracleから提供されている

CentOS → Oracle linux 変換スクリプトを使う方法です。

 

sudo su -

#centos-release-SCLが残っていると centos2ol.shが失敗するのでremoveしておく。
yum remove centos-release-SCL
curl -O https://linux.oracle.com/switch/centos2ol.sh
sh centos2ol.sh
yum upgrade
reboot

 

 

Microsoft Azureで最新のOracle Linux 6.xを使う

Microsoft AzureではOracle Linux 6.4が提供されていますが、

そのままでは、yum updateすることができません。

yum updateすると以下のようなエラーが出ます。

 

 

Transaction Summary
================================================================================
Install 6 Package(s)
Upgrade 153 Package(s)

Total size: 155 M
Downloading Packages:
Running rpm_check_debug
ERROR with rpm_check_debug vs depsolve:
kernel-headers is needed by glibc-headers-2.12-1.149.el6_6.9.x86_64
kernel-headers >= 2.2.1 is needed by glibc-headers-2.12-1.149.el6_6.9.x86_64
kernel-uek is needed by oracle-rdbms-server-12cR1-preinstall-1.0-13.el6.x86_64
kernel-uek is needed by oracle-rdbms-server-11gR2-preinstall-1.0-11.el6.x86_64
** Found 4 pre-existing rpmdb problem(s), 'yum check' output follows:
glibc-headers-2.12-1.107.el6_4.4.x86_64 has missing requires of kernel-headers
glibc-headers-2.12-1.107.el6_4.4.x86_64 has missing requires of kernel-headers >= ('0', '2.2.1', None)
oracle-rdbms-server-11gR2-preinstall-1.0-7.el6.x86_64 has missing requires of kernel-uek
oracle-rdbms-server-12cR1-preinstall-1.0-8.el6.x86_64 has missing requires of kernel-uek
Your transaction was saved, rerun it with: yum load-transaction /tmp/yum_save_tx-2015-07-20-03-390yz8UI.yumtx

 これは、依存関係にあるパッケージがなぜかインストールされていないため、おきるようです。

以下を実施することでupdateできます。

sudo yum -y remove oracle-rdbms-server-11gR2-preinstall-1.0-7.el6.x86_64
sudo yum -y remove oracle-rdbms-server-12cR1-preinstall-1.0-8.el6.x86_64
sudo yum -y install kernel-headers
sudo yum -y update

あとはrebootすれば、最新(執筆時点では6.7)になります