【環境構築】Oracle Linux 9でOracle 11gをコンテナ起動し、sqlplusで外部接続する手順

Oracle Linux 9で、oracle11gをコンテナで動かし、コンテナの外から、sqlplusで接続するまです。

以下のOSでやりました。

$ cat /etc/os*
NAME="Oracle Linux Server"
VERSION="9.7"
ID="ol"
ID_LIKE="fedora"
VARIANT="Server"
VARIANT_ID="server"
VERSION_ID="9.7"
PRETTY_NAME="Oracle Linux Server 9.7"

実は OL9 には標準で podman というツールが入っており、docker コマンドがそのままでは使えないようになっています。本物の Docker (Docker Engine) を入れる手順をまとめました。

1. Docker のインストールと自動起動設定

コマンドの有無に左右されないよう、設定ファイルを直接作成して進めます。

① ユーティリティの導入

# sudo dnf install -y dnf-utils
Last metadata expiration check: 1:31:58 ago on ●●● ●● ●●● ●●●● 10:34:30 PM UTC.
Package yum-utils-4.3.0-24.0.1.el9_7.noarch is already installed.
Dependencies resolved.
Nothing to do.
Complete!

② 【最重要】コマンドを使わず、直接リポジトリファイルを作成

cat <<EOF | sudo tee /etc/yum.repos.d/docker-ce.repo
[docker-ce-stable]
name=Docker CE Stable - \$basearch
baseurl=https://download.docker.com/linux/centos/9/\$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
EOF

③ Docker 本体と関連ツールのインストール

sudo dnf install -y docker-ce docker-ce-cli containerd.io
Running transaction
  Preparing        :                                                        1/1 
  Upgrading        : docker-ce-cli-1:29.3.0-1.el9.x86_64                    1/4 
  Running scriptlet: docker-ce-cli-1:29.3.0-1.el9.x86_64                    1/4 
  Upgrading        : docker-ce-3:29.3.0-1.el9.x86_64                        2/4 
  Running scriptlet: docker-ce-3:29.3.0-1.el9.x86_64                        2/4 
  Running scriptlet: docker-ce-3:29.2.1-1.el9.x86_64                        3/4 
  Cleanup          : docker-ce-3:29.2.1-1.el9.x86_64                        3/4 
  Running scriptlet: docker-ce-3:29.2.1-1.el9.x86_64                        3/4 
  Cleanup          : docker-ce-cli-1:29.2.1-1.el9.x86_64                    4/4 
  Running scriptlet: docker-ce-cli-1:29.2.1-1.el9.x86_64                    4/4 
  Verifying        : docker-ce-3:29.3.0-1.el9.x86_64                        1/4 
  Verifying        : docker-ce-3:29.2.1-1.el9.x86_64                        2/4 
  Verifying        : docker-ce-cli-1:29.3.0-1.el9.x86_64                    3/4 
  Verifying        : docker-ce-cli-1:29.2.1-1.el9.x86_64                    4/4 
Upgraded:
  docker-ce-3:29.3.0-1.el9.x86_64      docker-ce-cli-1:29.3.0-1.el9.x86_64     
Complete!

④ Docker の起動設定と権限付与

sudo systemctl enable --now docker

sudo usermod -aG docker $USER
# 反映のため、このターミナルで以下のコマンドを実行
newgrp docker

2. Docker が正しく動いているかの確認

次に進む前に、以下のコマンドで Docker エンジンが正常か確認します。

# サービスのステータス確認(Active: active (running) と出ればOK)
systemctl status docker --no-pager

docker.service - Docker Application Container Engine
     Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; preset: disabled)
     Active: active (running) since ●●● ●●●●-●●-●● 00:08:03 UTC; 1min 59s ago
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
   Main PID: 5480 (dockerd)
      Tasks: 41
     Memory: 41.9M (peak: 42.8M)
        CPU: 575ms
     CGroup: /system.slice/docker.service
             ├─5480 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
             ├─5720 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 1521 -container-ip 172.17.0.2 -container-port 1521 -use-listen-fd
             ├─5726 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 1521 -container-ip 172.17.0.2 -container-port 1521 -use-listen-fd
             ├─5741 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8080 -container-ip 172.17.0.2 -container-port 8080 -use-listen-fd
             └─5747 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 8080 -container-ip 172.17.0.2 -container-port 8080 -use-listen-fd
●●● ●● 00:08:01 ora dockerd[5480]: time="●●●●-●●-●●T00:08:01.112429168Z" level=i

# 動作テスト(Hello from Docker! と表示されれば完璧です)
docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.

3. Oracle 11g コンテナの起動

OL9 の環境(cgroup v2 や SELinux)で古い 11g を動かすための必須オプションを付けて実行します。

# コンテナの作成と起動
docker run -d \
  --name oracle11g \
  --privileged \
  --shm-size=1g \
  --restart always \
  -p 1521:1521 \
  -p 8080:8080 \
  wnameless/oracle-xe-11g-r2

--restart always: OSやDockerが再起動した際、このコンテナも自動で立ち上がる設定です。

4. データベース起動の確認とログイン

コンテナ起動後、内部の Oracle サービスが準備完了になるまで約 1〜2 分待ちます。

# 起動ログを監視(Ctrl + C で抜ける)
docker logs -f oracle11g

# SQL*Plus でログイン(ID: system / Pass: oracle)
docker exec -it oracle11g /bin/bash -c "source /u01/app/oracle/product/11.2.0/xe/bin/oracle_env.sh && /u01/app/oracle/product/11.2.0/xe/bin/sqlplus system/oracle"

SQL*Plus: Release 11.2.0.2.0 Production on ●●● ●●● ● ●●:●●:●● ●●●●
Copyright (c) 1982, 2011, Oracle.  All rights reserved.
Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
SQL>

SELECT banner FROM v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
PL/SQL Release 11.2.0.2.0 - Production
CORE	11.2.0.2.0	Production
TNS for Linux: Version 11.2.0.2.0 - Production
NLSRTL Version 11.2.0.2.0 - Production

5. Oracle Instant Client のインストール

ホスト側で sqlplus コマンドを使えるようにします。

# ① Oracle リポジトリの有効化
sudo dnf install -y oracle-instantclient-release-el9

# ② パッケージ情報の更新 
sudo dnf makecache 

# 19.30 の basic と sqlplus をインストール
sudo dnf install -y oracle-instantclient19.30-basic oracle-instantclient19.30-sqlplus
Running transaction
  Installing       : libnsl-2.34-231.0.1.el9_7.2.x86_64                     1/3 
  Installing       : oracle-instantclient19.30-basic-19.30.0.0.0-1.el9.x8   2/3 
  Installing       : oracle-instantclient19.30-sqlplus-19.30.0.0.0-1.el9.   3/3 
Installed:
  libnsl-2.34-231.0.1.el9_7.2.x86_64                                            
  oracle-instantclient19.30-basic-19.30.0.0.0-1.el9.x86_64                      
  oracle-instantclient19.30-sqlplus-19.30.0.0.0-1.el9.x86_64                    
Complete!

6. ネットワーク接続設定 (TNS_ADMIN)

接続先(コンテナ)の情報を定義します。

# ① 設定ディレクトリの作成
sudo mkdir -p /usr/lib/oracle/network/admin

# ② tnsnames.ora の作成
cat <<EOF | sudo tee /usr/lib/oracle/network/admin/tnsnames.ora
XE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XE)
    )
  )
EOF

# ③ 環境変数の設定
export TNS_ADMIN=/usr/lib/oracle/network/admin
echo 'export TNS_ADMIN=/usr/lib/oracle/network/admin' >> ~/.bashrc

7. リスナー疎通と接続テスト

# ポートの確認とファイアウォール許可
ss -antl | grep 1521
LISTEN 0      4096         0.0.0.0:1521      0.0.0.0:* sudo firewall-cmd --add-port=1521/tcp --permanent
sudo firewall-cmd --reload

# コンテナ内リスナーの状態確認
docker exec -it oracle11g /bin/bash -c "source /u01/app/oracle/product/11.2.0/xe/bin/oracle_env.sh && lsnrctl status"
Service "XE" has 1 instance(s).
  Instance "XE", status READY, has 1 handler(s) for this service...
The command completed successfully

# ホストからの接続テスト
sqlplus system/oracle@XE
SQL*Plus: Release 19.0.0.0.0 - Production on ●●● ●●● ● ●●:●●:●● ●●●●
Version 19.30.0.0.0
Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production

大きなトラブルもなくできました。




コメント

このブログの人気の投稿

【バックエンド構築】CentOS 9からOracle 11gへ接続!Instant Clientの導入と実験

【DB設計】見習いエンジニアが現場で学んだ「後悔しない」ための設計原則まとめ

CentOS 9 に MySQL 8.4 LTS をインストールする