Oracle Linux KVM에 다중 VM LAMP 스택 생성
소개
Oracle Virtualization 솔루션의 핵심은 Oracle Linux KVM 호스트입니다. 이 하이퍼바이저 위에 Oracle Linux, RHEL, Windows, Ubuntu, Solaris 등 지원되는 운영체제 중 하나를 실행하는 여러 가상 머신을 실행할 수 있습니다. This virtualization solution is managed through the Oracle Linux Virtualization Manager which offers a single interface to keep things organized. Oracle Linux Virtualization Manager는 다중 호스트/다중 VM 관리 외에도 Oracle Virtualization 솔루션의 주요 기능을 지원합니다. 예를 들어, Oracle Linux Virtualization Manager는 VM 페일오버를 통한 자동 고가용성, 다운타임 없는 호스트 간 VM 라이브 마이그레이션, 역할 기반 액세스 제어 및 감사 로깅, 간소화된 백업 및 재해 복구 워크플로를 제공합니다. 이러한 엔터프라이즈 기능은 개별 호스트에서 진정한 엔터프라이즈 가상화 플랫폼으로 Oracle Linux KVM을 변환합니다.
이 자습서에서는 Oracle Virtualization을 강화하는 핵심 하이퍼바이저 기술을 살펴봅니다. 커널 기반 가상 머신(KVM)은 오픈 소스 유형 1(베어 메탈) 하이퍼바이저입니다. 이 기능을 사용하면 Oracle Linux와 같은 호스트 시스템에서 지원되는 하드웨어에서 실행할 때 여러 VM(가상 머신) 또는 게스트를 호스트할 수 있습니다.
이 사용지침서에서는 Oracle Linux KVM을 배포하여 LAMP 스택 애플리케이션으로 구성된 가상 머신을 생성함으로써 여러 VM에 걸쳐 Linux, Apache, MySQL 및 PHP 구성요소를 사용하여 완전한 웹 개발 환경을 호스팅할 수 있습니다.
중요: 이 실습의 두 응용 프로그램 코드는 교육용으로만 제공됩니다. 개발자가 LAMP 스택을 통해 애플리케이션 개발 기술을 배우고 실습할 수 있도록 지원하기 위해 설계되었습니다. 이러한 코드는 운용 환경을 위한 것이 아니며 라이브 설정에서 있는 그대로 사용해서는 안됩니다.
목표
- OCI, Luna 또는 온프레미스 서버 설정
- Oracle Linux KVM 배치
- Oracle Cloud 이미지를 사용하여 가상 머신 생성
- MySQL 서버 설치
- Apache 및 PHP로 웹 서버 설치
필수 조건
sudo 권한이 있는 비루트 사용자가 있는 모든 Oracle Linux 시스템입니다.
단계 1: Oracle Linux 배치
주: 고유 테넌시에서 실행 중인 경우 linux-virt-labs
GitHub 프로젝트 README.md를 읽고 실습 환경을 배치하기 전에 필요 조건을 완료하십시오.
-
Luna Desktop에서 터미널을 엽니다.
-
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
-
lab 환경을 배치합니다.
ansible-playbook create_instance.yml -e localhost_python_interpreter="/usr/bin/python3.6" -e instance_ocpus="4" -e instance_memory="64"
무료 실습 환경에는 localhost에서 실행되는 재생에 대해
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 설치가 완료되고 인스턴스가 준비됩니다. 이전 플레이에서 배치하는 노드의 공용(public) 및 전용(private) IP 주소와 실습을 실행하는 동안 필요한 기타 배치 정보를 출력합니다.
2단계: 가상화를 지원하는 환경 검증
-
터미널을 열고 ol-node-01 인스턴스에 SSH를 사용하여 연결합니다.
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(lsmod 출력에 패키지 설치 → libvirtd 서비스 시작 → 모듈이 나타남)입니다.
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 VM을 실행하도록 설정합니다.
virt-host-validate
모든 검사를 통과하면 VM 만들기를 위해 시스템이 준비됩니다. 검사가 실패하면 지침에 따라 문제를 해결하십시오. 검사에서
WARN
값을 반환하는 경우 가상화 기능 향상을 위한 지침을 따르십시오. -
각 부트 시 자동으로 시작되도록 Systemd 서비스를 시작합니다.
sudo systemctl enable --now libvirtd.service
-
서비스 상태를 확인하여 작동 및 실행 중인지 확인합니다.
sudo systemctl status libvirtd.service
이 유틸리티는 서비스를 사용으로 설정 및 실행 중으로 표시합니다. 필요한 경우 문자 'q'를 입력하여 출력 모드를 종료합니다.
4단계: Oracle Cloud 이미지를 사용하여 두 개의 가상 머신 생성
-
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 만들기(웹 서버)
-
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)
- 나중에 사용할 수 있도록 VM IP 주소를 저장합니다.
echo "VM-01 (Web): $VM01_IP"
echo "VM-02 (Web): $VM02_IP"
- VM에 대한 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 로그에서 임시 루트 암호를 추출합니다.
TEMP_PASS=$(sudo grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}')
- 임시 루트 암호를 사용하여 MySQL에 로그인합니다.
mysql -uroot -p$TEMP_PASS --connect-expired-password
- 루트 암호를 보안 값으로 변경합니다.
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 또는 온-프레미스(On-Premise) 환경을 열고 로컬 시스템에서
VM-02
웹 서버에 액세스하는 SSH 터널을 생성합니다.... 먼저 **
** 및 ** 를 교체해야 합니다.** ssh -L 8081:<YOUR_VM_02_PUBLIC_IP>:80 opc@<YOUR_OCI_PUBLIC_IP>
- Luna 또는 온프레미스 환경의 브라우저를 사용하여 SSH 터널을 통해 웹 서버에 액세스하여 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.???'); … 코드 뒤에
-
VM-02
를 종료합니다.exit
단계 9: 웹 서버 및 데이터베이스 테스트 응용 프로그램에 액세스
- 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: 사원 데이터베이스 웹 응용 프로그램 생성
- 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.???'); … 코드 뒤에
- 웹 서버 VM을 종료합니다.
exit
12단계: 사원 애플리케이션 액세스
- SSH 터널이 닫히면 기본 테스트를 만듭니다.
ssh -L 8081:$VM02_IP:80 opc@<YOUR_OCI_PUBLIC_IP>
- 직원 데이터베이스 데모 다음으로 이동:
http://localhost:8081/employees.php
예상 결과:
- 기본 테스트: 녹색 "Successfully Connected to MySQL!" 메시지
- 직원 데모: 직원 기록이 30만 개 이상인 전문 인터페이스
사용 가능한 응용 프로그램:
🔧 기본 LAMP 테스트(http://localhost:8081/dbtest.php
)
- 간단한 데이터베이스 연결 테스트
- 시스템 정보 표시
- MySQL 버전 및 상태
🏢 Employee Database 데모(http://localhost:8081/employees.php
)
- 직원 기록 300,000건 이상
- 400,000+ 급여 레코드
- 통계가 있는 전문 인터페이스
- 데모를 위한 실제 데이터
- 부서 목록 및 직원 세부정보
필수 관리 명령
VM 관리
- 실행 중인 VM 및 해당 상태를 나열합니다.
sudo virsh list
VM-01
를 시작합니다.sudo virsh start vm-01
VM-01
를 종료합니다.sudo virsh shutdown vm-01
- 기본 네트워크의 VM에 대한 DHCP 임대를 표시합니다.
sudo virsh net-dhcp-leases --network default
Oracle Cloud Infrastructure에서 이 실습을 실행하기 위한 설정
- 가상 클라우드 네트워크 설정: ``탐색: 네트워킹 → 가상 클라우드 네트워크 → VCN 마법사 시작
- 이름: ol-vcn-01
- VCN 생성 탐색: 네트워킹 → 가상 클라우드 네트워크 → kvm-network → 보안 목록 다음 수신 규칙을 추가합니다.
- 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단계: 가상화가 지원되는 환경 검증을 계속합니다.
다음 단계
OLVM(Oracle Linux Virtual Manager)을 사용하여 호스트 및 VM을 관리하는 방법 학습
관련 링크
승인
- 저자 - Perside Foster, Bill Graef, Daniel Kingsley
- 기여자 - Oracle VM 제품 관리(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
G43725-01