Dockerの基本操作とオラクルイメージの作成

今回は、Dockerを使ってオラクルデータベースのインスタンスを作成しましたので、手順を残します。
なお、Dockerについては、作業に必要な最低限の説明をします。

Dockerとは

様々なサイトで紹介されているDocker、ザックリいうと以下のようなものです。

  • VMWareのように仮想マシン上にゲストOSから構築するのではなく、
  • OSはホストマシンに依存しアプリケーションの動作に必要なライブラリ等で仮想環境(コンテナ)を構築する
  • コンテナ内ではユーザーやファイルシステム、ネットワークは独立した環境となる(仮想マシンと同じ)
  • 通常は、DockerイメージをDocker-hubからダウンロードしてコンテナを起動
  • ファイルは、コンテナ内に置くこともコンテナの外に置くこともできる

Dockerコマンド概要

実際にDockerの操作に必要なコマンドを見ていきましょう。
具体例として、Linux上にNginx(ウェブサーバー)を取得し、起動してみましょう。

$ docker pull nginx:latest
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f949e7d76d63 3 months ago 126MB
$ docker container run –name webserver -d -p 30001:80 nginx
$ docker container ps

1つ目のコマンド(docker pull)にて、docker-hubからNginxの最新版イメージを取得します。
2つ目のコマンド(docker image ls)にて、取得したイメージを確認します。
3つ目のコマンド(docker container run)にて、イメージからコンテナを作成して起動します。コマンドの引数にて、コンテナ名をwebserver、コンテナ内のポート80をホスト側の30001にマッピング(変換)しています。
起動中のコンテナは、4つ目のコマンド(docker container ps)にて確認できます。

DockerCompose

次に、docker-composeです。これは、複数のコンテナの起動や停止を管理するツールだと思えばよいでしょう。
具体的には、管理したいdockerコンテナを管理ファイル(docker-compose.yaml)に記述して管理します。

version: “2”
services:
postgres:
image: “openmaptiles/postgis:${TOOLS_VERSION}”
volumes:
– pgdata:/var/lib/postgresql/data
networks:
– postgres_conn
ports:
– “5432”
env_file: .env
import-natural-earth:
image: “openmaptiles/import-natural-earth:${TOOLS_VERSION}”
env_file: .env
networks:
– postgres_conn

上記はdocker-compose.yamlの例ですが、postgres、import-natural-earthという2つのコンテナを定義しています。
postgresは、PostGISサーバー、import-natural-earth は、PostGIS上にデータを取り込むためのシェルスクリプトです。
例えば、PostGISコンテナを起動と停止は、以下のコマンドを発行します。

$ docker-compose up postgres
$ docker-compose stop postgres

起動するコンテナが一つだった場合でも起動時のパラメータをファイルに保存できるので、それだけでもdocker-composeを利用するメリットはあります。

オラクルのDockerイメージ構築

ここからが本題のオラクルのDockerイメージの作成です。
下記サイトを参考にさせていただきました。

オラクルのDockerイメージは公開されていないため、GitHubのDockerfileとオラクルのインストール媒体からイメージを作成しコンテナを起動します。手順を以下に示します。

1.オラクルのインストール媒体のダウンロード
オラクル社のサイトにてプロファイルを作成してインストール媒体(無償)をダウンロードします。
私は下記ファイル(Oracle12c Rel2)をダウンロードしましたが、サイズが3GB以上ありますので、注意してください。
linuxx64_12201_database.zip

2.githubからイメージ作成用のリポジトリを取得
インストール用のディレクトリを作成し、下記コマンドにてクローンを取得します。

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

取得すると、docker-imagesというディレクトリが作成されます。

3.インストール媒体を配置
取得したリポジトリは、docker-images の中の正しい場所に配置する必要があります。
先ほどのファイルの場合は、下記ディレクトリに配置します。
docker-images/OracleDatabase/SingleInstance/dockerfiles/12.2.0.1

4.イメージのビルド
下記コマンドにてイメージをビルドします。今回は、SE2でビルドしました。
ビルドには10~20分程度かかります。

$ docker-images/OracleDatabase/SingleInstance/dockerfiles
$ ./buildDockerImage.sh -v 12.2.0.1 -s -i

ビルドのオプションは、以下に書いてあります。

ビルドが終了すると、以下のメッセージが表示されます。

Oracle Database Docker Image for ‘se2’ version 12.2.0.1 is ready to be extended:
–> oracle/database:12.2.0.1-se2
Build completed in 849 seconds.

5.データファイル用ディレクトリ作成
オラクルのデータファイルをホスト側に置くのであれば、収容するディレクトリを作成します。
今回は、./oradataとします。

6.yamlファイル作成
オラクルインスタンス(コンテナ)起動用のdocker-compose.yamlファイルを作成します。
以下のような内容です。

version: ‘2’
services:
db:
image: oracle/database:12.2.0.1-se2
container_name: oracle
ports:
– 30005:1521
– 30006:5500
volumes:
– ./oradata:/opt/oracle/oradata
environment:
– ORACLE_PWD=manager
– ORACLE_PDB=pd

上記では、SQL*Netとエンタープライズマネージャのホスト側ポート番号を、それぞれ30001、30006に変換しています。

7.コンテナの起動
下記コマンドにてオラクルのコンテナを起動します。

$ docker-compose up -d
Creating oracle … done
$ docker logs -f oracle

2つ目のコマンド(docker logs -f oracle)にて、ログが表示されます。
最終行あたりに以下の表示があれば正常終了です。

SQL> Disconnected from Oracle Database 12c Standard Edition Release 12.2.0.1.0 – 64bit Production
The Oracle base remains unchanged with value /opt/oracle
##################
DATABASE IS READY TO USE!
##################

上記により、コンテナ内では オラクルインスタンスだけでなくリスナーも起動しているようで、SQL*PlusやSQLDeveloperから接続できます。
今回の場合は、ホスト側のポートを変更していますので、通常の1521ではなく、30005を指定します。

まとめ

今回は、Dockerの概要を説明し、オラクルのイメージを作成してコンテナを起動しました。
手順に従って作業すれば、あっけないほどスムーズに作業を完了しました。

以下の記事では、PostGISのDockerコンテナ導入について書いていますので、よかったら参考にしてください。