Docker에서 실행되는 레거시 PHP(5.3) 애플리케이션 가져오기

이 기사에서는 docker-compose를 사용하여 레거시 애플리케이션을 실행하기 위한 MySQL+PHP 환경을 만듭니다.

레거시 애플리케이션은 오래되고 오래된 버전의 PHP가 작동해야 하는 앱입니다.

PHP의 공식 이미지는 Docker 허브https://hub.docker.com/_/php/에서 사용할 수 있습니다.

거기에서 사용 가능한 가장 오래된 이미지를 사용합니다.
  • php:5.3.29-apache

  • 다음을 사용하여 이미지를 바로 다운로드할 수 있습니다.

    $ docker pull php:5.3.29-apache
    


    예를 들어 이전 PHP 버전에서만 작동하는 작은 PHP 코드 스니펫을 제공합니다.
    index.php :

    <?php
    $conn = mysql_connect("localhost", "user", "saxud3sldnb");
    mysql_select_db( "application_db");
    mysql_close($conn);
    


  • mysql_connect는 최신 PHP 버전
  • 에서 더 이상 사용할 수 없습니다.

    Docker 구성 및 설정을 추적하려면 docker-compose.yml 를 생성합니다.

    그러면 docker-compose.yml를 저장소에 커밋하고 환경을 설정하는 데 필요한 단계를 추적할 수 있기 때문입니다.

    다음 파일은 시작 버전입니다.
    docker-compose.yml :

    version: '3.7'
    services:
      legacy-php:
        image: php:5.3.29-apache
        volumes:
        - .:/var/www/html
    


    그런 다음 실행해 보십시오.

    $ docker-compose run -T legacy-php php /var/www/html/index.php
    Creating example-legacy-php-app_legacy-php_run ... done
    
    Warning: mysql_connect(): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) in /var/www/html/index.php on line 2
    
    Warning: mysql_select_db(): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) in /var/www/html/index.php on line 3
    
    Warning: mysql_select_db(): A link to the server could not be established in /var/www/html/index.php on line 3
    
    Warning: mysql_close() expects parameter 1 to be resource, boolean given in /var/www/html/index.php on line 4
    


    MySQL 서버가 아직 설정 및 연결되지 않았기 때문에 몇 가지 오류가 있습니다.

    다음 단계입니다.

    MySQL Docker 이미지는 여기에서 사용할 수 있습니다.
    https://hub.docker.com/r/mysql/mysql-server/

    이 가이드에서는 버전5.7.37을 사용하고 있습니다.

    $ docker pull mysql/mysql-server:5.7.37
    


    docker-compose.yml 파일에 이미지를 추가해 보겠습니다.
    docker-compose.yml :

    version: '3.7'
    services:
      mysql:
        image: mysql/mysql-server:5.7.37
        environment:
         MYSQL_DATABASE: application_db
         MYSQL_USER: user
         MYSQL_PASSWORD: saxud3sldnb
        restart: always
      legacy-php:
        depends_on:
         - mysql
        image: php:5.3.29-apache
        volumes:
        - .:/var/www/html
    


    PHP 예제 스크립트에는 약간의 변경이 필요합니다.

    "localhost"대신 호스트 이름 "mysql"을 사용하십시오.
    index.php :

    <?php
    $conn = mysql_connect("mysql", "user", "saxud3sldnb"); <1>
    mysql_select_db( "application_db");
    mysql_close($conn);
    


    위와 동일한 명령줄로 이것을 실행하고 빈 출력을 얻습니다.

    스크립트는 아직 많은 작업을 수행하지 않습니다.

    $ docker-compose run -T legacy-php php /var/www/html/index.php  
    Creating example-legacy-php-app_legacy-php_run ... done
    $ 
    


    따라서 기존 사용자에 대해 데이터베이스를 쿼리할 수 있습니다.
    index.php :

    <?php
    $conn = mysql_connect("mysql", "user", "saxud3sldnb"); <1>
    mysql_select_db( "application_db");
    $result = mysql_query("SELECT * FROM `users`");
    if (!$result) {
            echo "Error: " . mysql_error();
    } else {
            while ($row = mysql_fetch_assoc($result)) {
                    foreach($row as $key => $value) {
                            echo $key.": ".$value.", ";
                    }
            }
    }
    mysql_close($conn);
    


    이 예제를 실행하면 데이터베이스가 비어 있고 테이블을 찾을 수 없기 때문에 오류 메시지가 나타납니다.

    $ docker-compose run -T legacy-php php /var/www/html/index.php 
    Creating example-legacy-php-app_legacy-php_run ... done
    Error: Table 'application_db.users' doesn't exist%
    $
    


    간단한 예를 들어 데이터베이스를 초기화해 보겠습니다.
    코드를 작동시키십시오.
    init.sql :

    CREATE TABLE `users`(
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(80) NOT NULL DEFAULT '',
      `password` varchar(40) NOT NULL DEFAULT '',
      PRIMARY KEY (`id`)
    );
    INSERT INTO `users`(`name`,`password`) VALUES ('admin', MD5('passw0rd'));
    


    위의 SQL 스크립트는 md5로 인코딩된 암호를 사용하여 초기 테이블과 관리 사용자를 만듭니다.

    순수한 md5를 사용하는 것은 암호에 대한 잘못된 알고리즘이며 여기서는 예제용으로만 사용됩니다.

    MySQL 도커 이미지에는 데이터베이스를 초기화하는 스크립트가 있습니다. 올바른 위치에 init.sql를 추가하겠습니다.
    docker-compose.yml :

    version: '3.7'
    services:
      mysql:
        image: mysql/mysql-server:5.7.37
        environment:
         MYSQL_DATABASE: application_db
         MYSQL_USER: user
         MYSQL_PASSWORD: saxud3sldnb
        restart: always
        volumes:
         - ./init.sql:/docker-entrypoint-initdb.d/init.sql
      legacy-php:
        depends_on:
         - mysql
        image: php:5.3.29-apache
        volumes:
         - .:/var/www/html
        ports:
         - "8002:80"
    


  • 포트 80이 로컬 시스템으로 전달됩니다.
    웹브라우저에서 http://localhost:8002에 있는 응용 프로그램입니다.

  • 새 초기화 스크립트를 실행하려면 MySQL 컨테이너를 다시 시작하십시오.

    그런 다음 예제를 다시 실행합니다.

    $ docker-compose stop
    Stopping example-legacy-php-app_mysql_1 ... done
    $ docker-compose run -T legacy-php php /var/www/html/index.php 
    Creating example-legacy-php-app_legacy-php_run ... done
    id: 1, name: admin, password: bed128365216c019988915ed3add75fb%
    $ 
    


    그리고 이것으로 기사를 마칩니다.

    수행된 작업:
  • PHP 5 특정 코드를 실행하기 위한 Docker 컨테이너
  • PHP 컨테이너에 연결된 MySQL 컨테이너
  • 데이터베이스가 초기화되고 사용할 준비가 되었습니다.
  • 웹 브라우저에서 응용 프로그램 열기

  • 이 기사는 내가 작성한 작은 전자책에서 추출되어 PDF로 무료로 출판되었습니다: https://php5to8.tk

    즐기세요😸

    좋은 웹페이지 즐겨찾기