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 스택을 통해 애플리케이션 개발 기술을 배우고 실습할 수 있도록 지원하기 위해 설계되었습니다. 이러한 코드는 운용 환경을 위한 것이 아니며 라이브 설정에서 있는 그대로 사용해서는 안됩니다.

목표

필수 조건

sudo 권한이 있는 비루트 사용자가 있는 모든 Oracle Linux 시스템입니다.

단계 1: Oracle Linux 배치

주: 고유 테넌시에서 실행 중인 경우 linux-virt-labs GitHub 프로젝트 README.md를 읽고 실습 환경을 배치하기 전에 필요 조건을 완료하십시오.

  1. Luna Desktop에서 터미널을 엽니다.

  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. 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단계: 가상화를 지원하는 환경 검증

  1. 터미널을 열고 ol-node-01 인스턴스에 SSH를 사용하여 연결합니다.

    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(lsmod 출력에 패키지 설치 → libvirtd 서비스 시작 → 모듈이 나타남)입니다.

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 VM을 실행하도록 설정합니다.

    virt-host-validate
    

    모든 검사를 통과하면 VM 만들기를 위해 시스템이 준비됩니다. 검사가 실패하면 지침에 따라 문제를 해결하십시오. 검사에서 WARN 값을 반환하는 경우 가상화 기능 향상을 위한 지침을 따르십시오.

  5. 각 부트 시 자동으로 시작되도록 Systemd 서비스를 시작합니다.

    sudo systemctl enable --now libvirtd.service
    
  6. 서비스 상태를 확인하여 작동 및 실행 중인지 확인합니다.

    sudo systemctl status libvirtd.service
    

    이 유틸리티는 서비스를 사용으로 설정 및 실행 중으로 표시합니다. 필요한 경우 문자 'q'를 입력하여 출력 모드를 종료합니다.

4단계: Oracle Cloud 이미지를 사용하여 두 개의 가상 머신 생성

  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 만들기(웹 서버)

  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. 나중에 사용할 수 있도록 VM IP 주소를 저장합니다.
     echo "VM-01 (Web): $VM01_IP"
    
     echo "VM-02 (Web): $VM02_IP"
    
  28. 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 설치

  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 로그에서 임시 루트 암호를 추출합니다.
     TEMP_PASS=$(sudo grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}')
    
  10. 임시 루트 암호를 사용하여 MySQL에 로그인합니다.
     mysql -uroot -p$TEMP_PASS --connect-expired-password
    
  11. 루트 암호를 보안 값으로 변경합니다.
     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 또는 온-프레미스(On-Premise) 환경을 열고 로컬 시스템에서 VM-02 웹 서버에 액세스하는 SSH 터널을 생성합니다.

    ... 먼저 **** 및 ****를 교체해야 합니다.

     ssh -L 8081:<YOUR_VM_02_PUBLIC_IP>:80 opc@<YOUR_OCI_PUBLIC_IP>
    
  3. Luna 또는 온프레미스 환경의 브라우저를 사용하여 SSH 터널을 통해 웹 서버에 액세스하여 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.???'); … 코드 뒤에

  9. VM-02를 종료합니다.

     exit
    

단계 9: 웹 서버 및 데이터베이스 테스트 응용 프로그램에 액세스


  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: 사원 데이터베이스 웹 응용 프로그램 생성

  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.???'); … 코드 뒤에

  5. 웹 서버 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)

🏢 Employee Database 데모(http://localhost:8081/employees.php)


필수 관리 명령

VM 관리

  1. 실행 중인 VM 및 해당 상태를 나열합니다.
     sudo virsh list
    
  2. VM-01를 시작합니다.
     sudo virsh start vm-01
    
  3. VM-01를 종료합니다.
     sudo virsh shutdown vm-01
    
  4. 기본 네트워크의 VM에 대한 DHCP 임대를 표시합니다.
     sudo virsh net-dhcp-leases --network default
    

Oracle Cloud Infrastructure에서 이 실습을 실행하기 위한 설정

  1. 가상 클라우드 네트워크 설정: ``탐색: 네트워킹 → 가상 클라우드 네트워크 → VCN 마법사 시작
    • 이름: ol-vcn-01
    • VCN 생성 탐색: 네트워킹 → 가상 클라우드 네트워크 → kvm-network → 보안 목록 다음 수신 규칙을 추가합니다.
    • 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단계: 가상화가 지원되는 환경 검증을 계속합니다.

다음 단계

OLVM(Oracle Linux Virtual Manager)을 사용하여 호스트 및 VM을 관리하는 방법 학습

승인

추가 학습 자원

docs.oracle.com/learn에서 다른 랩을 탐색하거나 Oracle Learning YouTube 채널에서 더 많은 무료 학습 콘텐츠에 액세스하세요. 또한 education.oracle.com/learning-explorer를 방문하여 Oracle Learning Explorer가 되십시오.

제품 설명서는 Oracle Help Center를 참조하십시오.