주:

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

목표

필수 조건

다음 구성을 사용하는 모든 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. Luna Desktop에서 새 터미널을 열고 SSH를 통해 ol-node-01 인스턴스에 연결합니다.

    ssh opc@<YOUR ol-node-01 PUBLIC_IP>
    
  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 가상화에 대한 관련 소프트웨어 패키지를 설치합니다.

    이 명령은 libvirt 및 Oracle Linux에 대한 기타 종속성을 포함하는 가상화 패키지를 설치합니다. libvirt 패키지는 KVM 가상 머신을 관리할 수 있는 소프트웨어 라이브러리 및 API를 제공하며, 실제 VM 관리를 처리하기 위해 백그라운드에서 실행되는 libvirtd 데몬을 포함합니다.

    sudo dnf module install -y virt
    
  3. virt-install 설치 - KVM(커널 기반 가상 머신) 하이퍼바이저를 사용하여 VM(가상 머신)을 만들고 구성하기 위한 도구입니다.

    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. vm-01에 대한 새 디스크 이미지에 Oracle Linux 이미지 복사
    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. hostnamectl를 실행하여 가상 머신에 대한 세부정보를 가져옵니다.

    hostnamectl
    
  16. 다음 단계를 계속하려면 vm-01 서버를 종료합니다.

    exit
    

    hostnamectl를 실행하여 버전을 확인하고 가상 머신 내의 OS에 대한 추가 세부정보를 확인할 수 있습니다.

    VM-02 만들기(웹 서버)

  17. vm-02에 대한 메타 데이터 파일 만들기

    cat << 'EOF' | sudo tee ~/meta-data > /dev/null
    instance-id: iid-local02
    local-hostname: vm-02
    EOF
    
  18. vm-02에 대한 ISO 이미지 생성
    sudo genisoimage -output /var/lib/libvirt/images/vm-02.iso -volid cidata -joliet -rock ~/user-data ~/meta-data
    
  19. vm-02에 대한 새 디스크 이미지에 Oracle Linux 이미지 복사
    sudo cp /var/lib/libvirt/images/OL8U10_x86_64-kvm-b237.qcow2 /var/lib/libvirt/images/vm-02.qcow
    
  20. 지정된 리소스 및 구성으로 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
    
  21. 실행 중인 모든 가상 시스템 나열
    sudo virsh list
    
  22. vm-02 가상 머신의 IP 주소를 검색합니다.

    sudo virsh net-dhcp-leases --network default
    
  23. ssh에 연결하여 가상 머신이 작동하는지 확인합니다.

    ssh opc@<ip_address_of_vm-02>
    
  24. hostnamectl를 실행하여 가상 머신에 대한 세부정보를 가져옵니다.

    hostnamectl
    
  25. 다음 단계를 계속하려면 vm-02 서버를 종료합니다.

    exit
    
  26. 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
    
  27. 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)
    
  28. 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)
    
  29. VM IP 주소가 제대로 저장되었는지 확인합니다.
     echo "VM-01 (Web): $VM01_IP"
    
     echo "VM-02 (Web): $VM02_IP"
    
  30. 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 'Welcome#123';
    
  12. 보안 암호로 'admin' 사용자 만들기
     CREATE USER 'admin'@'%' IDENTIFIED BY 'Welcome#123';
    
  13. 'admin' 사용자에게 모든 권한 부여
     GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION;
    
  14. 보안 암호를 사용하여 'empuser' 유저 생성
     CREATE USER 'empuser'@'%' IDENTIFIED BY 'Welcome#123';
    
  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 IP의 IP 주소 표시:
     echo "VM-02 (Web): $VM02_IP"
    
  2. Luna Desktop에서 새 터미널을 열고 로컬 시스템에서 VM-02 웹 서버에 액세스하기 위한 SSH 터널을 만듭니다.

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

     ssh -L 8081:<YOUR VM_02 IP>:80 opc@<YOUR ol-node-01 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', '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
    
  7. 애플리케이션 파일 권한 설정
     sudo chown apache:apache /var/www/html/*.php
    
  8. $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.???');

  9. VM-02 종료

     exit
    

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


  1. SSH 터널이 닫히면 기본 테스트에 대해 생성합니다.
     ssh -L 8081:$VM02_IP:80 opc@<YOUR ol-node-01 PUBLIC_IP>
    
  2. 기본 LAMP 테스트 찾아보기:
     http://localhost:8081/info.php
    
  3. 기본 데이터베이스 테스트 데모 찾아보기:
    http://localhost:8081/dbtest.php
    

예상 결과:

단계 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 직원 샘플 데이터베이스 다운로드
     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"
    
  7. 압축 도구 설치
     sudo dnf install -y unzip
    
  8. 데이터베이스 추출
     sudo unzip employees_db_full.zip
    
     cd employees_db_full
    
  9. 데이터베이스를 로드합니다.
     mysql -u admin -pWelcome#123 < employee.sql
    
  10. 데이터베이스 로드 확인
     mysql -u admin -pWelcome#123 -e "USE employee; SHOW TABLES; SELECT COUNT(*) FROM employee;"
    
  11. 데이터베이스 VM 종료
     exit
    

단계 11: 사원 데이터베이스 웹 응용 프로그램 생성

  1. ol-node-01 인스턴스에서 SSH는 VM-02에 대한 SSH 접속을 설정합니다.
     ssh opc@$VM02_IP
    
  2. 전문 직원 데이터베이스 애플리케이션 생성
     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
    
  3. 적절한 권한 설정
     sudo chown apache:apache /var/www/html/employee.php
    
  4. $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.???');

  5. 웹 서버 VM 종료
     exit
    

12단계: 사원 애플리케이션 액세스

  1. SSH 터널이 닫히면 기본 테스트에 대해 생성합니다.
     ssh -L 8081:$VM02_IP:80 opc@<YOUR ol-node-01 PUBLIC_IP>
    
  2. 직원 데이터베이스 데모 다음으로 이동:
     http://localhost:8081/employee.php
    

예상 결과:


사용 가능한 응용 프로그램:

🔧 기본 LAMP 테스트(http://localhost:8081/dbtest.php)

🏢 Employee Database 데모(http://localhost:8081/employee.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를 참조하십시오.