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スタックを使用してアプリケーション開発スキルを学習し、実践できるように設計されています。これらのコードは本番環境向けではなく、ライブ設定ではそのまま使用しないでください。
目的
- OCI、Lunaまたはオンプレミス・サーバーの設定
- Oracle Linux KVMのデプロイ
- Oracle Cloudイメージを使用した仮想マシンの作成
- MySQLサーバーをインストールします。
- ApacheおよびPHPを使用したWebサーバーのインストール
前提条件
sudo権限を持つ非rootユーザーを持つすべてのOracle Linuxシステム。
ステップ1: Oracle Linuxのデプロイ
ノート:独自のテナンシで実行している場合は、演習環境をデプロイする前に、linux-virt-labs
GitHubプロジェクトREADME.mdを読み、前提条件を完了してください。
-
Lunaデスクトップでターミナルを開きます。
-
linux-virt-labs
GitHubプロジェクトをクローニングします。git clone https://github.com/oracle-devrel/linux-virt-labs.git
-
作業ディレクトリに変更する。
cd linux-virt-labs/ol
-
必要なコレクションをインストールします。
ansible-galaxy collection install -r requirements.yml
-
演習環境をデプロイします。
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: 環境での仮想化のサポートの検証
-
端末を開き、SSHを使用してol-node-01インスタンスに接続します。
ssh opc@<ip_address_of_instance>
-
次のコマンドを実行して、CPUタイプを確認します。
grep -e 'vendor_id' /proc/cpuinfo | uniq
vendor_id
は、AMD CPUの場合はAuthenticAMD
、Intel CPUの場合はGenuinIntel
のいずれかを報告します。 -
ハードウェアが仮想化をサポートしていることを確認します。
CPUタイプに一致するコマンドを実行します。
- AMD V CPU拡張が存在することを確認します。
grep -w -o 'svm' /proc/cpuinfo | uniq
- Intel VT CPU拡張が存在することを確認します。
grep -w -o 'vmx' /proc/cpuinfo | uniq
コマンド出力にこれらのフラグのいずれかが存在することは、このシステムが仮想化をサポートしていることを示しています。
lscpu
コマンドを使用し、出力でVirtualization
エントリを検索することもできます。 -
ロードされたKVMモジュールを確認します。
lsmod | grep kvm
この出力には、仮想化パッケージをインストールしてlibvirtdサービスを起動した後のKVMカーネル・モジュールが表示されます。OCIなどのクラウド・システムでは、これらのモジュールは、パッケージのインストール中ではなく、libvirtdの起動時に自動的にロードされます。ロード順序は、install packages→start libvirtd service→modules appear in lsmod outputです。
ステップ3: KVMのインストールと起動
-
実行中のOracle Linuxのバージョンを確認します。
hostnamectl | grep 'Operating System'
-
Oracle Linux仮想化用の関連ソフトウェア・パッケージをインストールします。
このコマンドは、Oracle Linuxに対するlibvirtおよびその他の依存関係を含む仮想化パッケージをインストールします。libvirtパッケージは、KVM仮想マシンを管理するためのソフトウェア・ライブラリおよびAPIを提供し、実際のVM管理を処理するためにバックグラウンドで実行されるlibvirtdデーモンを含みます。
sudo dnf module install -y virt
-
KVM (カーネルベースの仮想マシン)ハイパーバイザを使用して仮想マシン(VM)を作成および構成するためのツールである
virt-install
をインストールします。sudo dnf install -y virt-install
-
ホスト・マシンの準備が完了し、libvirt VMsを実行するように設定されていることを確認します。
virt-host-validate
すべてのチェックに合格すると、システムは仮想マシンを作成する準備が整います。チェックが失敗した場合は、指示に従って問題を修正します。チェックで
WARN
の値が戻される場合は、仮想化機能を改善する手順に従うことを検討してください。 -
Systemdサービスを起動して、ブートごとに自動的に開始できるようにします。
sudo systemctl enable --now libvirtd.service
-
サービス・ステータスをチェックして、稼働中であることを確認します。
sudo systemctl status libvirtd.service
Theutputは、サービスが有効になっていて実行中であることを示します。必要に応じて、文字「q」を入力して出力モードを終了します。
ステップ4: Oracle Cloudイメージを使用した2つの仮想マシンの作成
-
KVMイメージ記憶域の場所に変更します。
cd /var/lib/libvirt/images
-
Oracle Linux VMテンプレートをダウンロードします。
sudo curl -O https://yum.oracle.com/templates/OracleLinux/OL8/u10/x86_64/OL8U10_x86_64-kvm-b237.qcow2
VM-01の作成(データベース)
-
メタデータ・ファイルを作成します。
cat << 'EOF' | sudo tee ~/meta-data > /dev/null instance-id: iid-local01 local-hostname: vm-01 EOF
-
ユーザーデータファイルを作成します。
cat << 'EOF' | sudo tee ~/user-data > /dev/null #cloud-config system_info: default_user: name: opc ssh_authorized_keys: - <paste_public_key_here> EOF
-
VMへのセキュア接続用のSSHキー・ペアを生成します。
ssh-keygen -t rsa -b 4096
Enter
を押して、各デフォルトを受け入れます。このコマンドは、ユーザーのホームの.ssh
ディレクトリにキー・ペアを書き込みます。 - 生成された公開SSHキーを抽出します。
SSHKEY=$(cat ~/.ssh/id_rsa.pub)
- 生成された公開SSHキーでユーザー・データ・ファイルを更新します。
sed -i "s|<paste_public_key_here>|${SSHKEY}|g" ~/user-data
- ユーザー・データとメタデータ・ファイルを含むISOイメージを生成します。
sudo genisoimage -output /var/lib/libvirt/images/vm-01.iso -volid cidata -joliet -rock ~/user-data ~/meta-data
- ダウンロードしたイメージと一致するOSバリアントを検索します。
osinfo-query os | grep ol8
- Oracle Linuxイメージを
vm-01
の新しいディスク・イメージにコピーします。sudo cp /var/lib/libvirt/images/OL8U10_x86_64-kvm-b237.qcow2 /var/lib/libvirt/images/vm-01.qcow
- 指定されたリソースおよび構成を使用して、
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
- 実行中のすべての仮想マシンを一覧表示します。
sudo virsh list
-
vm-01
仮想マシンのIPアドレスを取得します。sudo virsh net-dhcp-leases --network default
-
ssh
に接続して、仮想マシンが動作することを確認します。ssh opc@<ip_address_of_vm-01>
-
次のステップに進むには、
vm-01
サーバーを終了します。exit
hostnamectl
を実行して、バージョンを確認し、仮想マシン内のOSに関する追加の詳細を取得できます。VM-02の作成(Webサーバー)
-
vm-02
のメタデータ・ファイルを作成します。cat << 'EOF' | sudo tee ~/meta-data > /dev/null instance-id: iid-local02 local-hostname: vm-02 EOF
vm-02
のISOイメージを生成します。sudo genisoimage -output /var/lib/libvirt/images/vm-02.iso -volid cidata -joliet -rock ~/user-data ~/meta-data
- Oracle Linuxイメージを
vm-02
の新しいディスク・イメージにコピーします。sudo cp /var/lib/libvirt/images/OL8U10_x86_64-kvm-b237.qcow2 /var/lib/libvirt/images/vm-02.qcow
- 指定されたリソースおよび構成を使用して、
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
- 実行中のすべての仮想マシンを一覧表示します。
sudo virsh list
-
vm-02
仮想マシンのIPアドレスを取得します。sudo virsh net-dhcp-leases --network default
-
ssh
に接続して、仮想マシンが動作することを確認します。ssh opc@<ip_address_of_vm-02>
-
次のステップに進むには、
vm-01
サーバーを終了します。exit
-
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
vm-01
のIPアドレスを抽出します。VM01_IP=$(sudo virsh net-dhcp-leases --network default | grep vm-01 | tail -1 | awk '{print $5}' | cut -d'/' -f1)
vm-02
のIPアドレスを抽出します。VM02_IP=$(sudo virsh net-dhcp-leases --network default | grep vm-02 | tail -1 | awk '{print $5}' | cut -d'/' -f1)
- 後で使用するためにVMs IPアドレスを保存します。
echo "VM-01 (Web): $VM01_IP"
echo "VM-02 (Web): $VM02_IP"
- 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をインストールします。
- ol-node-01インスタンスから、SSHは
VM-01
へのSSH接続を確立します。ssh opc@$VM01_IP
- MySQLリポジトリ構成をダウンロードします。
sudo yum -y install https://dev.mysql.com/get/mysql84-community-release-el8-1.noarch.rpm
- 競合を回避するために、デフォルトのMySQLモジュールを無効にします。
sudo yum -y module disable mysql
- MySQLサーバーおよびクライアントをインストールします。
sudo yum install -y mysql mysql-server
- MySQLサービスを起動します。
sudo systemctl start mysqld
- ブート時にMySQLサービスを開始できるようにします。
sudo systemctl enable mysqld
- ファイアウォールを介した着信MySQLトラフィックを許可します。
sudo firewall-cmd --permanent --add-service=mysql
- ファイアウォール構成を再読み込みして変更を適用します。
sudo firewall-cmd --reload
MySQLの構成
- MySQLログから一時rootパスワードを抽出します。
TEMP_PASS=$(sudo grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}')
- 一時的なrootパスワードでMySQLにログインします。
mysql -uroot -p$TEMP_PASS --connect-expired-password
- rootパスワードをセキュアな値に変更します。
ALTER USER 'root'@'localhost' IDENTIFIED BY '[password]';
- セキュアなパスワードで「admin」ユーザーを作成します。
CREATE USER 'admin'@'%' IDENTIFIED BY '[password]';
- 'admin'ユーザーにすべての権限を付与します。
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION;
- セキュアなパスワードで'empuser'ユーザーを作成します。
CREATE USER 'empuser'@'%' IDENTIFIED BY '[password]';
- すべての権限を'empuser'に付与します。
GRANT ALL PRIVILEGES ON *.* TO 'empuser'@'%' WITH GRANT OPTION;
- 権限表を再ロードして変更を適用します。
FLUSH PRIVILEGES;
- MySQLシェルを終了します。
\q
VM-01
からSSHセッションを終了します。exit
ステップ6: VM-02でのApache/PHPの設定
- ol-node-01インスタンスから、SSHは
VM-02
へのSSH接続を確立します。ssh opc@$VM02_IP
- Apache HTTPサーバーをインストールします。
sudo yum install -y httpd
- PHP 8.2とその依存関係をインストールします。
sudo dnf install -y @php:8.2
- PHP MySQLおよびJSON拡張機能をインストールします。
sudo yum install -y php-mysqlnd php-json
- Apache HTTPサーバーを有効にして起動します。
sudo systemctl enable --now httpd
- ポート80で受信HTTPトラフィックを許可します。
sudo firewall-cmd --permanent --add-port=80/tcp
- ファイアウォール構成を再読み込みして変更を適用します。
sudo firewall-cmd --reload
- Apacheがネットワークリソースに接続できるようにします。
sudo setsebool -P httpd_can_network_connect 1
VM-02
からSSHセッションを終了します。exit
ステップ7: Apacheのテスト
VM-02
YOUR_VM_02_PUBLIC_IPのパブリックIPアドレスを表示します。echo "VM-02 (Web): $VM02_IP"
-
新しいターミナルLunaまたはオンプレミス環境を開き、ローカル・マシンから
VM-02
WebサーバーにアクセスするためのSSHトンネルを作成します。最初に**
**と** を置き換えてください。** ssh -L 8081:<YOUR_VM_02_PUBLIC_IP>:80 opc@<YOUR_OCI_PUBLIC_IP>
- Lunaまたはオンプレミス環境のブラウザを使用して、SSHトンネルを介してWebサーバーにアクセスしてApacheをテストします。
http://localhost:8081
重要:後で使用するためにSSHトンネルとブラウザを開いたままにします。
ステップ8: テスト・アプリケーションの作成
-
opc@ol-node-01 sshインスタンスに戻ります。
- DHCPリースから
VM-01
のIPアドレスを取得します。VM01_IP=$(sudo virsh net-dhcp-leases --network default | grep vm-01 | tail -1 | awk '{print $5}' | cut -d'/' -f1)
- DHCPリースから
VM-02
のIPアドレスを取得します。VM02_IP=$(sudo virsh net-dhcp-leases --network default | grep vm-02 | tail -1 | awk '{print $5}' | cut -d'/' -f1)
- ol-node-01インスタンスから、SSHは
VM-02
へのSSH接続を確立します。ssh opc@$VM02_IP
- PHP構成を表示するPHP情報ページを作成します。
sudo tee /var/www/html/info.php > /dev/null << 'EOF' <?php phpinfo(); ?> EOF
-
データベース接続テスト・アプリケーションを作成します。
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
- アプリケーションファイルのアクセス権を設定します。
sudo chown apache:apache /var/www/html/*.php
- $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
-
VM-02
を終了します。exit
ステップ9: Webサーバーおよびデータベース・テスト・アプリケーションへのアクセス
- SSHトンネルが閉じている場合は、基本テスト用に作成します。
ssh -L 8081:$VM02_IP:80 opc@<YOUR_OCI_PUBLIC_IP>
- 基本LAMPテスト 参照先:
http://localhost:8081/info.php
- 基本的なデータベース・テストのデモ参照先:
http://localhost:8081/dbtest.php
予期した結果:
基本テスト:緑色の「Successfully Connected to MySQL!」メッセージ
ステップ10: 従業員データベースの作成およびロード
-
opc@ol-node-01 sshインスタンスにいる必要があります。
- DHCPリースから
VM-01
のIPアドレスを取得します。VM01_IP=$(sudo virsh net-dhcp-leases --network default | grep vm-01 | tail -1 | awk '{print $5}' | cut -d'/' -f1)
- DHCPリースから
VM-02
のIPアドレスを取得します。VM02_IP=$(sudo virsh net-dhcp-leases --network default | grep vm-02 | tail -1 | awk '{print $5}' | cut -d'/' -f1)
- opc@ol-node-01 SSHインスタンスから、
VM-01
へのSSH接続を確立します。ssh opc@$VM01_IP
/tmp
フォルダに移動します。cd /tmp
- MySQL従業員サンプル・データベースをダウンロードします。
curl -L -o master.zip https://github.com/datacharmer/test_db/zipball/master/
- 圧縮ツールをインストールします。
sudo dnf install -y unzip
- データベースを抽出します。
sudo unzip master.zip
sudo mv datacharmer-test_db-* employees_db
cd employees_db
- データベースをロードします。
mysql -u admin -p[password] < employees.sql
- データベースがロードされたことを確認します。
mysql -u admin -p[password] -e "USE employees; SHOW TABLES; SELECT COUNT(*) FROM employees;"
- データベースVMを終了します。
exit
ステップ11: 従業員データベースWebアプリケーションの作成
- ol-node-01 SSHインスタンスから、
VM-02
へのSSH接続を確立します。ssh opc@$VM02_IP
- 専門職従業員データベース・アプリケーションを作成します。
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
- 適切な権限を設定します。
sudo chown apache:apache /var/www/html/employees.php
- $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
- WebサーバーVMを終了します。
exit
ステップ12: 従業員アプリケーションへのアクセス
- SSHトンネルが閉じている場合は、基本テスト用に作成します。
ssh -L 8081:$VM02_IP:80 opc@<YOUR_OCI_PUBLIC_IP>
- 従業員データベースのデモ参照先:
http://localhost:8081/employees.php
予期した結果:
- 基本テスト:緑色の「Successfully Connected to MySQL!」メッセージ
- 従業員デモ: 300,000以上の従業員レコードを備えたプロフェッショナル・インターフェース
使用可能なアプリケーション:
🔧 基本的なLAMPテスト (http://localhost:8081/dbtest.php
)
- シンプルなデータベース接続テスト
- システム情報表示
- MySQLのバージョンとステータス
🏢 従業員データベースのデモ(http://localhost:8081/employees.php
)
- 300,000以上の従業員レコード
- 400,000以上の給与レコード
- プロフェッショナル・インタフェースと統計
- デモンストレーション用のリアルワールド・データ
- 部門リストと従業員の詳細
必須の管理コマンド
VM管理
- 実行中の仮想マシンとそのステータスを一覧表示します。
sudo virsh list
VM-01
を起動します。sudo virsh start vm-01
VM-01
を停止します。sudo virsh shutdown vm-01
- デフォルトのネットワーク上のVMsのDHCPリースを表示します。
sudo virsh net-dhcp-leases --network default
Oracle Cloud Infrastructureでこのラボを実行するための設定
- 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 ```
- コンピュート・インスタンスの設定:
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
- SSHを使用してコンピュート・パブリックIPをテストします。
ssh opc@<ol-vcn-01_PUBLIC_IP>
- ステップ2: 環境での仮想化のサポートの検証に進みます。
次のステップ
Oracle Linux Virtual Manager (OLVM)でホストとvmを管理する方法
関連リンク
確認
- 著者: Perside Foster、Bill Graef、Daniel Kingsley
- 貢献者- Oracle VM Product Management(John Priest)、プリンシパル・セールス・コンサルタント(Shawn Kelley)、オープンソース・チャネル・イネーブルメント・チーム(Nick Mader、Chris Bates、Juliana Castro)
その他の学習リソース
docs.oracle.com/learnで他のラボを確認するか、Oracle Learning YouTubeチャネルで無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスして、Oracle Learning Explorerになります。
製品ドキュメントについては、Oracle Help Centerを参照してください。
Create a Multi-VM LAMP Stack on Oracle Linux KVM
G43724-01