Docker 컨테이너로 PHP 격리

4974 단어 tutorialdockerphp
Docker는 위대한 기술이다.자신의 시스템을 막지 않고 개발 환경을 설정하거나 새로운 소프트웨어를 시험적으로 사용할 수 있는 좋은 방법이다.
나는 Docker, Apache, PHP로 일부 웹 페이지에 서비스를 제공하고 있다.로컬 시스템을 막거나 여러 Docker 이미지/보행시선 상자를 만들지 않고 PHP 버전을 쉽게 전환하려면 어떻게 해야 합니까?나는 많은 개발자들이 쉽게 해결 방안을 찾을 수 있을 것이라고 믿지만, 나는 개념화 용기 해결 방안에 확실히 어려움이 있다는 것을 인정해야 한다.추상적인 차원은 사유 장애를 초래할 수 있으므로 나는 이것이 나 혼자만의 문제가 아니라고 믿는다.
놀랍게도 Apache/PHP는 Docker의'용기마다 하나의 프로세스'원칙에 적합하지 않다.PHP와 Apache가 이렇게 밀접하게 결합되어 separation of concerns에게 이것은 비초보자이다.
나는 정말 나의 웹 서버 용기가 프로그래밍 언어와 분리되기를 바란다.NGINX와 PHP-FPM으로 전환하는 것은 더욱 뚜렷한 분리를 제공하여 언어 버전을 쉽게 전환할 수 있습니다.만약 다른 버전의 오래된 사이트가 필요하거나, 업그레이드 전에 사이트를 시험적으로 사용하고 싶다면, 이것은 매우 편리할 것이다.

설치 프로그램


그래서 요청이 테스트 5에 전송될 때 계획입니다.com/index.php url, Nginx 용기는 요청을 프로세스 인덱스에 전달합니다.php는 PHP5를 실행하는 용기에 설치되어 있으며 테스트 7과 비슷합니다.com/index.php와 PHP7.
먼저 /etc/hosts 파일에 두 항목을 추가합니다.
127.0.0.1 test5.com
127.0.0.1 test7.com 
Nginx 컨테이너에 액세스하는 데 사용할 주소입니다.
GitHubdocker-php-isolation-example에서 저장소를 다운로드하거나 시스템의 적절한 위치로 복제합니다.모든 명령이 이 폴더의 CLI에서 실행됩니다.
폴더 구조는 비교적 간단합니다.
  • 웹루트 - 자명한 폴더로 index.php라는 파일을 포함하고 phpinfo() 명령을 포함한다.
  • 현장.conf-Nginx 사이트 구성 파일입니다.
  • docker compose.yml-docker 설치 프로필.
  • 부두 일꾼이 작곡하다.yml 파일은 3개의 컨테이너를 설정했는데 모두 Alpine Linux 이미지를 기반으로 하기 때문에 컨테이너의 총 크기는 120Mb에 불과하다.
    version: '2'
    services:
        web:
            image: nginx:alpine
            ports:
                - "8080:80"
            volumes:
                - ./webroot:/var/www/html
                - ./site.conf:/etc/nginx/conf.d/site.conf
            links:
                - php7
                - php5
        php7:
            image: php:7-fpm-alpine
            volumes:
                - ./webroot:/var/www/html
        php5:
            image: php:5-fpm-alpine
            volumes:
                - ./webroot:/var/www/html
    
    마스터 컨테이너는 Nginx 에이전트이며 외부 포트(8080)가 있는 유일한 컨테이너입니다.이 컨테이너 에이전트는 PHP7 PHPfpm 실행 및 PHP5 PHPfpm 실행 포트 9000에 있는 다른 두 컨테이너로 모든 유효한 요청을 보냅니다.

    웹 루트 폴더는 모든 세 용기 사이에서 공유됩니다. Nginx는 PHP 파일이 아닌 모든 파일을 서비스해야 하고, PHP 용기는 PHP 파일에 접근해야 합니다.
    사이트conf 파일은 Nginx가 요청을 처리하는 방법을 정의합니다.
    server {
        listen 80;
        index index.php;
        server_name test7.com;
        root /var/www/html/;
    
        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass php7:9000;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
        }
    }
    
    server {
        listen 80;
        index index.php;
        server_name test5.com;
        root /var/www/html/;
    
        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass php5:9000;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
        }
    }
    
    나는 이 두 주소를 한 주소에 합쳐서 정규 표현식을 사용할 수 있는 방법이 있다고 믿지만, 수명이 너무 짧다.

    그것을 운행하다


    CLI에서 저장소를 다운로드할 폴더로 이동한 다음 docker-compose up -d를 입력합니다.
    그림을 로컬에 저장하지 않으면, 그림을 마운트 해제하고 용기를 시작합니다.완료되면 docker ps를 입력하여 3개 컨테이너가 실행 중인지 확인합니다.
    그래서 선택한 브라우저를 열고test5를 입력하세요.com:8080, PHP5의 phpinfo ()를 보실 수 있습니다.

    다음test7을 입력하십시오.com:8080, 당신은 phpinfo()를 보아야 합니다. 당신이 맞혔습니다, PHP7!

    이제 같은 색인을 처리하는 데 사용할 PHP 버전을 정의할 수 있습니다.php 파일, 몇 시간의 즐거움...

    정리


    흥분 됐어요?실행 중인 용기를 닫으려면 docker-compose down를 입력하십시오. 용기를 닫고 제거해야 합니다.
    다운로드한 이미지를 삭제하려면 docker images를 입력하고 docker rmi IMAGE ID를 입력하십시오. 예를 들어 docker rmi 4fe1b7f08eb1 8b057b9de580 1b95155d2daf는 ID가 4fe1b7f08eb1, 8b057b9de580, 1b95155d2daf인 3개의 이미지를 삭제합니다.

    마침내


    PHP를 '소프트웨어 즉 서비스' 로 제공하는 개념은 눈에 띄지 않는 생각일 수도 있지만, 나는 그것이 정말 멋있다는 것을 발견했다.프로그래밍 언어를 격리할 수 있는 버전은 나로 하여금 매우 흥미를 가지게 한다. 이것은 아마도 내가 미래 프로젝트에서 시도하고 융합한 것일 것이다.
    Docker 용기로 PHP를 격리하는 것은 2017년 7월 10일 myblog site에 가장 먼저 등장했다.

    좋은 웹페이지 즐겨찾기