주:
- 이 자습서는 Oracle에서 제공하는 무료 실습 환경에서 사용할 수 있습니다.
- Oracle Cloud Infrastructure 인증서, 테넌시 및 구획에 예제 값을 사용합니다. 실습을 완료할 때 이러한 값을 클라우드 환경과 관련된 값으로 대체하십시오.
Oracle Virtualization에서 다중 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로 웹 서버 설치
필수 조건
다음 구성을 사용하는 모든 Oracle Linux 시스템:
- sudo 권한이 있는 비루트 사용자
단계 1: Oracle Linux 배치
주: 고유 테넌시에서 실행 중인 경우 linux-virt-labs GitHub 프로젝트 README.md를 읽고 실습 환경을 배치하기 전에 필요 조건을 완료하십시오.
-
Luna Desktop에서 터미널을 엽니다.
-
linux-virt-labsGitHub 프로젝트를 복제합니다.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단계: 가상화를 지원하는 환경 검증
-
Luna Desktop에서 새 터미널을 열고 SSH를 통해 ol-node-01 인스턴스에 연결합니다.
ssh opc@<YOUR ol-node-01 PUBLIC_IP> -
다음 명령을 실행하여 CPU 유형을 확인합니다.
grep -e 'vendor_id' /proc/cpuinfo | uniqvendor_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 가상화에 대한 관련 소프트웨어 패키지를 설치합니다.
이 명령은 libvirt 및 Oracle Linux에 대한 기타 종속성을 포함하는 가상화 패키지를 설치합니다. libvirt 패키지는 KVM 가상 머신을 관리할 수 있는 소프트웨어 라이브러리 및 API를 제공하며, 실제 VM 관리를 처리하기 위해 백그라운드에서 실행되는 libvirtd 데몬을 포함합니다.
sudo dnf module install -y virt -
virt-install설치 - KVM(커널 기반 가상 머신) 하이퍼바이저를 사용하여 VM(가상 머신)을 만들고 구성하기 위한 도구입니다.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.qcow2VM-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 4096Enter를 눌러 각 기본값을 적용합니다. 이 명령은 사용자 홈의.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 - vm-01에 대한 새 디스크 이미지에 Oracle Linux 이미지 복사
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> -
hostnamectl를 실행하여 가상 머신에 대한 세부정보를 가져옵니다.hostnamectl -
다음 단계를 계속하려면 vm-01 서버를 종료합니다.
exithostnamectl를 실행하여 버전을 확인하고 가상 머신 내의 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 - vm-02에 대한 새 디스크 이미지에 Oracle Linux 이미지 복사
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> -
hostnamectl를 실행하여 가상 머신에 대한 세부정보를 가져옵니다.hostnamectl -
다음 단계를 계속하려면 vm-02 서버를 종료합니다.
exit -
hostnamectl를 실행하여 버전을 확인하고 가상 머신 내의 OS에 대한 추가 세부정보를 확인할 수 있습니다.hostnamectl출력 예:
[oracle@ol-node01 images]$ ssh opc@192.168.122.46 The authenticity of host '192.168.122.46 (192.168.122.46)' can't be established. ECDSA key fingerprint is SHA256:xcuVfQdoFDCC72i7plD0OfqDTSBG6QWhOm5ti4HIKEs. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '192.168.122.46' (ECDSA) to the list of known hosts. [opc@vm-01 ~]$ hostnamectl Static hostname: vm-01 Icon name: computer-vm Chassis: vm Machine ID: 30c9345b511448b681aafb3371de9792 Boot ID: c2d5586b094f4d299a4ba6c05086d004 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 변수에 저장합니다.
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 변수에 저장합니다.
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 --reloadMySQL 구성
- 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 'Welcome#123'; - 보안 암호로 'admin' 사용자 만들기
CREATE USER 'admin'@'%' IDENTIFIED BY 'Welcome#123'; - 'admin' 사용자에게 모든 권한 부여
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION; - 보안 암호를 사용하여 'empuser' 유저 생성
CREATE USER 'empuser'@'%' IDENTIFIED BY 'Welcome#123'; - '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 IP의 IP 주소 표시:
echo "VM-02 (Web): $VM02_IP" -
Luna Desktop에서 새 터미널을 열고 로컬 시스템에서 VM-02 웹 서버에 액세스하기 위한 SSH 터널을 만듭니다.
... 먼저 **
** 및 ** 를 교체해야 합니다.** ssh -L 8081:<YOUR VM_02 IP>:80 opc@<YOUR ol-node-01 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', 'Welcome#123'); 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 값을 저장된 vm-01 IP 주소 값으로 변경하여 define('DB_SERVER', '$VM01_IP'); 행을 업데이트합니다.
sudo vi /var/www/html/dbtest.php출력 예:
```text … Code before define('DB_SERVER', '$VM01_IP'); … 정의 후 코드('DB_SERVER', '192.168.122.???');
-
VM-02 종료
exit
단계 9: 웹 서버 및 데이터베이스 테스트 응용 프로그램에 액세스
- SSH 터널이 닫히면 기본 테스트에 대해 생성합니다.
ssh -L 8081:$VM02_IP:80 opc@<YOUR ol-node-01 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 직원 샘플 데이터베이스 다운로드
sudo curl -L -o employees_db_full.zip "https://objectstorage.us-ashburn-1.oraclecloud.com/p/5UYZYk1vh241OqeHp_J0xnzBpzUOxZtTgaqCH16OP7HpOjC71W207gAY9EY1rW2U/n/idazzjlcjqzj/b/mysql-ee-downloads/o/employees_db_full.zip" - 압축 도구 설치
sudo dnf install -y unzip - 데이터베이스 추출
sudo unzip employees_db_full.zipcd employees_db_full - 데이터베이스를 로드합니다.
mysql -u admin -pWelcome#123 < employee.sql - 데이터베이스 로드 확인
mysql -u admin -pWelcome#123 -e "USE employee; SHOW TABLES; SELECT COUNT(*) FROM employee;" - 데이터베이스 VM 종료
exit
단계 11: 사원 데이터베이스 웹 응용 프로그램 생성
- ol-node-01 인스턴스에서 SSH는 VM-02에 대한 SSH 접속을 설정합니다.
ssh opc@$VM02_IP - 전문 직원 데이터베이스 애플리케이션 생성
sudo tee /var/www/html/employee.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', 'Welcome#123'); define('DB_NAME', 'employee'); 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 employee"); $stats['employee'] = $stmt->fetch()['count']; $stmt = $pdo->query("SELECT COUNT(*) as count FROM department"); $stats['departments'] = $stmt->fetch()['count']; $stmt = $pdo->query("SELECT COUNT(*) as count FROM salary"); $stats['salaries'] = $stmt->fetch()['count']; $stmt = $pdo->query("SELECT COUNT(*) as count FROM title"); $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['employee']) . '</div><div>Employee</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 employee 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 employee ORDER BY hire_date DESC LIMIT 20"); $employee = $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 ($employee 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 department 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+ employee, 400,000+ salary records</p> </div> </body> </html> EOF - 적절한 권한 설정
sudo chown apache:apache /var/www/html/employee.php - $VM01_IP 값을 저장된 IP 주소 값으로 변경하여 define('DB_SERVER', '$VM01_IP'); 행을 업데이트합니다.
sudo vi /var/www/html/employee.php출력 예:
```text … Code before define('DB_SERVER', '$VM01_IP'); … 정의 후 코드('DB_SERVER', '192.168.122.???');
- 웹 서버 VM 종료
exit
12단계: 사원 애플리케이션 액세스
- SSH 터널이 닫히면 기본 테스트에 대해 생성합니다.
ssh -L 8081:$VM02_IP:80 opc@<YOUR ol-node-01 PUBLIC_IP> - 직원 데이터베이스 데모 다음으로 이동:
http://localhost:8081/employee.php
예상 결과:
- 기본 테스트: 녹색 "Successfully Connected to MySQL!" 메시지
- 직원 데모: 직원 기록이 30만 개 이상인 전문 인터페이스
사용 가능한 응용 프로그램:
🔧 기본 LAMP 테스트(http://localhost:8081/dbtest.php)
- 간단한 데이터베이스 연결 테스트
- 시스템 정보 표시
- MySQL 버전 및 상태
🏢 Employee Database 데모(http://localhost:8081/employee.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을 관리하는 방법 학습
관련 링크
추가 학습 자원
docs.oracle.com/learn에서 다른 랩을 탐색하거나 Oracle Learning YouTube 채널에서 더 많은 무료 학습 콘텐츠에 액세스하세요. 또한 education.oracle.com/learning-explorer를 방문하여 Oracle Learning Explorer가 되십시오.
제품 설명서는 Oracle Help Center를 참조하십시오.
Create Multi-VM LAMP Stack on Oracle Virtualization
G43725-02