rhel8上のdockerにOracle21c XEを入れてみました。

# はじめに

dockerにOracle21c XEを導入して動作確認をやってみました。

# 目次

1.前提条件
2.追加ソフトウェア
3.Oracle21c XEのコンテナイメージの作成
4.Oracle21c XEのコンテナの起動
5.Oracle Instant Clientコンテナイメージの作成
6.Oracle Instant Clientコンテナを起動して接続確認
7.参考
8.改訂履歴

# 1.前提条件

* ここでまとめた情報は、AWS上のRHEL8.6 20220503のamiをベースにしています。
* SELINUXは無効化してあります。
* 使用リージョンはap-northeast-1です。
* 使用するユーザは、ec2-userとします。
* dockerは、20.10.18を導入済みです。
* 使用したインスタンスは、t3.largeです。
* Oracle21c XEコンテナ作成後に、Oracle Instant Clientコンテナを作成して、接続確認を行います。
* Oracle21c XEコンテナが稼働するOSは、Oracle Linux7を使用しています。（構築スクリプトで指定しているため）
* Oracle Instant Clientコンテナが稼働するOSは、Oracle Linux8を使用しています。

# 2.追加パッケージ・ソフトウェア

## 2-1 OS標準の追加パッケージは、以下の通りです。
* langpack-ja
* git

# 3.Oracle21c XEのコンテナイメージの作成

## 3-1 githubからコンテナ作成用スクリプトをDLします。

```Bash:
$ git clone https://github.com/oracle/docker-images.git
Cloning into 'docker-images'...
remote: Enumerating objects: 16343, done.
remote: Counting objects: 100% (258/258), done.
remote: Compressing objects: 100% (197/197), done.
remote: Total 16343 (delta 95), reused 154 (delta 51), pack-reused 16085
Receiving objects: 100% (16343/16343), 10.57 MiB | 21.36 MiB/s, done.
Resolving deltas: 100% (9606/9606), done.
$ ls -la docker-images
合計 40
drwxrwxr-x 35 ec2-user ec2-user  4096  1月  1 18:58 .
drwxrwxr-x  4 ec2-user ec2-user    59  1月  1 18:58 ..
drwxrwxr-x  8 ec2-user ec2-user   163  1月  1 18:58 .git
-rw-rw-r--  1 ec2-user ec2-user    44  1月  1 18:58 .gitattributes
drwxrwxr-x  4 ec2-user ec2-user   122  1月  1 18:58 .github
-rw-rw-r--  1 ec2-user ec2-user    74  1月  1 18:58 .gitignore
-rw-rw-r--  1 ec2-user ec2-user     0  1月  1 18:58 .gitmodules
drwxrwxr-x  6 ec2-user ec2-user   110  1月  1 18:58 Archive
-rw-rw-r--  1 ec2-user ec2-user  1319  1月  1 18:58 CODEOWNERS
-rw-rw-r--  1 ec2-user ec2-user  3359  1月  1 18:58 CODE_OF_CONDUCT.md
-rw-rw-r--  1 ec2-user ec2-user 10571  1月  1 18:58 CONTRIBUTING.md
drwxrwxr-x  3 ec2-user ec2-user    53  1月  1 18:58 Contrib
drwxrwxr-x  3 ec2-user ec2-user    16  1月  1 18:58 GraalVM
-rw-rw-r--  1 ec2-user ec2-user  1844  1月  1 18:58 LICENSE.txt
drwxrwxr-x  4 ec2-user ec2-user    68  1月  1 18:58 NoSQL
drwxrwxr-x  4 ec2-user ec2-user    76  1月  1 18:58 OracleAccessManagement
drwxrwxr-x  4 ec2-user ec2-user    57  1月  1 18:58 OracleAnalytics
drwxrwxr-x  3 ec2-user ec2-user    59  1月  1 18:58 OracleBI
drwxrwxr-x  4 ec2-user ec2-user    59  1月  1 18:58 OracleCloudInfrastructure
drwxrwxr-x  2 ec2-user ec2-user    23  1月  1 18:58 OracleCoherence
drwxrwxr-x  4 ec2-user ec2-user    56  1月  1 18:58 OracleDatabase
drwxrwxr-x  4 ec2-user ec2-user    57  1月  1 18:58 OracleEssbase
drwxrwxr-x  4 ec2-user ec2-user    57  1月  1 18:58 OracleFMWInfrastructure
drwxrwxr-x  4 ec2-user ec2-user    49  1月  1 18:58 OracleGoldenGate
drwxrwxr-x  4 ec2-user ec2-user    74  1月  1 18:58 OracleHTTPServer
drwxrwxr-x  5 ec2-user ec2-user    91  1月  1 18:58 OracleIdentityGovernance
drwxrwxr-x  4 ec2-user ec2-user    63  1月  1 18:58 OracleInstantClient
drwxrwxr-x  6 ec2-user ec2-user    62  1月  1 18:58 OracleJava
drwxrwxr-x  4 ec2-user ec2-user    63  1月  1 18:58 OracleLinuxDevelopers
drwxrwxr-x  3 ec2-user ec2-user    42  1月  1 18:58 OracleManagementAgent
drwxrwxr-x  3 ec2-user ec2-user    33  1月  1 18:58 OracleOpenJDK
drwxrwxr-x  3 ec2-user ec2-user    77  1月  1 18:58 OracleRestDataServices
drwxrwxr-x  4 ec2-user ec2-user    91  1月  1 18:58 OracleSOASuite
drwxrwxr-x  4 ec2-user ec2-user    47  1月  1 18:58 OracleTuxedo
drwxrwxr-x  5 ec2-user ec2-user   109  1月  1 18:58 OracleUnifiedDirectory
drwxrwxr-x  4 ec2-user ec2-user    94  1月  1 18:58 OracleUnifiedDirectorySM
drwxrwxr-x  3 ec2-user ec2-user    22  1月  1 18:58 OracleVeridata
drwxrwxr-x  3 ec2-user ec2-user    42  1月  1 18:58 OracleWebCenterContent
drwxrwxr-x  3 ec2-user ec2-user    42  1月  1 18:58 OracleWebCenterPortal
drwxrwxr-x  3 ec2-user ec2-user    59  1月  1 18:58 OracleWebCenterSites
drwxrwxr-x  4 ec2-user ec2-user    74  1月  1 18:58 OracleWebLogic
-rw-rw-r--  1 ec2-user ec2-user  3119  1月  1 18:58 README.md
drwxrwxr-x  2 ec2-user ec2-user    18  1月  1 18:58 scripts
```

## 3-2 ディレクトリを移動して、コンテナイメージを作成します。（約10分近くかかります）

```Bash:
$ cd docker-images/OracleDatabase/SingleInstance/dockerfiles/
$ ./buildContainerImage.sh -v 21.3.0 -x
Checking Docker version.
Ignored MD5 checksum.
==========================
Container runtime info:
Client:
 Context:    default
 Debug Mode: false
 Plugins:
  app: Docker App (Docker Inc., v0.9.1-beta3)
  buildx: Docker Buildx (Docker Inc., v0.9.1-docker)
  scan: Docker Scan (Docker Inc., v0.17.0)

　・
　・
（中略）
　・
　・

Changing permissions of /opt/oracle/oraInventory.
Adding read,write permissions for group.
Removing read,write,execute permissions for world.

Changing groupname of /opt/oracle/oraInventory to oinstall.
The execution of the script is complete.
Check /opt/oracle/product/21c/dbhomeXE/install/root_91db98214edc_2023-01-01_05-04-20-544484975.log for the output of root script
Removing intermediate container 91db98214edc
 ---> 091a110258d8
Step 7/10 : USER oracle
 ---> Running in 255c9f8ad96d
Removing intermediate container 255c9f8ad96d
 ---> 68aa7dc8e56a
Step 8/10 : WORKDIR /home/oracle
 ---> Running in 1e628b183bd5
Removing intermediate container 1e628b183bd5
 ---> 6e98108009a3
Step 9/10 : HEALTHCHECK --interval=1m --start-period=5m --timeout=30s    CMD "$ORACLE_BASE/$CHECK_DB_FILE" >/dev/null || exit 1
 ---> Running in c538fbd548bf
Removing intermediate container c538fbd548bf
 ---> c38838636251
Step 10/10 : CMD exec $ORACLE_BASE/$RUN_FILE
 ---> Running in 7fa7073b1881
Removing intermediate container 7fa7073b1881
 ---> 9b33bf323806
[Warning] One or more build-args [DB_EDITION] were not consumed
Successfully built 9b33bf323806
Successfully tagged oracle/database:21.3.0-xe


  Oracle Database container image for 'xe' version 21.3.0 is ready to be extended: 
    
    --> oracle/database:21.3.0-xe

  Build completed in 543 seconds.
$ dockerf image ls
REPOSITORY                            TAG         IMAGE ID       CREATED          SIZE
oracle/database                       21.3.0-xe   9b33bf323806   18 seconds ago   6.53GB
```

# 4.Oracle21c XEのコンテナの起動

## 4-1 docker内にoracle-networkを作成します。

* Oracle21c XEとOracle Instant Client間で接続確認を行う際、ネットワークが必要になりますので、先にdocker内にoracle-networkを作成します。

```Bash:
$ docker network create oracle-network
08fb0b4e8941666417ae1fe6085d28f7774758266d2681b1a5aa70dae7aeaf14
$ dockerf network ls
NETWORK ID     NAME             DRIVER    SCOPE
08fb0b4e8941   oracle-network   bridge    local
```

## 4-2 事前にデータファイル格納用ディレクトリを作成します。

```Bash:
$ mkdir -p /home/ec2-user/oracle/opt/oracle/oradata
```

## 4-3 systemd サービスファイルを作成します。
+ 今回、Oracle21c XEを自動起動するようにしたいため、systemd サービスファイルを作成します。
+ ExecStartPreでは、oracle21c XEのコンテナが無い場合は、docker runコマンドでコンテナを生成します。
+ oradataディレクトリ配下を永続化するため、 /home/ec2-user/oracle/opt/oracle/oradata を作成し、 /opt/oracle/oradata にマウントします。
+ ポートはリスナー用に1521、OEM用に5500を用意します。
+ 次回以降は、普通にコンテナを起動します。
+ 停止の仕方について特に記載がなかったため、oracleに対してshutdown immediateを発行し、その後コンテナを停止するようにします。

```:oracle-db-ex-21c.service
[Unit]
Description=oracle-db-ex-21c
#Documentation=
Requires=docker.service
After=docker.service

[Service]
Type=simple
TimeoutStartSec=10m
Environment=DOCKER_NAME=oracle-db-ex-21c
Environment=DOCKER_IMAGE_NAME=oracle/database:21.3.0-xe
Environment=ORACLE_PWD=oracle2O23
Environment=TZ=Asia/Tokyo
Environment=PORT_LISTENER_LOCAL=1521
Environment=PORT_LISTENER_EXPOSE=1521
Environment=PORT_OEM_LOCAL=5500
Environment=PORT_OEM_EXPOSE=5500
Environment=NETWORK_NAME=oracle-network
Environment=VOLUME_ORADATA_LOCAL=/home/ec2-user/oracle/opt/oracle/oradata
Environment=VOLUME_ORADATA=/opt/oracle/oradata
ExecStartPre=/bin/bash -c 'if [ $(/usr/bin/docker ps -a | grep ${DOCKER_NAME} | wc -l) -lt 1 ] ; then /usr/bin/docker run --name ${DOCKER_NAME} --env TZ=${TZ} --env ORACLE_PWD=${ORACLE_PWD} -p ${PORT_LISTENER_LOCAL}:${PORT_LISTENER_EXPOSE} -p ${PORT_OEM_LOCAL}:${PORT_OEM_EXPOSE} -d --network ${NETWORK_NAME} -v ${VOLUME_ORADATA_LOCAL}:${VOLUME_ORADATA} ${DOCKER_IMAGE_NAME} ; fi'
ExecStart=/usr/bin/docker start -a ${DOCKER_NAME}
ExecStop=/usr/bin/docker exec -it ${DOCKER_NAME} bash -c "echo 'shutdown immediate;' | sqlplus system/${ORACLE_PWD} as sysdba" && /usr/bin/docker stop ${DOCKER_NAME}

[Install]
WantedBy=multi-user.target
```

## 4-4 作成したサービスファイルを、/etc/systemd/system/にコピーして、起動します。
起動後、セットアップに10分ほどかかりますので、しばらく待ちます。

```SQL:
$ sudo cp -p oracle-db-ex-21c.service /etc/systemd/system/
$ sudo systemctl enable oracle-db-ex-21c.service --no-pager
$ sudo systemctl start  oracle-db-ex-21c.service --no-pager
$ sudo systemctl status oracle-db-ex-21c.service --no-pager
● oracle-db-ex-21c.service - oracle-db-ex-21c Loaded: loaded (/etc/systemd/system/oracle-db-ex-21c.service; enabled; vendor preset: disabled) Active: active (running) since Sun 2023-01-01 17:42:50 JST; 10s agoProcess: 31036 ExecStartPre=/bin/bash -c if [ $(/usr/bin/docker ps -a | grep ${DOCKER_NAME} | wc -l) -lt 1 ] ; then /usr/bin/dock\
er run --name ${DOCKER_NAME} --env TZ=${TZ} --env ORACLE_PWD=${ORACLE_PWD} -p ${PORT_LISTENER_LOCAL}:${PORT_LISTENER_EXPOSE} -p ${P\
ORT_OEM_LOCAL}:${PORT_OEM_EXPOSE} -p ${PORT_APEX_LOCAL}:${PORT_APEX_EXPOSE} -d --network ${NETWORK_NAME} -v ${VOLUME_ORADATA_LOCAL}\
:${VOLUME_ORADATA} ${DOCKER_IMAGE_NAME} ; fi (code=exited, status=0/SUCCESS)
Main PID: 31203 (docker)  Tasks: 6 (limit: 48604) Memory: 12.3MCGroup: /system.slice/oracle-db-ex-21c.servicemq31203 /usr/bin/docker start -a oracle-db-ex-21c

1月 01 17:42:50 rhel8_6-docker docker[31203]: Confirm the password:
1月 01 17:42:50 rhel8_6-docker docker[31203]: Configuring Oracle List…r.
1月 01 17:42:52 rhel8_6-docker docker[31203]: Listener configuration …d.
1月 01 17:42:52 rhel8_6-docker docker[31203]: Configuring Oracle Data…E.
1月 01 17:43:00 rhel8_6-docker docker[31203]: Enter SYS user password:
1月 01 17:43:00 rhel8_6-docker docker[31203]: [18B blob data]
1月 01 17:43:00 rhel8_6-docker docker[31203]: Enter SYSTEM user passw…d:
1月 01 17:43:00 rhel8_6-docker docker[31203]: [14B blob data]
1月 01 17:43:00 rhel8_6-docker docker[31203]: Enter PDBADMIN User Pas…d:
1月 01 17:43:00 rhel8_6-docker docker[31203]: [15B blob data]
Hint: Some lines were ellipsized, use -l to show in full.
$ docker ps -a
CONTAINER ID   IMAGE                       COMMAND                  CREATED              STATUS                                 PORTS                                                                                                                             NAMES
50a126dedf17   oracle/database:21.3.0-xe   "/bin/sh -c 'exec $O…"   About a minute ago   Up About a minute (health: starting)   0.0.0.0:1521->1521/tcp, :::1521->1521/tcp, 0.0.0.0:5500->5500/tcp, :::5500->5500/tcp   oracle-db-ex-21c
$ docker logs -f 50a126dedf17
Specify a password to be used for database accounts. Oracle recommends that the password entered should be at least 8 characters in length, contain at least 1 uppercase character, 1 lower case character and 1 digit [0-9]. Note that the same password will be used for SYS, SYSTEM and PDBADMIN accounts:
Confirm the password:
Configuring Oracle Listener.
Listener configuration succeeded.
Configuring Oracle Database XE.
Enter SYS user password: 
********** *****
Enter SYSTEM user password: 
********** *
Enter PDBADMIN User Password: 
********** **
Prepare for db operation
7% complete
Copying database files
29% complete
Creating and starting Oracle instance
30% complete
33% complete
37% complete
40% complete
43% complete
Completing Database Creation
47% complete
50% complete
Creating Pluggable Databases
54% complete
71% complete
Executing Post Configuration Actions
93% complete
Running Custom Scripts
100% complete
Database creation complete. For details check the logfiles at:
 /opt/oracle/cfgtoollogs/dbca/XE.
Database Information:
Global Database Name:XE
System Identifier(SID):XE
Look at the log file "/opt/oracle/cfgtoollogs/dbca/XE/XE.log" for further details.

Connect to Oracle Database using one of the connect strings:
     Pluggable database: 50a126dedf17/XEPDB1
     Multitenant container database: 50a126dedf17
Use https://localhost:5500/em to access Oracle Enterprise Manager for Oracle Database XE

SQL*Plus: Release 21.0.0.0.0 - Production on Sun Jan 1 17:50:39 2023
Version 21.3.0.0.0

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


Connected to:
Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0

SQL> 
System altered.

SQL> 
System altered.

SQL> 
Pluggable database altered.

SQL> 
PL/SQL procedure successfully completed.

SQL> SQL> 
Session altered.

SQL> 
User created.

SQL> 
Grant succeeded.

SQL> 
Grant succeeded.

SQL> 
Grant succeeded.

SQL> 
User altered.

SQL> SQL> Disconnected from Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0

SQL*Plus: Release 21.0.0.0.0 - Production on Sun Jan 1 17:50:39 2023
Version 21.3.0.0.0

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


Connected to:
Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0

SQL> 
PL/SQL procedure successfully completed.

SQL> Disconnected from Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
The Oracle base remains unchanged with value /opt/oracle
The Oracle base remains unchanged with value /opt/oracle
#########################
DATABASE IS READY TO USE!
#########################
The following output is now a tail of the alert.log:
XEPDB1(3):Completed: ALTER DATABASE DEFAULT TABLESPACE "USERS"
2023-01-01T17:50:38.560539+09:00
ALTER PLUGGABLE DATABASE XEPDB1 SAVE STATE
Completed: ALTER PLUGGABLE DATABASE XEPDB1 SAVE STATE
2023-01-01T17:50:39.091226+09:00
ALTER SYSTEM SET control_files='/opt/oracle/oradata/XE/control01.ctl' SCOPE=SPFILE;
2023-01-01T17:50:39.113193+09:00
ALTER SYSTEM SET local_listener='' SCOPE=BOTH;
ALTER PLUGGABLE DATABASE XEPDB1 SAVE STATE
```

下記が表示されたら、CTRL+Cを入力して、ログ表示を止めます。

```SQL:
Completed: ALTER PLUGGABLE DATABASE XEPDB1 SAVE STATE
```

# 5.Oracle Instant Clientコンテナイメージの作成

## 5-1 下記のようなDockerfileを作成します。
導入パッケージは下記のとおりです。
* oracle-instantclient-release-el8
  Oracle Instant Clientを導入するのに必要になります。導入時には必須のパッケージとなります。
* oracle-instantclient-basic
  Oracle Instant Clientの共通設定ファイルになります。導入時には必須のパッケージとなります。
* oracle-instantclient-devel
  開発用パッケージとなります。必須ではないので、不要でしたら、削除しても問題ないです。
* oracle-instantclient-tools
  impdp/expdp、sqlldr等が導入されるパッケージになります。不要でしたら、削除しても問題ないです。
* oracle-instantclient-sqlplus
  SQL*Plusが導入されるパッケージになります。不要でしたら、削除しても問題ないです。

```:Dockerfile
# Dockerfile

# 環境のベースの指定
FROM oraclelinux:8

# 環境変数の設定
ENV             LANG=ja_JP.utf8 TZ=Asia/Tokyo NLS_LANG=Japanese_Japan.UTF8 PATH=$PATH:/usr/lib/oracle/21/client64/bin

# イメージを作成する際、実行したいコマンドなど
RUN             set -x ;                                \
                dnf -y install oracle-instantclient-release-el8 && \
                dnf -y install oracle-instantclient-basic oracle-instantclient-devel oracle-instantclient-tools oracle-instantclient-sqlplus && \
                rm -rf /var/cache/dnf &&                \
                rpm -qa --last &&                       \
                sqlplus -v ;

CMD ["sqlplus", "-v"]

# ex.
#   $ docker network create oracle-network
#   $ docker run -v /my/host/wallet_dir:/usr/lib/oracle/21/client64/lib/network/admin:Z,ro --network=oracle-network . . .

# EOF
```

## 5-2 Oracle Instant Clientコンテナイメージを作成します。
docker buildコマンドでコンテナイメージを作成します。

```Bash:
$ docker build . -t oraclelinux8-instantclient-21 
Sending build context to Docker daemon  7.168kB
Step 1/5 : FROM oraclelinux:8
 ---> b0045ea7bbde
Step 2/5 : LABEL                maintainer="<foo@example.com>"                 version="1.0"
 ---> Running in f40ddf64b1f2
Removing intermediate container f40ddf64b1f2
 ---> 3228dbaab93b
Step 3/5 : ENV          LANG=ja_JP.utf8 TZ=Asia/Tokyo NLS_LANG=Japanese_Japan.UTF8 PATH=$PATH:/usr/lib/oracle/21/client64/bin
 ---> Running in 3e316cb586fc
Removing intermediate container 3e316cb586fc
 ---> da6b3d72f9da
Step 4/5 : RUN          set -x ;                                                dnf -y install oracle-instantclient-release-el8 &&              dnf -y install oracle-instantclient-basic oracle-instantclient-devel oracle-instantclient-tools oracle-instantclient-sqlplus &&                 rm -rf /var/cache/dnf &&                                rpm -qa --last &&                                      sqlplus -v ;
 ---> Running in 458939daf5b8
+ dnf -y install oracle-instantclient-release-el8
Oracle Linux 8 BaseOS Latest (x86_64)           104 MB/s |  53 MB     00:00
Oracle Linux 8 Application Stream (x86_64)      109 MB/s |  42 MB     00:00
Last metadata expiration check: 0:00:10 ago on Sun Jan  1 18:28:30 2023.
Dependencies resolved.
================================================================================
 Package                           Arch    Version     Repository          Size
================================================================================
Installing:
 oracle-instantclient-release-el8  x86_64  1.0-1.el8   ol8_baseos_latest   16 k

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

Total download size: 16 k
Installed size: 18 k
Downloading Packages:
oracle-instantclient-release-el8-1.0-1.el8.x86_ 599 kB/s |  16 kB     00:00
--------------------------------------------------------------------------------
Total                                           547 kB/s |  16 kB     00:00
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1
  Installing       : oracle-instantclient-release-el8-1.0-1.el8.x86_64      1/1
  Running scriptlet: oracle-instantclient-release-el8-1.0-1.el8.x86_64      1/1
  Verifying        : oracle-instantclient-release-el8-1.0-1.el8.x86_64      1/1

Installed:
  oracle-instantclient-release-el8-1.0-1.el8.x86_64

Complete!
Failed to set locale, defaulting to C.UTF-8
+ dnf -y install oracle-instantclient-basic oracle-instantclient-devel oracle-instantclient-tools oracle-instantclient-sqlplus
Oracle Instant Client 21 for Oracle Linux 8 (x8 271 kB/s |  16 kB     00:00
Dependencies resolved.
==========================================================================================
 Package                        Arch    Version          Repository                   Size
==========================================================================================
Installing:
 oracle-instantclient-basic     x86_64  21.8.0.0.0-1.el8 ol8_oracle_instantclient21   53 M
 oracle-instantclient-devel     x86_64  21.8.0.0.0-1.el8 ol8_oracle_instantclient21  659 k
 oracle-instantclient-sqlplus   x86_64  21.8.0.0.0-1.el8 ol8_oracle_instantclient21  711 k
 oracle-instantclient-tools     x86_64  21.8.0.0.0-1.el8 ol8_oracle_instantclient21  864 k
Installing dependencies:
 libaio                         x86_64  0.3.112-1.el8    ol8_baseos_latest            33 k

Transaction Summary
==========================================================================================
Install  5 Packages

Total download size: 55 M
Installed size: 247 M
Downloading Packages:
(1/5): oracle-instantclient-devel-21.8.0.0.0-1.  10 MB/s | 659 kB     00:00
(2/5): oracle-instantclient-sqlplus-21.8.0.0.0- 9.3 MB/s | 711 kB     00:00
(3/5): libaio-0.3.112-1.el8.x86_64.rpm          4.4 MB/s |  33 kB     00:00
(4/5): oracle-instantclient-tools-21.8.0.0.0-1.  30 MB/s | 864 kB     00:00
(5/5): oracle-instantclient-basic-21.8.0.0.0-1.  84 MB/s |  53 MB     00:00
--------------------------------------------------------------------------------
Total                                            87 MB/s |  55 MB     00:00
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1
  Installing       : libaio-0.3.112-1.el8.x86_64                            1/5
  Installing       : oracle-instantclient-basic-21.8.0.0.0-1.el8.x86_64     2/5
  Running scriptlet: oracle-instantclient-basic-21.8.0.0.0-1.el8.x86_64     2/5
  Installing       : oracle-instantclient-devel-21.8.0.0.0-1.el8.x86_64     3/5
  Installing       : oracle-instantclient-sqlplus-21.8.0.0.0-1.el8.x86_64   4/5
  Running scriptlet: oracle-instantclient-sqlplus-21.8.0.0.0-1.el8.x86_64   4/5
  Installing       : oracle-instantclient-tools-21.8.0.0.0-1.el8.x86_64     5/5
  Running scriptlet: oracle-instantclient-tools-21.8.0.0.0-1.el8.x86_64     5/5
  Verifying        : oracle-instantclient-basic-21.8.0.0.0-1.el8.x86_64     1/5
  Verifying        : oracle-instantclient-devel-21.8.0.0.0-1.el8.x86_64     2/5
  Verifying        : oracle-instantclient-sqlplus-21.8.0.0.0-1.el8.x86_64   3/5
  Verifying        : oracle-instantclient-tools-21.8.0.0.0-1.el8.x86_64     4/5
  Verifying        : libaio-0.3.112-1.el8.x86_64                            5/5

Installed:
  libaio-0.3.112-1.el8.x86_64
  oracle-instantclient-basic-21.8.0.0.0-1.el8.x86_64
  oracle-instantclient-devel-21.8.0.0.0-1.el8.x86_64
  oracle-instantclient-sqlplus-21.8.0.0.0-1.el8.x86_64
  oracle-instantclient-tools-21.8.0.0.0-1.el8.x86_64

Complete!
Failed to set locale, defaulting to C.UTF-8
+ rm -rf /var/cache/dnf
+ rpm -qa --last
oracle-instantclient-tools-21.8.0.0.0-1.el8.x86_64 Sun Jan  1 18:28:55 2023
oracle-instantclient-sqlplus-21.8.0.0.0-1.el8.x86_64 Sun Jan  1 18:28:55 2023
oracle-instantclient-devel-21.8.0.0.0-1.el8.x86_64 Sun Jan  1 18:28:55 2023
oracle-instantclient-basic-21.8.0.0.0-1.el8.x86_64 Sun Jan  1 18:28:55 2023
libaio-0.3.112-1.el8.x86_64                   Sun Jan  1 18:28:48 2023
oracle-instantclient-release-el8-1.0-1.el8.x86_64 Sun Jan  1 18:28:44 2023

　・
　・
（中略）
　・
　・

+ sqlplus -v
SQL*Plus: Release 21.0.0.0.0 - Production
Version 21.8.0.0.0

Removing intermediate container 458939daf5b8
 ---> 04926f1851a0
Step 5/5 : CMD ["sqlplus", "-v"]
 ---> Running in 27b1a710be48
Removing intermediate container 27b1a710be48
 ---> c96dcfb33ca0
Successfully built c96dcfb33ca0
Successfully tagged oraclelinux8-instantclient-21:latest
$ docker image ls
REPOSITORY                            TAG         IMAGE ID       CREATED        SIZE
oraclelinux8-instantclient-21         latest      d03071cfce70   3 hours ago    499MB
oracle/database                       21.3.0-xe   9b33bf323806   3 hours ago    6.53GB
oraclelinux                           7-slim      19d1d44a7ad1   3 weeks ago    135MB
oraclelinux                           8           b0045ea7bbde   3 weeks ago    225MB
```

# 6.Oracle Instant Clientコンテナを起動して接続確認
docker runコマンドで、Oracle Instant Clientコンテナを起動します。
引数の意味は、下記の通りです。
* -it
  対話型モードで起動します。
* --rm
  コンテナ終了時にコンテナを破棄します。
* --network=oracle-network
  ネットワークとしてoracle-networkを使用します。
* sqlplus～
  sqlplusを起動します。
  oracle-db-ex-21cはoracle21c XEのホスト名、1521はポート番号です。（共有しているoracle-networkを使用することにより、ホスト名の名前解決ができます）

確認内容は、接続したデータベースの内容と、テーブル検索（dual表を使用してsysdateを表示）です。

```SQL:
$ docker run -it --rm --network=oracle-network oraclelinux8-instantclient-21 sqlplus system/oracle2O23@oracle-db-ex-21c:1521

SQL*Plus: Release 21.0.0.0.0 - Production on Sun Jan 1 17:56:21 2023
Version 21.8.0.0.0

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

Last Successful login time: Sun Jan 01 2023 17:52:09 +09:00

Connected to:
Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0

SQL> set pagesize 10000
SQL> set linesize 1000
SQL> select * from v$database;

      DBID NAME      CREATED   RESETLOGS_CHANGE# RESETLOGS PRIOR_RESETLOGS_CHANGE# PRIOR_RES LOG_MODE	  CHECKPOINT_CHANGE# ARCHIVE_CHANGE# CONTROL CONTROLFI CONTROLFILE_SEQUENCE# CONTROLFILE_CHANGE# CONTROLFI OPEN_RESETL VERSION_T OPEN_MODE	      PROTECTION_MODE	   PROTECTION_LEVEL	REMOTE_A ACTIVATION# SWITCHOVER# DATABASE_ROLE	  ARCHIVELOG_CHANGE# ARCHIVEL SWITCHOVER_STATUS    DATAGUAR GUARD_S SUPPLEME SUP SUP FORCE_LOGGING			     PLATFORM_ID PLATFORM_NAME											       RECOVERY_TARGET_INCARNATION# LAST_OPEN_INCARNATION# CURRENT_SCN FLASHBACK_ON	  SUP SUP DB_UNIQUE_NAME		 STANDBY_BECAME_PRIMARY_SCN FS_FAILOVER_MODE	FS_FAILOVER_STATUS     FS_FAILOVER_CURRENT_TARGET     FS_FAILOVER_THRESHOLD FS_FAIL
---------- --------- --------- ----------------- --------- ----------------------- --------- ------------ ------------------ --------------- ------- --------- --------------------- ------------------- --------- ----------- --------- -------------------- -------------------- -------------------- -------- ----------- ----------- ---------------- ------------------ -------- -------------------- -------- ------- -------- --- --- --------------------------------------- ----------- ----------------------------------------------------------------------------------------------------- ---------------------------- ---------------------- ----------- ------------------ --- --- ------------------------------ -------------------------- ------------------- ---------------------- ------------------------------ --------------------- -------
FS_FAILOVER_OBSERVER_HOST																																																													 CON PRIMARY_DB_UNIQUE_NAME	    SUP MIN_REQUIRED_CAPTURE_CHANGE# CDB     CON_ID
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --- ------------------------------ --- ---------------------------- --- ----------
PENDING_ROLE_CHANGE_TASKS																																																													   CON_DBID FOR SUP GOLDENGA
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------- --- --- --------
3006112575 XE	     01-JAN-23		 2571212 01-JAN-23			 1 17-AUG-21 NOARCHIVELOG	     2621373	     2571212 CURRENT 01-JAN-23			1314		 2622933 01-JAN-23 NOT ALLOWED 01-JAN-23 READ WRITE	      MAXIMUM PERFORMANCE  UNPROTECTED		ENABLED   3006112063  3006112063 PRIMARY			   0 DISABLED NOT ALLOWED	   DISABLED NONE    NO	     NO  NO  NO 					      13 Linux x86 64-bit														  2			 2     2622953 NO		  NO  NO  XE							  0 DISABLED		DISABLED								  0
																																																																 NO				    NO				     YES	  0
NOT APPLICABLE																																																															 3006112575 NO	NO  DISABLED


SQL> select to_char(sysdate, 'yyyy/mm/dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'YY
-------------------
2023/01/01 17:57:31

```

# 7.参考

[oracle/docker-images](https://github.com/oracle/docker-images/tree/main/OracleDatabase/SingleInstance)
[docker network connect](https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/commandline/network_connect/)

# 8.改訂履歴
+ 2023年01月02日
　・タグの使い方を誤っていたのを修正しました。
　・4-3の説明を詳細化しました。
　・5-1のコードの記載をコマンド実行結果から、ファイル名に返納しました。