OCIのAmpere(ARM)プロセッサを用いたインスタンス上に、Dockerを用いてOracleClientのコンテナを構築してみた

# はじめに
OCIでは無料で使えるAlwaysFreeのシェイプとしてAmpere(ARM)ベースのプロセッサが提供されています。
今回はARMベースのシェイプに対してOracleClientをインストールして、sqlplusが使えるになる状態まで環境を構築したいと思います。
併せてArmプロセッサ上にOracleClient環境のDockerコンテナも構築したいと思います。

# 条件
- OS: OracleLinux8
- シェイプ: VM.Standard.A1.Flex
- Docker, Gitがインストール済みであること

# 前提知識
ARMシェイプでは、Oracle Instant Client Release 19.10をインストールする際は下記コマンドでインストール可能です。

```shell
$ sudo dnf install oracle-release-el8
$ sudo dnf install oracle-instantclient19.10-basic
$ sudo dnf install oracle-instantclient19.10-sqlplus
```
これだけの行で手軽に構築ができます

```shell-session
$ sqlplus /nolog

SQL*Plus: Release 19.0.0.0.0 - Production on Fri May 27 00:04:31 2022
Version 19.10.0.0.0

Copyright (c) 1982, 2021, Oracle.  All rights reserved.

SQL>
```

これをArmベースのコンテナ上に構築したいと思います。

# ArmベースのDocker上でOracleClientを構築
同じインスタンス上にDockerをインストールし、コンテナ上からsqlplusを起動させてみたいと思います。

*dockerとgitを利用しますが、こちらのインストールは割愛致します。

## Gitでdocker-imagesを取得
OracleよりDockerfileが展開されているので、下記コマンドを利用し取得

```shell
$ mkdir ~/oracle
$ cd ~/oracle/
$ git clone https://github.com/oracle/docker-images
Cloning into 'docker-images'...
remote: Enumerating objects: 15630, done.
remote: Counting objects: 100% (85/85), done.
remote: Compressing objects: 100% (68/68), done.
remote: Total 15630 (delta 25), reused 56 (delta 15), pack-reused 15545
Receiving objects: 100% (15630/15630), 10.33 MiB | 11.77 MiB/s, done.
Resolving deltas: 100% (9224/9224), done.
$ ls
docker-images
```

## Dockerfileの編集
22年5月現在、19.15バージョンがarm用にdnf経由でインストールできないため、
Dockerfile内のバージョン情報を19.10に修正

```shell
$ cd ~/oracle/docker-images/OracleInstantClient/oraclelinux8/19/
$ vi Dockerfile

$ #ARG updateを15->10に修正
ARG update=10　
```

## ビルド
```shell
$ cd ~/oracle/docker-images/OracleInstantClient/oraclelinux8/19/
$ sudo docker build --pull -t oraclelinux8-instantclient:19 .
```

<details><summary>実行結果</summary>


```
Sending build context to Docker daemon  5.632kB
Step 1/5 : FROM oraclelinux:8
8: Pulling from library/oraclelinux
Digest: sha256:cad3a3dc2dd9f03dec02642dce1f194562e7f21820bc36ceb9f7b070d337fb45
Status: Image is up to date for oraclelinux:8
 ---> 5c8ddda83e1b
Step 2/5 : ARG release=19
 ---> Running in fb644d766d08
Removing intermediate container fb644d766d08
 ---> 4e9e9a535e72
Step 3/5 : ARG update=10
 ---> Running in 8da4b4449729
Removing intermediate container 8da4b4449729
 ---> f6fd449cd936
Step 4/5 : RUN  dnf -y install oracle-release-el8 &&      dnf -y install oracle-instantclient${release}.${update}-basic oracle-instantclient${release}.${update}-devel oracle-instantclient${release}.${update}-sqlplus &&      rm -rf /var/cache/dnf
 ---> Running in 3eb91221c9f1
Oracle Linux 8 BaseOS Latest (aarch64)           44 MB/s |  52 MB     00:01
Oracle Linux 8 Application Stream (aarch64)      34 MB/s |  31 MB     00:00
Last metadata expiration check: 0:00:07 ago on Fri May 27 01:00:56 2022.
Dependencies resolved.
================================================================================
 Package                Arch        Version         Repository             Size
================================================================================
Installing:
 oracle-release-el8     aarch64     1.0-2.el8       ol8_baseos_latest      16 k

Transaction Summary
================================================================================
Install  1 Package

Total download size: 16 k
Installed size: 18 k
Downloading Packages:
oracle-release-el8-1.0-2.el8.aarch64.rpm        6.4 kB/s |  16 kB     00:02
--------------------------------------------------------------------------------
Total                                           6.4 kB/s |  16 kB     00:02
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1
  Installing       : oracle-release-el8-1.0-2.el8.aarch64                   1/1
  Running scriptlet: oracle-release-el8-1.0-2.el8.aarch64                   1/1
  Verifying        : oracle-release-el8-1.0-2.el8.aarch64                   1/1

Installed:
  oracle-release-el8-1.0-2.el8.aarch64

Complete!
Oracle Instant Client for Oracle Linux 8 (aarch  15 kB/s | 3.7 kB     00:00
Dependencies resolved.
===========================================================================================
 Package                             Arch     Version       Repository                 Size
===========================================================================================
Installing:
 oracle-instantclient19.10-basic     aarch64  19.10.0.0.0-1 ol8_oracle_instantclient   47 M
 oracle-instantclient19.10-devel     aarch64  19.10.0.0.0-1 ol8_oracle_instantclient  599 k
 oracle-instantclient19.10-sqlplus   aarch64  19.10.0.0.0-1 ol8_oracle_instantclient  654 k
Installing dependencies:
 libaio                              aarch64  0.3.112-1.el8 ol8_baseos_latest          32 k

Transaction Summary
===========================================================================================
Install  4 Packages

Total download size: 49 M
Installed size: 191 M
Downloading Packages:
(1/4): libaio-0.3.112-1.el8.aarch64.rpm         212 kB/s |  32 kB     00:00
(2/4): oracle-instantclient19.10-sqlplus-19.10. 2.2 MB/s | 654 kB     00:00
(3/4): oracle-instantclient19.10-devel-19.10.0. 3.6 MB/s | 599 kB     00:00
(4/4): oracle-instantclient19.10-basic-19.10.0.  39 MB/s |  47 MB     00:01
--------------------------------------------------------------------------------
Total                                            40 MB/s |  49 MB     00:01
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1
  Installing       : libaio-0.3.112-1.el8.aarch64                           1/4
  Installing       : oracle-instantclient19.10-basic-19.10.0.0.0-1.aarch6   2/4
  Running scriptlet: oracle-instantclient19.10-basic-19.10.0.0.0-1.aarch6   2/4
  Installing       : oracle-instantclient19.10-sqlplus-19.10.0.0.0-1.aarc   3/4
  Running scriptlet: oracle-instantclient19.10-sqlplus-19.10.0.0.0-1.aarc   3/4
  Installing       : oracle-instantclient19.10-devel-19.10.0.0.0-1.aarch6   4/4
  Running scriptlet: oracle-instantclient19.10-devel-19.10.0.0.0-1.aarch6   4/4
  Verifying        : libaio-0.3.112-1.el8.aarch64                           1/4
  Verifying        : oracle-instantclient19.10-basic-19.10.0.0.0-1.aarch6   2/4
  Verifying        : oracle-instantclient19.10-sqlplus-19.10.0.0.0-1.aarc   3/4
  Verifying        : oracle-instantclient19.10-devel-19.10.0.0.0-1.aarch6   4/4

Installed:
  libaio-0.3.112-1.el8.aarch64
  oracle-instantclient19.10-basic-19.10.0.0.0-1.aarch64
  oracle-instantclient19.10-devel-19.10.0.0.0-1.aarch64
  oracle-instantclient19.10-sqlplus-19.10.0.0.0-1.aarch64

Complete!
Removing intermediate container 3eb91221c9f1
 ---> 99312a278fd8
Step 5/5 : CMD ["sqlplus", "-v"]
 ---> Running in edf598253411
Removing intermediate container edf598253411
 ---> 28a1ee35bee2
Successfully built 28a1ee35bee2
Successfully tagged oraclelinux8-instantclient:19
```
</details>



末尾にSuccessfully builtとなっていることを確認

## ビルドしたイメージを起動させ、コンテナ上のsqlplusを実行
```shell-session
$ sudo docker run -ti --rm oraclelinux8-instantclient:19 sqlplus /nolog

SQL*Plus: Release 19.0.0.0.0 - Production on Fri May 27 01:06:20 2022
Version 19.10.0.0.0

Copyright (c) 1982, 2021, Oracle.  All rights reserved.

SQL>
```

これで環境を汚さずに手軽にsqlplus環境を構築することが出来ました。


## 接続例
docker run時に、-vや-e 引数を利用することでホスト側のtnsnames.oraファイルを利用し接続も可能です。
```shell
#Sample

#ホスト側でローカル・ネーミング・パラメータ(tnsnames.ora)を作成
#DBCS上のPDB1の接続先を作成
$ vi tnsnames.ora
PDB1 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = db1.subnet1.demovcn1.oraclevcn.com)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = pdb1.subnet1.demovcn1.oraclevcn.com)
    )
  )

#コンテナ上のsqlplusを利用して接続
$ sudo docker run -ti \
-e ORACLE_HOME=/usr/lib/oracle/19.10/client64/lib \
-v "$(pwd)":/usr/lib/oracle/19.10/client64/lib/network/admin/ \
--rm oraclelinux8-instantclient:19 \
sqlplus sys/testPassword123#@pdb1 as sysdba
#-e でORACLE_HOMEの変数を定義
#-v でホスト側のカレントディレクトリにあるtnsnames.oraファイルをコンテナ上の/usr/lib/oracle/19.10/client64/lib/network/admin/へマウント(カレントディレクトリを渡す)


SQL*Plus: Release 19.0.0.0.0 - Production on Fri May 27 06:18:05 2022
Version 19.10.0.0.0

Copyright (c) 1982, 2021, Oracle.  All rights reserved.


Connected to:
Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Version 19.14.0.0.0

#接続できたことの確認
SQL> show con_name

CON_NAME
------------------------------
PDB1
SQL>

```


# 参考
https://docs.oracle.com/cd/F19136_01/lacli/installing-ic-arm-packages.html#GUID-61E2E62D-43D1-48C6-84C0-AE9FC547E823

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