迷える30代後半、奮闘する

アメリカ滞在、IT関連情報など自分向けに整理した内容をブログという形でアウトプットしたものです

DockerでOracle Databaseの環境を作ってみる

目的

  1. Oracle Databaseのサーバ、クライアント間で送受信されるパケットを見る
  2. Dockerのお勉強

構成

ホストマシン : Macbook
仮想化環境 : VMware Fusion
ゲストOS : Ubuntu 14.04.5

このゲストOSの上にDockerをインストールし、Oracle Database用Dockerイメージを使ってサーバ、クライアントそれぞれのコンテナを起動する。

手順

1. 仮想マシンの作成

さくっと省略。

2. Dockerのインストー

基本的にはDockerの公式サイト(英語)に従う。 今回選択したのはUbuntu用のDocker CE。

aptのインデックスをアップデート。

$ apt-get update

Ubuntu 14.04では推奨される、ということでlinux-image-extra-*パッケージをインストール。 これはDockerがaufsストレージドライバを利用可能にするための処置。 なおUbuntu 16.04以降ではDockerはデフォルトでoverlay2ストレージドライバを利用する。

$ sudo apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual

aptがhttpsリポジトリにアクセスするためのパッケージをインストール。

$ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common

Docker公式のPGPキーをインストール。

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

stableリポジトリを追加。アーキテクチャamd64を選択。

$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

再度aptのインデックスをアップデート。

$ sudo apt-get update

ようやくDockerのインストール。 複数のDockerリポジトリを有効にしている場合にはバージョンを指定しないと最新バージョンがインストールされちゃってstableとは限らないよ、と注意書きがあるが今回は一つしかリポジトリを有効にしていないので指定なしで実行する。

$ sudo apt-get install docker-ce

インストールの確認。

$ sudo docker run --name=hello hello-world

Dockerイメージがダウンロードされたのちに実行され、"Hello from docker!“が表示されることを確認。

hello-worldを処分。

$ sudo docker rm hello
$ sudo docker rmi hello-world

3. Oracle DatabaseのDockerイメージを使ってサーバを起動させる

Docker Hubで"oracle"と検索するといくつかヒットするので、その中からexpress editionかつpull数が多かった “wnameless/oracle-xe-11g"というイメージを使ってみることにする。

$ sudo docker pull wnameless/oracle-xe-11g

イメージのダウンロードが終わったら起動させてみる。

$ sudo docker run --name=server -d 49161:1521 -e ORACLE_ALLOW_REMOTE=true wnameless/oracle-xe-11g
$ sudo docker exec -it server /bin/bash
root@6d494f1dd06f:~#

無事に起動してる。

4. クライアント用のコンテナを起動してコンテナ間で通信させる

使うイメージはサーバ用に使ったものと同一のものとする。単にsqlplusを使いたいだけなんだけどこっちの環境でもサーバが起動してる。が、今回はとにかく動かしたいだけなので特にケアせず放置。

$ sudo docker run --name=client -d wnameless/oracle-xe-11g
$ sudo docker exec -it client /bin/bash
root@549a3a224e1a:~#

こちらも無事に起動。

クライアントからサーバへログイン。

root@549a3a224e1a:~# sqlplus [user]/[password]@[server_ip_addr]:1521

SQL*Plus: Release 11.2.0.2.0 Production Fri Jul 14 20:45:26 2017
:
:
Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production

SQL>

つながった!

5. コンテナ間のパケットキャプチャ

Ubuntuにインストールしたwiresharkを起動。ただしこのとき全インターフェースリストを取得するためrootで起動する。

$ sudo wireshark

wiresharkの"List the available capture interfaces…“ボタンをクリックして"docker0"インターフェースを選択 -> "start”

f:id:azuman0803:20170715063557p:plain

さきほどのクライアントを使ってサーバにコマンドを送ってみる。

SQL> select * from all_users;

USERNAME                          USER_ID CREATED
------------------------------ ---------- ---------
XS$NULL                        2147483638 28-AUG-11
APEX_040000                            47 28-AUG-11
APEX_PUBLIC_USER                       45 28-AUG-11
FLOWS_FILES                            44 28-AUG-11
HR                                     43 28-AUG-11
MDSYS                                  42 28-AUG-11
ANONYMOUS                              35 28-AUG-11
XDB                                    34 28-AUG-11
CTXSYS                                 32 28-AUG-11
OUTLN                                   9 28-AUG-11
SYSTEM                                  5 28-AUG-11

USERNAME                          USER_ID CREATED
------------------------------ ---------- ---------
SYS                                     0 28-AUG-11

12 rows selected.

SQL>

f:id:azuman0803:20170715064329p:plain

無事にwireshark上でサーバ/クライアント間のパケットがキャプチャされること、及びselect文が送信されていることを確認。

アメリカで高く飛ぶ

会社から異動の話をいただいた。 思ってもいないタイミングで、思ってもいない部署・仕事内容だった。 それまではカスタマーサポート部門でマネージャとして働いていたのだが 打って変わってソフトウェア開発部門に移り、 アメリカ西海岸にある協力会社と一緒になって開発をするというものだった。 しかもその開発を通じて経験値を上げ、最終的には会社に新たなプロダクトをもたらすというゴールも与えられた。

何年か前にソフトウェア開発部門に在籍はしていたものの、そこまでがっつりとコーディングをしていなかったし 最近のソフトウェア業界の事情にもキャッチアップできていないし、ビジネスサイドの知識も不十分ということで 自分には果てしない話のように思えた。

しかしながら、せっかくこのような機会を与えていただいたので どうにか自身を鼓舞しながら大きなゴールに向かって進んで行きたいと思う。

まずは英語だな。