Docker-compose를 사용하여 PHP 응용 프로그램 배포

PHP 응용 프로그램은 일반적으로 웹 서버, 관계형 데이터베이스 시스템 및 언어 인터프리터 자체로 구성됩니다. 이 튜토리얼에서는 docker를 사용하여 전체 PHP 응용 프로그램 스택을 활용합니다. 이것은 Nginx (웹 서버), MySQL (데이터베이스 시스템) 및 PHP 용 컨테이너를 빌드하고 조정하는 심층 튜토리얼입니다.

이 튜토리얼을 위해 데이터베이스에서 도시 목록을 읽고 웹 페이지에 표시하는 간단한 응용 프로그램을 작성하여 기본이지만 작동하는 PHP 응용 프로그램을 시연합니다.

이 안내서는 Docker-CE가 이미 설치되어 있고 최소한 도커에 대한 최소한의 실무 지식이 있다고 가정합니다. 그 문제에 대해서는 다음 자습서를 검토하십시오.

작업 환경 구성

실제 도커 기반 응용 프로그램은 일반적으로 여러 컨테이너로 구성됩니다. 수동으로 관리하면 매우 번거롭고 번거로울 수 있습니다. 그것이 docker-compose가 작동하는 곳입니다. 간단한 yaml구성 파일을 통해 여러 컨테이너를 관리하는 데 도움이 됩니다.

docker-compose를 설치하십시오.

curl -L https://github.com/docker/compose/releases/download/1.19.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

이 예제에 필요한 모든 파일을 보관할 폴더를 만든 다음 폴더에 만듭니다 cd. 이제부터는이 디렉토리가 작업 디렉토리이며 모든 명령이이 폴더 내에서 실행되고 모든 경로가 해당 디렉토리를 기준으로합니다. 이 폴더는 나중에로 참조 될 수 있습니다 WORKING_DIR.

mkdir ~/docker
cd ~/docker

이제 세 개의 폴더를 더 만듭니다.

mkdir php nginx app

php폴더는 사용자 정의 PHP 이미지를 빌드 할 위치이고, nginx폴더는 사용자 정의 nginx 이미지에 필요한 파일을 보유하며 app폴더는 샘플 응용 프로그램의 소스 코드와 구성을 넣을 위치입니다.

PHP 컨테이너 구성

이 예에서는 php-fpmNginx 웹 서버에 연결하는 데 사용 합니다. 우리는 공식적인 PHP 기본 이미지를 사용할 것입니다. 그러나 데이터베이스에 액세스 할 수 있도록 일부 확장을 설치하고 활성화해야합니다. php폴더 안에 이름이 지정된 파일을 만들고 Dockerfile다음 내용을 파일에 넣습니다.

FROM php:7.1-fpm-alpine3.4
RUN apk update --no-cache \
    && apk add --no-cache $PHPIZE_DEPS \
    && apk add --no-cache mysql-dev \
    && docker-php-ext-install pdo pdo_mysql

우리는 공식 PHP 이미지의 알파인 버전을 사용하고 있습니다. 알파인은 훨씬 작은 설치 공간을 제공하여 컨테이너를 대상으로하는 매우 작은 배포판입니다. 또한 docker-php-ext-install공식 PHP 이미지는이 명령을 사용하여 PHP 확장을 쉽게 설치하고 구성 할 수 있도록이 명령을 제공합니다.

자,하자가 (우리의 내부에서 다음을 실행하여이 도커 이미지를 구축 WORKING_DIR)

docker build -t vultr-php php/

docker-compose.yml파일

이미 언급했듯이 docker-compose간단한 구성 파일을 통해 여러 컨테이너를 관리 할 수 ​​있습니다. 이 구성 파일의 이름은 일반적으로 docker-compose.yml입니다. app폴더 안에이 파일을 작성하십시오 .

touch app/docker-compose.yml

이제이 파일에 다음 내용을 넣으십시오.

version: '2'
services:
  php:
    image: vultr-php
    volumes:
      - ./:/app
    working_dir: /app

이 구문을 설명하겠습니다. 먼저, 첫 번째 줄에 유의하십시오.

version: '2'

docker-compose.yml사용되는 구성 파일 의 버전을 지정합니다 . 다음 줄은 프로비저닝 할 컨테이너 또는 서비스를 지정합니다.

services:
  php:
    image: vultr-php
    volumes:
      - ./:/app
    working_dir: /app

모든 서비스에는 services블록 내부에 특정 키가 있습니다 . 여기에 지정된 이름은 나중에이 특정 컨테이너를 참조하는 데 사용됩니다. 또한 php구성 내에서 컨테이너를 실행하는 데 사용되는 이미지 (이것은 이전에 빌드 한 이미지)를 정의합니다. 볼륨 매핑도 정의합니다.

volumes:
  - ./:/app

이 알려줍니다 docker-compose(현재 디렉토리를 매핑 할 ./받는 사람) /app컨테이너 내부 디렉토리. 마지막 줄 /app은 컨테이너 내부 의 폴더를 작업 디렉토리로 설정합니다 . 이는 컨테이너 내의 모든 향후 명령이 기본적으로 실행되는 폴더임을 의미합니다.

이제 컨테이너를 오케스트레이션 할 수 있습니다.

cd ~/docker/app
docker-compose up -d

다음 명령을 실행하여 PHP 컨테이너가 실행되었는지 확인할 수 있습니다.

docker ps

컨테이너 내에서 명령을 실행하는 방법

여전히 app폴더 안에는 명령을 사용하여 정의 된 서비스 컨테이너 내에서 명령을 실행할 수 있습니다 docker-compose.

docker-compose exec [service] [command]

[service]자리는 서비스 키를 참조. 우리의 경우는이었다 php. 컨테이너 내에서 명령을 실행하여 PHP 버전을 확인하십시오.

docker-compose exec php php -v

다음과 같은 결과가 나타납니다.

PHP 7.1.14 (cli) (built: Feb  7 2018 00:40:45) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies

Nginx 컨테이너 구성

PHP 컨테이너와 마찬가지로 웹 서버에 대한 사용자 지정 이미지를 만들어야합니다. 그러나이 경우에는에 대한 구성 만 제공하면 virtual host됩니다. 당신이 우리의 내부에 있는지 확인 WORKING_DIR하고을 만들 Dockerfile내부 nginx폴더 :

cd ~/docker
touch nginx/Dockerfile

이제 다음 내용을 여기에 넣으십시오 Dockerfile.

FROM nginx:1.13.8-alpine
COPY ./default.conf /etc/nginx/conf.d/default.conf

알파인 기반의 기본 Nginx 이미지를 사용하고 있습니다. 이 Docker 파일에서 구성 파일을 응용 프로그램 설정으로 복사하기 만하면됩니다. 이 이미지를 빌드하기 전에 구성 파일을 작성하십시오.

touch nginx/default.conf

이제이 컨텐츠로 채우십시오.

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /app;
    index index.php;

    #server_name server_domain_or_IP;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

fastcgi_pass php:9000줄에서 우리는 PHP 컨테이너를 구성 파일 의 service블록 안에있는 이름으로 참조 docker-compose.yml합니다. 내부적 docker-compose으로 네트워크를 만들고 정의 된 각 서비스에 서비스 이름을 호스트 이름으로 할당합니다. 이제 Nginx 이미지를 만들 수 있습니다.

docker build -t vultr-nginx nginx/

업데이트 중 docker-compose.yml

이제 app/docker-compose.yml파일을 업데이트 하십시오.

version: '2'
services:
  php:
    image: vultr-php
    volumes:
      - ./:/app
    working_dir: /app
  web:
    image: vultr-nginx
    volumes:
      - ./:/app
    depends_on:
      - php
    ports:
      - 80:80

새로운 서비스 만 추가했습니다. 다음을 제외하고 구성은 거의 동일합니다.

depends_on:
  - php
ports:
  - 80:80

Nginx 컨테이너가 PHP 서비스를 완전히 초기화해야하는 경우 depends_on옵션 에서이 요구 사항을 강제 적용합니다 . ports구성 키는 여기에 우리가 포트 매핑, 컨테이너 포트에 호스트 포트 매핑 80포트에 호스트에를 80컨테이너한다.

이제 폴더 index.php안에 파일을 만들고 app다음을 넣습니다.

<?php phpinfo();

80방화벽을 통해 포트 에 액세스 할 수 있는지 확인하고 다음을 실행하십시오.

cd ~/docker/app
docker-compose up -d

다시 한 번 서비스가 작동 중인지 다시 확인하십시오.

docker ps

브라우저를 열고에 액세스하십시오 [vultr-instance-ip]. 다음을 실행하여 Vultr 인스턴스 IP 주소를 찾을 수 있습니다.

hostname -I

PHP 정보 페이지가 나타납니다.

MySQL 컨테이너 구성

공식 MySQL 이미지를 사용하면 간단한 환경 변수를 통해 컨테이너를 구성 할 수 있습니다. 이것은 environment서비스 블록 정의 내부의 옵션 으로 수행 할 수 있습니다 . ~/docker/app/docker-compose.yml파일을 다음으로 업데이트하십시오 .

version: '2'
services:
  php:
    image: vultr-php
    volumes:
      - ./:/app
    working_dir: /app
  web:
    image: vultr-nginx
    volumes:
      - ./:/app
    depends_on:
      - php
    ports:
      - 80:80
  mysql:
    image: mysql:5.7.21
    volumes:
      - ./:/app
      - dbdata:/var/lib/mysql
    environment:
      - MYSQL_DATABASE=world
      - MYSQL_ROOT_PASSWORD=root
    working_dir: /app
volumes:
  dbdata:

이제 데이터베이스에 대한 새로운 서비스를 정의했습니다. 줄을 확인하십시오 dbdata:/var/lib/mysql. 이렇게하면 컨테이너의 경로 /var/lib/mysql가 Docker가 관리하는 영구 볼륨 에 마운트되며 컨테이너를 제거한 후에 데이터베이스 데이터가 유지됩니다. 이 볼륨은 파일 끝에서 볼 수 있듯이 최상위 블록에서 정의해야합니다.

새 구성을 조정하기 전에 샘플 MySQL 데이터베이스를 다운로드하십시오. 공식 MySQL의 문서는 몇 가지 예제 데이터베이스를 제공합니다. 우리는 잘 알려진 세계 데이터베이스를 사용할 것입니다. 이 데이터베이스는 국가 및 도시 목록을 제공합니다. 이 샘플을 다운로드하려면 앱 폴더 내에서 다음을 실행하십시오.

curl -L http://downloads.mysql.com/docs/world.sql.gz -o world.sql.gz
gunzip world.sql.gz

이제 컨테이너를 조정하십시오.

docker-compose up -d

이미 알고 있듯이이 docker-compose up명령은 아직 시작되지 않은 컨테이너 만 시작합니다. docker-compose.yml파일과 현재 실행중인 컨테이너 구성의 차이점을 확인합니다 .

한 번 더, MySQL 컨테이너가 시작되었는지 확인하십시오.

docker ps

이제 세계 데이터베이스를 채 웁니다.

docker-compose exec -T mysql mysql -uroot -proot world < world.sql

데이터베이스에서 직접 데이터를 선택하여 데이터베이스가 채워 졌는지 확인할 수 있습니다. 먼저 컨테이너 내부의 MySQL 프롬프트에 액세스하십시오.

docker-compose exec mysql mysql -uroot -proot world

MySQL 프롬프트에서 다음을 실행하십시오.

select * from city limit 10;

도시 목록이 나타납니다. 이제 MySQL 프롬프트를 종료하십시오.

mysql> exit

응용 프로그램 구축

필요한 모든 컨테이너가 작동하고 실행되었으므로 샘플 애플리케이션에 집중할 수 있습니다. app/index.php파일을 다음으로 업데이트하십시오 .

<?php

$pdo = new PDO('mysql:host=mysql;dbname=world;charset=utf8', 'root', 'root');

$stmt = $pdo->prepare("
    select city.Name, city.District, country.Name as Country, city.Population
    from city
    left join country on city.CountryCode = country.Code
    order by Population desc
    limit 10
");
$stmt->execute();
$cities = $stmt->fetchAll(PDO::FETCH_ASSOC);

?>

<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Vultr Rocks!</title>
</head>
<body>
    <h2>Most Populous Cities In The World</h2>
    <table>
    <thead>
        <tr>
            <th>Name</th>
            <th>Country</th>
            <th>District</th>
            <th>Population</th>
        </tr>
    </thead>
    <tbody>
        <?php foreach($cities as $city): ?>
            <tr>
                <td><?=$city['Name']?></td>
                <td><?=$city['Country']?></td>
                <td><?=$city['District']?></td>
                <td><?=number_format($city['Population'], 0)?></td>
            </tr>
        <?php endforeach ?>
    </tbody>
    </table>
</body>
</html>

[vultr-instance-ip]웹 브라우저에서 액세스 하면 세계에서 가장 인구가 많은 도시 목록이 표시됩니다. 축하합니다. docker를 사용하여 완전히 작동하는 PHP 응용 프로그램을 배포했습니다.

결론

이 튜토리얼에서는 완전히 작동하는 PHP 응용 프로그램을 구성하는 방법을 단계별로 설명했습니다. 우리는 PHP와 Nginx를위한 커스텀 이미지를 만들고 컨테이너를 조정하기 위해 docker-compose를 구성했습니다. 매우 기본적이고 단순하지만이 설정은 실제 시나리오를 반영합니다.

이 가이드에서는 이미지를 로컬에 구축하고 태그를 지정했습니다. 보다 유연한 설정을 위해 이러한 이미지를 도커 레지스트리 로 푸시 할 수 있습니다 . 공식 도커 레지스트리로 푸시 하거나 자체 도커 레지스트리를 설정할 수도 있습니다. 어쨌든 한 호스트에서 이미지를 빌드하고 다른 호스트에서 이미지를 사용할 수 있습니다.

보다 자세한 사용법은 공식 문서를docker-compose 참조하십시오 .

응용 프로그램 요구 사항과 사용하는 PHP 프레임 워크에 따라 더 많은 확장을 추가 할 수 있습니다. Dockerfile사용자 정의 PHP 이미지를 빌드 하는 데 사용되는 것을 수정하여 쉽게 수행 할 수 있습니다 . 그러나 일부 확장은 컨테이너에 추가 종속성을 설치해야합니다. 각 확장의 기본 요구 사항을 검토하려면 PHP 공식 문서 에서 확장 목록을 참조해야 합니다.



Leave a Comment

NTLite를 사용하여 업데이트로 Windows 사용자 지정 ISO를 만드는 방법

NTLite를 사용하여 업데이트로 Windows 사용자 지정 ISO를 만드는 방법

NTLite를 사용하여 Vultr 시스템과 호환되는 Windows 사용자 지정 ISO를 만드는 방법을 단계별로 설명합니다. 최신 드라이버와 업데이트 통합을 포함한 완벽 가이드.

Vultr에서 BGP 구성

Vultr에서 BGP 구성

Vultr BGP 설정을 위한 단계별 튜토리얼. ASN 할당부터 IP 라우팅 구성, BIRD 데몬 설정, FreeBSD 특이사항 및 실전 문제 해결 팁 7가지 포함한 최종 가이드

WsgiDAV를 사용하여 Debian 10에 WebDAV 배포

WsgiDAV를 사용하여 Debian 10에 WebDAV 배포

WebDAV (Web Distributed Authoring and Versioning)를 이용한 원격 파일 작성을 위한 프레임워크로, WsgiDAV 설치 및 구성 방법을 안내합니다.

데비안 7에 Mailcow 설치

데비안 7에 Mailcow 설치

Mailcow는 DoveCot, Postfix 및 기타 여러 오픈 소스 패키지를 기반으로 하는 경량 메일 서버입니다. 데비안에서 Mailcow 설치 방법을 안내합니다.

AI가 랜섬웨어 공격의 증가와 싸울 수 있습니까?

AI가 랜섬웨어 공격의 증가와 싸울 수 있습니까?

랜섬웨어 공격이 증가하고 있지만 AI가 최신 컴퓨터 바이러스를 처리하는 데 도움이 될 수 있습니까? AI가 답인가? AI boone 또는 bane인지 여기에서 읽으십시오.

ReactOS: 이것이 Windows의 미래입니까?

ReactOS: 이것이 Windows의 미래입니까?

오픈 소스이자 무료 운영 체제인 ReactOS가 최신 버전과 함께 제공됩니다. 현대 Windows 사용자의 요구 사항을 충족하고 Microsoft를 무너뜨릴 수 있습니까? 이 구식이지만 더 새로운 OS 환경에 대해 자세히 알아보겠습니다.

WhatsApp 데스크톱 앱 24*7을 통해 연결 유지

WhatsApp 데스크톱 앱 24*7을 통해 연결 유지

Whatsapp은 마침내 Mac 및 Windows 사용자용 데스크톱 앱을 출시했습니다. 이제 Windows 또는 Mac에서 Whatsapp에 쉽게 액세스할 수 있습니다. Windows 8 이상 및 Mac OS 10.9 이상에서 사용 가능

AI는 어떻게 프로세스 자동화를 다음 단계로 끌어올릴 수 있습니까?

AI는 어떻게 프로세스 자동화를 다음 단계로 끌어올릴 수 있습니까?

인공 지능이 소규모 회사에서 어떻게 인기를 얻고 있으며 어떻게 인공 지능이 성장할 가능성을 높이고 경쟁자가 우위를 점할 수 있는지 알아보려면 이 기사를 읽으십시오.

macOS Catalina 10.15.4 추가 업데이트로 인해 해결보다 더 많은 문제가 발생함

macOS Catalina 10.15.4 추가 업데이트로 인해 해결보다 더 많은 문제가 발생함

최근 Apple은 문제를 해결하기 위해 macOS Catalina 10.15.4 추가 업데이트를 출시했지만 이 업데이트로 인해 Mac 컴퓨터의 브릭킹으로 이어지는 더 많은 문제가 발생하는 것 같습니다. 자세히 알아보려면 이 기사를 읽어보세요.

빅데이터의 13가지 상용 데이터 추출 도구

빅데이터의 13가지 상용 데이터 추출 도구

빅데이터의 13가지 상용 데이터 추출 도구