Oracle Linux KVMでのマルチVM LAMPスタックの作成

はじめに

Oracle仮想化ソリューションの中核は、Oracle Linux KVMホストです。このハイパーバイザに加えて、Oracle Linux、RHEL、Windows、Ubuntu、Solarisなど、サポートされているオペレーティング・システムの1つを実行する多数の仮想マシンを実行できます。この仮想化ソリューションは、Oracle Linux Virtualization Managerを介して管理されます。このソリューションは、単一のインタフェースを提供し、状況を整理します。Oracle Linux Virtualization Managerでは、マルチホスト/マルチVM管理に加えて、Oracle仮想化ソリューションの主な機能も使用できます。たとえば、Oracle Linux Virtualization Managerは、VMフェイルオーバー、ダウンタイムなしのホスト間でのVMのライブ移行、ロールベースのアクセス制御と監査ロギング、およびバックアップとディザスタ・リカバリのワークフローの簡素化により、自動的な高可用性を提供します。これらのエンタープライズ機能は、Oracle Linux KVMを個々のホストから真のエンタープライズ仮想化プラットフォームに変換します。

このチュートリアルでは、Oracle Virtualizationを強化するコア・ハイパーバイザ・テクノロジについて説明します。カーネルベースの仮想マシン(KVM)は、オープンソースのtype-1 (ベアメタル)ハイパーバイザです。この機能により、Oracle Linuxなどのホスト・システムは、サポートされているハードウェアで実行するときに複数の仮想マシン(VM)またはゲストをホストできます。

このチュートリアルでは、Oracle Linux KVMをデプロイして、LAMPスタック・アプリケーションで構成された仮想マシンを作成します。これにより、Linux、Apache、MySQLおよびPHPコンポーネントを含む完全なWeb開発環境を複数の仮想マシンにわたってホストできます。

重要:この演習の2つのアプリケーション・コードは、教育のみを目的としています。これらは、開発者がLAMPスタックを使用してアプリケーション開発スキルを学習し、実践できるように設計されています。これらのコードは本番環境向けではなく、ライブ設定ではそのまま使用しないでください。

目的

前提条件

sudo権限を持つ非rootユーザーを持つすべてのOracle Linuxシステム。

ステップ1: Oracle Linuxのデプロイ

ノート:独自のテナンシで実行している場合は、演習環境をデプロイする前に、linux-virt-labs GitHubプロジェクトREADME.mdを読み、前提条件を完了してください。

  1. Lunaデスクトップでターミナルを開きます。

  2. linux-virt-labs GitHubプロジェクトをクローニングします。

    git clone https://github.com/oracle-devrel/linux-virt-labs.git
    
  3. 作業ディレクトリに変更する。

    cd linux-virt-labs/ol
    
  4. 必要なコレクションをインストールします。

    ansible-galaxy collection install -r requirements.yml
    
  5. 演習環境をデプロイします。

    ansible-playbook create_instance.yml -e localhost_python_interpreter="/usr/bin/python3.6" -e instance_ocpus="4" -e instance_memory="64"
    

    無料の演習環境には、ローカル・ホストで実行される再生のansible_python_interpreterを設定する追加の変数local_python_interpreterが必要です。この変数は、python3.6モジュールの下にあるOracle Cloud Infrastructure SDK for PythonのRPMパッケージが環境によってインストールされるため必要です。

    デフォルトのデプロイメント・シェイプでは、AMD CPUおよびOracle Linux 8が使用されます。Intel CPUを使用するには、-e instance_shape="VM.Standard3.Flex"を追加します

    重要:プレイブックが正常に実行されるまで待機し、一時停止タスクに到達します。プレイブックのこの段階では、Oracle Linuxのインストールが完了し、インスタンスの準備ができました。前回の再生をノートにとります。この再生では、デプロイするノードのパブリックIPアドレスとプライベートIPアドレス、および演習の実行中に必要なその他のデプロイメント情報が出力されます。

ステップ2: 環境での仮想化のサポートの検証

  1. 端末を開き、SSHを使用してol-node-01インスタンスに接続します。

    ssh opc@<ip_address_of_instance>
    
  2. 次のコマンドを実行して、CPUタイプを確認します。

    grep -e 'vendor_id' /proc/cpuinfo | uniq
    

    vendor_idは、AMD CPUの場合はAuthenticAMD、Intel CPUの場合はGenuinIntelのいずれかを報告します。

  3. ハードウェアが仮想化をサポートしていることを確認します。

    CPUタイプに一致するコマンドを実行します。

    1. AMD V CPU拡張が存在することを確認します。
    grep -w -o 'svm' /proc/cpuinfo | uniq
    
    1. Intel VT CPU拡張が存在することを確認します。
    grep -w -o 'vmx' /proc/cpuinfo | uniq
    

    コマンド出力にこれらのフラグのいずれかが存在することは、このシステムが仮想化をサポートしていることを示しています。lscpuコマンドを使用し、出力でVirtualizationエントリを検索することもできます。

  4. ロードされたKVMモジュールを確認します。

    lsmod | grep kvm
    

    この出力には、仮想化パッケージをインストールしてlibvirtdサービスを起動した後のKVMカーネル・モジュールが表示されます。OCIなどのクラウド・システムでは、これらのモジュールは、パッケージのインストール中ではなく、libvirtdの起動時に自動的にロードされます。ロード順序は、install packages→start libvirtd service→modules appear in lsmod outputです。

ステップ3: KVMのインストールと起動

  1. 実行中のOracle Linuxのバージョンを確認します。

    hostnamectl | grep 'Operating System'
    
  2. Oracle Linux仮想化用の関連ソフトウェア・パッケージをインストールします。

    このコマンドは、Oracle Linuxに対するlibvirtおよびその他の依存関係を含む仮想化パッケージをインストールします。libvirtパッケージは、KVM仮想マシンを管理するためのソフトウェア・ライブラリおよびAPIを提供し、実際のVM管理を処理するためにバックグラウンドで実行されるlibvirtdデーモンを含みます。

    sudo dnf module install -y virt
    
  3. KVM (カーネルベースの仮想マシン)ハイパーバイザを使用して仮想マシン(VM)を作成および構成するためのツールであるvirt-installをインストールします。

    sudo dnf install -y virt-install
    
  4. ホスト・マシンの準備が完了し、libvirt VMsを実行するように設定されていることを確認します。

    virt-host-validate
    

    すべてのチェックに合格すると、システムは仮想マシンを作成する準備が整います。チェックが失敗した場合は、指示に従って問題を修正します。チェックでWARNの値が戻される場合は、仮想化機能を改善する手順に従うことを検討してください。

  5. Systemdサービスを起動して、ブートごとに自動的に開始できるようにします。

    sudo systemctl enable --now libvirtd.service
    
  6. サービス・ステータスをチェックして、稼働中であることを確認します。

    sudo systemctl status libvirtd.service
    

    Theutputは、サービスが有効になっていて実行中であることを示します。必要に応じて、文字「q」を入力して出力モードを終了します。

ステップ4: Oracle Cloudイメージを使用した2つの仮想マシンの作成

  1. KVMイメージ記憶域の場所に変更します。

    cd /var/lib/libvirt/images
    
  2. Oracle Linux VMテンプレートをダウンロードします。

    sudo curl -O https://yum.oracle.com/templates/OracleLinux/OL8/u10/x86_64/OL8U10_x86_64-kvm-b237.qcow2
    

    VM-01の作成(データベース)

  3. メタデータ・ファイルを作成します。

    cat << 'EOF' | sudo tee ~/meta-data > /dev/null
    instance-id: iid-local01
    local-hostname: vm-01
    EOF
    
  4. ユーザーデータファイルを作成します。

    cat << 'EOF' | sudo tee ~/user-data > /dev/null
    #cloud-config
    
    system_info:
      default_user:
        name: opc
    
    ssh_authorized_keys:
      - <paste_public_key_here>
    EOF
    
  5. VMへのセキュア接続用のSSHキー・ペアを生成します。

    ssh-keygen -t rsa -b 4096
    

    Enterを押して、各デフォルトを受け入れます。このコマンドは、ユーザーのホームの.sshディレクトリにキー・ペアを書き込みます。

  6. 生成された公開SSHキーを抽出します。
    SSHKEY=$(cat ~/.ssh/id_rsa.pub)
    
  7. 生成された公開SSHキーでユーザー・データ・ファイルを更新します。
    sed -i "s|<paste_public_key_here>|${SSHKEY}|g" ~/user-data
    
  8. ユーザー・データとメタデータ・ファイルを含むISOイメージを生成します。
    sudo genisoimage -output /var/lib/libvirt/images/vm-01.iso -volid cidata -joliet -rock ~/user-data ~/meta-data
    
  9. ダウンロードしたイメージと一致するOSバリアントを検索します。
    osinfo-query os | grep ol8
    
  10. Oracle Linuxイメージをvm-01の新しいディスク・イメージにコピーします。
    sudo cp /var/lib/libvirt/images/OL8U10_x86_64-kvm-b237.qcow2 /var/lib/libvirt/images/vm-01.qcow
    
  11. 指定されたリソースおよび構成を使用して、vm-01という名前の新しい仮想マシンを作成します。
    sudo virt-install --name vm-01 \
    --memory 2048 \
    --vcpus 2 \
    --disk /var/lib/libvirt/images/vm-01.qcow,device=disk,bus=virtio \
    --disk /var/lib/libvirt/images/vm-01.iso,device=cdrom \
    --os-type linux --os-variant ol8.10 \
    --virt-type kvm --graphics none \
    --network network=default,model=virtio \
    --noautoconsole \
    --import
    
  12. 実行中のすべての仮想マシンを一覧表示します。
    sudo virsh list
    
  13. vm-01仮想マシンのIPアドレスを取得します。

    sudo virsh net-dhcp-leases --network default
    
  14. sshに接続して、仮想マシンが動作することを確認します。

    ssh opc@<ip_address_of_vm-01>
    
  15. 次のステップに進むには、vm-01サーバーを終了します。

    exit
    

    hostnamectlを実行して、バージョンを確認し、仮想マシン内のOSに関する追加の詳細を取得できます。

    VM-02の作成(Webサーバー)

  16. vm-02のメタデータ・ファイルを作成します。

    cat << 'EOF' | sudo tee ~/meta-data > /dev/null
    instance-id: iid-local02
    local-hostname: vm-02
    EOF
    
  17. vm-02のISOイメージを生成します。
    sudo genisoimage -output /var/lib/libvirt/images/vm-02.iso -volid cidata -joliet -rock ~/user-data ~/meta-data
    
  18. Oracle Linuxイメージをvm-02の新しいディスク・イメージにコピーします。
    sudo cp /var/lib/libvirt/images/OL8U10_x86_64-kvm-b237.qcow2 /var/lib/libvirt/images/vm-02.qcow
    
  19. 指定されたリソースおよび構成を使用して、vm-02という名前の新しい仮想マシンを作成します。
    sudo virt-install --name vm-02 \
    --memory 2048 \
    --vcpus 2 \
    --disk /var/lib/libvirt/images/vm-02.qcow,device=disk,bus=virtio \
    --disk /var/lib/libvirt/images/vm-02.iso,device=cdrom \
    --os-type linux --os-variant ol8.10 \
    --virt-type kvm --graphics none \
    --network network=default,model=virtio \
    --noautoconsole \
    --import
    
  20. 実行中のすべての仮想マシンを一覧表示します。
    sudo virsh list
    
  21. vm-02仮想マシンのIPアドレスを取得します。

    sudo virsh net-dhcp-leases --network default
    
  22. sshに接続して、仮想マシンが動作することを確認します。

    ssh opc@<ip_address_of_vm-02>
    
  23. 次のステップに進むには、vm-01サーバーを終了します。

    exit
    
  24. hostnamectlを実行して、バージョンを確認し、仮想マシン内のOSに関する追加の詳細を取得できます。

    hostnamectl
    

    出力例:

    [oracle@ol-node01 images]$ ssh opc@192.168.122.46
    The authenticity of host '[host]' can't be established.
    ECDSA key fingerprint is [fingerprint].
    Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
    Warning: Permanently added '[IP]' (ECDSA) to the list of known hosts.
    
    [opc@vm-01 ~]$ hostnamectl
       Static hostname: vm-01
             Icon name: computer-vm
               Chassis: vm
            Machine ID: [MachineID]
               Boot ID: [BootID]
        Virtualization: kvm
      Operating System: Oracle Linux Server 8.10
           CPE OS Name: cpe:/o:oracle:linux:8:10:server
                Kernel: Linux 5.15.0-206.153.7.1.el8uek.x86_64
          Architecture: x86-64
    
  25. vm-01のIPアドレスを抽出します。
     VM01_IP=$(sudo virsh net-dhcp-leases --network default | grep vm-01 | tail -1 | awk '{print $5}' | cut -d'/' -f1)
    
  26. vm-02のIPアドレスを抽出します。
     VM02_IP=$(sudo virsh net-dhcp-leases --network default | grep vm-02 | tail -1 | awk '{print $5}' | cut -d'/' -f1)
    
  27. 後で使用するためにVMs IPアドレスを保存します。
     echo "VM-01 (Web): $VM01_IP"
    
     echo "VM-02 (Web): $VM02_IP"
    
  28. VMsのSSHコマンドをテストします。
     ssh -o ConnectTimeout=10 opc@$VM01_IP "echo 'VM-01 OK'"
    
     ssh -o ConnectTimeout=10 opc@$VM02_IP "echo 'VM-02 OK'"
    

ステップ5: VM-01でのMySQLの設定

MySQLをインストールします。

  1. ol-node-01インスタンスから、SSHはVM-01へのSSH接続を確立します。
     ssh opc@$VM01_IP
    
  2. MySQLリポジトリ構成をダウンロードします。
     sudo yum -y install https://dev.mysql.com/get/mysql84-community-release-el8-1.noarch.rpm
    
  3. 競合を回避するために、デフォルトのMySQLモジュールを無効にします。
     sudo yum -y module disable mysql
    
  4. MySQLサーバーおよびクライアントをインストールします。
     sudo yum install -y mysql mysql-server
    
  5. MySQLサービスを起動します。
     sudo systemctl start mysqld
    
  6. ブート時にMySQLサービスを開始できるようにします。
     sudo systemctl enable mysqld
    
  7. ファイアウォールを介した着信MySQLトラフィックを許可します。
     sudo firewall-cmd --permanent --add-service=mysql
    
  8. ファイアウォール構成を再読み込みして変更を適用します。
     sudo firewall-cmd --reload
    

    MySQLの構成

  9. MySQLログから一時rootパスワードを抽出します。
     TEMP_PASS=$(sudo grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}')
    
  10. 一時的なrootパスワードでMySQLにログインします。
     mysql -uroot -p$TEMP_PASS --connect-expired-password
    
  11. rootパスワードをセキュアな値に変更します。
     ALTER USER 'root'@'localhost' IDENTIFIED BY '[password]';
    
  12. セキュアなパスワードで「admin」ユーザーを作成します。
     CREATE USER 'admin'@'%' IDENTIFIED BY '[password]';
    
  13. 'admin'ユーザーにすべての権限を付与します。
     GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION;
    
  14. セキュアなパスワードで'empuser'ユーザーを作成します。
     CREATE USER 'empuser'@'%' IDENTIFIED BY '[password]';
    
  15. すべての権限を'empuser'に付与します。
     GRANT ALL PRIVILEGES ON *.* TO 'empuser'@'%' WITH GRANT OPTION;
    
  16. 権限表を再ロードして変更を適用します。
     FLUSH PRIVILEGES;
    
  17. MySQLシェルを終了します。
     \q
    
  18. VM-01からSSHセッションを終了します。
     exit
    

ステップ6: VM-02でのApache/PHPの設定

  1. ol-node-01インスタンスから、SSHはVM-02へのSSH接続を確立します。
     ssh opc@$VM02_IP
    
  2. Apache HTTPサーバーをインストールします。
     sudo yum install -y httpd
    
  3. PHP 8.2とその依存関係をインストールします。
     sudo dnf install -y @php:8.2
    
  4. PHP MySQLおよびJSON拡張機能をインストールします。
     sudo yum install -y php-mysqlnd php-json
    
  5. Apache HTTPサーバーを有効にして起動します。
     sudo systemctl enable --now httpd
    
  6. ポート80で受信HTTPトラフィックを許可します。
     sudo firewall-cmd --permanent --add-port=80/tcp
    
  7. ファイアウォール構成を再読み込みして変更を適用します。
     sudo firewall-cmd --reload
    
  8. Apacheがネットワークリソースに接続できるようにします。
     sudo setsebool -P httpd_can_network_connect 1
    
  9. VM-02からSSHセッションを終了します。
     exit
    

ステップ7: Apacheのテスト

  1. VM-02 YOUR_VM_02_PUBLIC_IPのパブリックIPアドレスを表示します。
     echo "VM-02 (Web): $VM02_IP"
    
  2. 新しいターミナルLunaまたはオンプレミス環境を開き、ローカル・マシンからVM-02 WebサーバーにアクセスするためのSSHトンネルを作成します。

    最初に****と****を置き換えてください。

     ssh -L 8081:<YOUR_VM_02_PUBLIC_IP>:80 opc@<YOUR_OCI_PUBLIC_IP>
    
  3. Lunaまたはオンプレミス環境のブラウザを使用して、SSHトンネルを介してWebサーバーにアクセスしてApacheをテストします。
     http://localhost:8081
    

    重要:後で使用するためにSSHトンネルとブラウザを開いたままにします。

ステップ8: テスト・アプリケーションの作成


  1. opc@ol-node-01 sshインスタンスに戻ります。

  2. DHCPリースからVM-01のIPアドレスを取得します。
     VM01_IP=$(sudo virsh net-dhcp-leases --network default | grep vm-01 | tail -1 | awk '{print $5}' | cut -d'/' -f1)
    
  3. DHCPリースからVM-02のIPアドレスを取得します。
     VM02_IP=$(sudo virsh net-dhcp-leases --network default | grep vm-02 | tail -1 | awk '{print $5}' | cut -d'/' -f1)
    
  4. ol-node-01インスタンスから、SSHはVM-02へのSSH接続を確立します。
     ssh opc@$VM02_IP
    
  5. PHP構成を表示するPHP情報ページを作成します。
     sudo tee /var/www/html/info.php > /dev/null << 'EOF'
     <?php phpinfo(); ?>
     EOF
    
  6. データベース接続テスト・アプリケーションを作成します。

     sudo tee /var/www/html/dbtest.php > /dev/null << 'EOF'
     <?php
     echo "<h1>Multi-VM LAMP Stack Test</h1>";
    
     // Database connection details
     define('DB_SERVER', '$VM01_IP');
     define('DB_USERNAME', 'admin');
     define('DB_PASSWORD', '[password]');
     define('DB_NAME', 'mysql');
    
     echo "<p>Testing connection to MySQL at: " . DB_SERVER . "</p>";
    
     // Test network connectivity
     $fp = @fsockopen(DB_SERVER, 3306, $errno, $errstr, 5);
     if (!$fp) {
         echo "<p style='color: red;'>ERROR: Cannot reach MySQL server</p>";
         echo "<p>Error: $errstr ($errno)</p>";
     } else {
         echo "<p style='color: green;'>✓ Network connection successful</p>";
         fclose($fp);
            
         // Test MySQL connection
         $link = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
         if($link === false){
             echo "<p style='color: red;'>ERROR: Could not connect to MySQL</p>";
             echo "<p>Error: " . mysqli_connect_error() . "</p>";
         } else {
             echo "<p style='color: green;'>✓ Successfully Connected to MySQL!</p>";
             echo "<p>MySQL Version: " . mysqli_get_server_info($link) . "</p>";
             echo "<p>Host Info: " . mysqli_get_host_info($link) . "</p>";
             mysqli_close($link);
         }
     }
     ?>
     EOF
    
  7. アプリケーションファイルのアクセス権を設定します。
     sudo chown apache:apache /var/www/html/*.php
    
  8. $VM01_IP値を保存されたIPアドレス値で変更して、define('DB_SERVER'、 '$VM01_IP');行を更新します。
     sudo vi /var/www/html/dbtest.php
    

    出力例:

    ``text…Code before define('DB_SERVER'、 '192.168.122.???); …Code after

  9. VM-02を終了します。

     exit
    

ステップ9: Webサーバーおよびデータベース・テスト・アプリケーションへのアクセス


  1. SSHトンネルが閉じている場合は、基本テスト用に作成します。
     ssh -L 8081:$VM02_IP:80 opc@<YOUR_OCI_PUBLIC_IP>
    
  2. 基本LAMPテスト 参照先:
     http://localhost:8081/info.php
    
  3. 基本的なデータベース・テストのデモ参照先:
    http://localhost:8081/dbtest.php
    

予期した結果:

基本テスト:緑色の「Successfully Connected to MySQL!」メッセージ


ステップ10: 従業員データベースの作成およびロード

  1. opc@ol-node-01 sshインスタンスにいる必要があります。

  2. DHCPリースからVM-01のIPアドレスを取得します。
     VM01_IP=$(sudo virsh net-dhcp-leases --network default | grep vm-01 | tail -1 | awk '{print $5}' | cut -d'/' -f1)
    
  3. DHCPリースからVM-02のIPアドレスを取得します。
     VM02_IP=$(sudo virsh net-dhcp-leases --network default | grep vm-02 | tail -1 | awk '{print $5}' | cut -d'/' -f1)
    
  4. opc@ol-node-01 SSHインスタンスから、VM-01へのSSH接続を確立します。
     ssh opc@$VM01_IP
    
  5. /tmpフォルダに移動します。
     cd /tmp
    
  6. MySQL従業員サンプル・データベースをダウンロードします。
     curl -L -o master.zip https://github.com/datacharmer/test_db/zipball/master/
    
  7. 圧縮ツールをインストールします。
     sudo dnf install -y unzip
    
  8. データベースを抽出します。
     sudo unzip master.zip
    
     sudo mv datacharmer-test_db-* employees_db
    
     cd employees_db
    
  9. データベースをロードします。
     mysql -u admin -p[password] < employees.sql
    
  10. データベースがロードされたことを確認します。
     mysql -u admin -p[password] -e "USE employees; SHOW TABLES; SELECT COUNT(*) FROM employees;"
    
  11. データベースVMを終了します。
     exit
    

ステップ11: 従業員データベースWebアプリケーションの作成

  1. ol-node-01 SSHインスタンスから、VM-02へのSSH接続を確立します。
     ssh opc@$VM02_IP
    
  2. 専門職従業員データベース・アプリケーションを作成します。
     sudo tee /var/www/html/employees.php > /dev/null << 'EOF'
     <!DOCTYPE html>
     <html lang="en">
     <head>
         <meta charset="UTF-8">
         <meta name="viewport" content="width=device-width, initial-scale=1.0">
         <title>Employee Database - Multi-VM LAMP Demo</title>
         <style>
             body { 
                 font-family: Arial, sans-serif; 
                 max-width: 1200px; 
                 margin: 0 auto; 
                 padding: 20px;
                 background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
             }
             .header { 
                 background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
                 color: white; 
                 text-align: center; 
                 padding: 30px;
                 border-radius: 15px;
                 margin-bottom: 20px;
                 box-shadow: 0 8px 16px rgba(0,0,0,0.1);
             }
             .info-box { 
                 background: rgba(255,255,255,0.9);
                 padding: 25px; 
                 border-radius: 12px;
                 box-shadow: 0 4px 8px rgba(0,0,0,0.1);
                 margin-bottom: 20px;
                 backdrop-filter: blur(10px);
             }
             .success { color: #28a745; font-weight: bold; }
             .error { color: #dc3545; font-weight: bold; }
             table { 
                 width: 100%; 
                 border-collapse: collapse; 
                 margin: 20px 0;
                 background: rgba(255,255,255,0.9);
                 border-radius: 12px;
                 overflow: hidden;
                 box-shadow: 0 4px 8px rgba(0,0,0,0.1);
             }
             th, td { 
                 padding: 15px; 
                 text-align: left; 
                 border-bottom: 1px solid #ddd;
             }
             th { 
                 background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
                 color: white;
                 font-weight: bold;
             }
             tr:hover { background-color: rgba(102, 126, 234, 0.1); }
             .stats { 
                 display: grid; 
                 grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); 
                 gap: 20px; 
                 margin: 20px 0; 
             }
             .stat-card { 
                 background: white; 
                 padding: 20px; 
                 border-radius: 10px; 
                 text-align: center; 
                 box-shadow: 0 4px 8px rgba(0,0,0,0.1);
             }
             .stat-number { font-size: 2em; font-weight: bold; color: #667eea; }
         </style>
     </head>
     <body>
         <div class="header">
             <h1>🏢 Employee Database Demo</h1>
             <p>MySQL Employee Sample Database on Multi-VM Architecture</p>
         </div>
    
         <?php
         // Database connection details
         define('DB_SERVER', '$VM01_IP');
         define('DB_USERNAME', 'empuser');
         define('DB_PASSWORD', '[password]');
         define('DB_NAME', 'employees');
    
         try {
             // Connect to MySQL database on separate VM
             $pdo = new PDO("mysql:host=" . DB_SERVER . ";dbname=" . DB_NAME, DB_USERNAME, DB_PASSWORD);
             $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                
             echo '<div class="info-box success">';
             echo '<h2>✅ Connected to Employee Database</h2>';
             echo '<p><strong>Database Server:</strong> ' . DB_SERVER . ' (vm-01)</p>';
             echo '<p><strong>Web Server:</strong> ' . gethostname() . ' (vm-02)</p>';
             echo '</div>';
                
             // Get database statistics
             $stats = [];
                
             $stmt = $pdo->query("SELECT COUNT(*) as count FROM employees");
             $stats['employees'] = $stmt->fetch()['count'];
                
             $stmt = $pdo->query("SELECT COUNT(*) as count FROM departments");
             $stats['departments'] = $stmt->fetch()['count'];
                
             $stmt = $pdo->query("SELECT COUNT(*) as count FROM salaries");
             $stats['salaries'] = $stmt->fetch()['count'];
                
             $stmt = $pdo->query("SELECT COUNT(*) as count FROM titles");
             $stats['titles'] = $stmt->fetch()['count'];
                
             echo '<div class="info-box">';
             echo '<h2>📊 Database Statistics</h2>';
             echo '<div class="stats">';
             echo '<div class="stat-card"><div class="stat-number">' . number_format($stats['employees']) . '</div><div>Employees</div></div>';
             echo '<div class="stat-card"><div class="stat-number">' . number_format($stats['departments']) . '</div><div>Departments</div></div>';
             echo '<div class="stat-card"><div class="stat-number">' . number_format($stats['salaries']) . '</div><div>Salary Records</div></div>';
             echo '<div class="stat-card"><div class="stat-number">' . number_format($stats['titles']) . '</div><div>Job Titles</div></div>';
             echo '</div>';
             echo '</div>';
                
             // Show recent employees
             echo '<div class="info-box">';
             echo '<h2>👥 Sample Employee Data</h2>';
             $stmt = $pdo->query("SELECT emp_no, first_name, last_name, gender, hire_date FROM employees ORDER BY hire_date DESC LIMIT 20");
             $employees = $stmt->fetchAll();
                
             echo '<table>';
             echo '<thead><tr><th>Employee #</th><th>First Name</th><th>Last Name</th><th>Gender</th><th>Hire Date</th></tr></thead>';
             echo '<tbody>';
                
             foreach ($employees as $emp) {
                 echo '<tr>';
                 echo '<td>' . htmlspecialchars($emp['emp_no']) . '</td>';
                 echo '<td>' . htmlspecialchars($emp['first_name']) . '</td>';
                 echo '<td>' . htmlspecialchars($emp['last_name']) . '</td>';
                 echo '<td>' . htmlspecialchars($emp['gender']) . '</td>';
                 echo '<td>' . htmlspecialchars($emp['hire_date']) . '</td>';
                 echo '</tr>';
             }
             echo '</tbody></table>';
             echo '</div>';
                
             // Show departments
             echo '<div class="info-box">';
             echo '<h2>🏬 Departments</h2>';
             $stmt = $pdo->query("SELECT dept_no, dept_name FROM departments ORDER BY dept_name");
             $departments = $stmt->fetchAll();
                
             echo '<table>';
             echo '<thead><tr><th>Department Code</th><th>Department Name</th></tr></thead>';
             echo '<tbody>';
                
             foreach ($departments as $dept) {
                 echo '<tr>';
                 echo '<td>' . htmlspecialchars($dept['dept_no']) . '</td>';
                 echo '<td>' . htmlspecialchars($dept['dept_name']) . '</td>';
                 echo '</tr>';
             }
             echo '</tbody></table>';
             echo '</div>';
                
         } catch (PDOException $e) {
             echo '<div class="info-box error">';
             echo '<h2>❌ Database Connection Error</h2>';
             echo '<p>Error: ' . htmlspecialchars($e->getMessage()) . '</p>';
             echo '</div>';
         }
         ?>
    
         <div class="info-box">
             <h2>🏗️ Multi-VM Architecture</h2>
             <p><strong>Database VM (vm-01):</strong> MySQL Server with Employee Database</p>
             <p><strong>Web VM (vm-02):</strong> Apache + PHP Web Application</p>
             <p><strong>Data Source:</strong> MySQL Sample Employee Database</p>
             <p><strong>Records:</strong> 300,000+ employees, 400,000+ salary records</p>
         </div>
     </body>
     </html>
     EOF
    
  3. 適切な権限を設定します。
     sudo chown apache:apache /var/www/html/employees.php
    
  4. $VM01_IP値を保存されたIPアドレス値で変更して、define('DB_SERVER'、 '$VM01_IP');行を更新します。
     sudo vi /var/www/html/employees.php
    

    出力例:

    ``text…Code before define('DB_SERVER'、 '192.168.122.???); …Code after

  5. WebサーバーVMを終了します。
     exit
    

ステップ12: 従業員アプリケーションへのアクセス

  1. SSHトンネルが閉じている場合は、基本テスト用に作成します。
     ssh -L 8081:$VM02_IP:80 opc@<YOUR_OCI_PUBLIC_IP>
    
  2. 従業員データベースのデモ参照先:
     http://localhost:8081/employees.php
    

予期した結果:


使用可能なアプリケーション:

🔧 基本的なLAMPテスト (http://localhost:8081/dbtest.php)

🏢 従業員データベースのデモ(http://localhost:8081/employees.php)


必須の管理コマンド

VM管理

  1. 実行中の仮想マシンとそのステータスを一覧表示します。
     sudo virsh list
    
  2. VM-01を起動します。
     sudo virsh start vm-01
    
  3. VM-01を停止します。
     sudo virsh shutdown vm-01
    
  4. デフォルトのネットワーク上のVMsのDHCPリースを表示します。
     sudo virsh net-dhcp-leases --network default
    

Oracle Cloud Infrastructureでこのラボを実行するための設定

  1. Virtual Cloud Network Setup: ``ナビゲート: ネットワーキング → Virtual Cloud Networks→ VCNウィザードの起動
    • 名前: ol-vcn-01
    • VCNの作成: 「Networking」→「Virtual Cloud Networks」→「kvm-network」→「Security Lists」イングレス・ルールを追加します。
    • SSH: ソース0.0.0.0/0、TCPポート22
    • HTTP: ソース0.0.0.0/0、TCPポート80 ```
  2. コンピュート・インスタンスの設定:
         Navigation: Hamburger Menu → Compute → Instances → Create Instance
    
         Configuration:
         - Name: ol-node-01
         - Image: Oracle Linux 8 (Latest)
         - Shape: VM.Standard.E4.Flex (4 OCPUs, 16GB RAM)
         - Boot Volume: 100 GB
         - VCN: ol-vcn-01 
         - Subnet: Public subnet ol-vcn-01
         - Assign Public IP: Yes
         - Add SSH Key: Upload your public key
    
  3. SSHを使用してコンピュート・パブリックIPをテストします。
     ssh opc@<ol-vcn-01_PUBLIC_IP>
    
  4. ステップ2: 環境での仮想化のサポートの検証に進みます。

次のステップ

Oracle Linux Virtual Manager (OLVM)でホストとvmを管理する方法

確認

その他の学習リソース

docs.oracle.com/learnで他のラボを確認するか、Oracle Learning YouTubeチャネルで無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスして、Oracle Learning Explorerになります。

製品ドキュメントについては、Oracle Help Centerを参照してください。