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

Alpine Linux 3.9.0에서 Docker Swarm 생성

Alpine Linux 3.9.0에서 Docker Swarm 생성

소개이 안내서는 여러 개의 Alpine Linux 3.9.0 서버 및 Portainer를 사용하여 Docker 스웜을 생성 및 구성하는 방법을 보여줍니다. 그쪽으로 알아주십시오

RancherOS에 Rancher 서버 설치

RancherOS에 Rancher 서버 설치

RancherOS는 시스템 서비스를 실행하기 위해 시스템 Docker 데몬을 PID 0으로 실행하는 매우 가벼운 운영 체제 (약 60MB)입니다.

Ubuntu 18.04에 Docker CE 설치

Ubuntu 18.04에 Docker CE 설치

소개 Docker는 컨테이너로 실행되는 프로그램을 배포 할 수있는 응용 프로그램입니다. 인기있는 Go 프로그래밍 언어로 작성되었습니다.

Ubuntu 14.04에 Docker 설치

Ubuntu 14.04에 Docker 설치

다른 시스템을 사용하십니까? Docker는 컨테이너로 실행되는 프로그램을 배포 할 수있는 응용 프로그램입니다. 인기있는 Go 프로그램에서 작성되었습니다.

Docker를 사용하여 Node.js 애플리케이션 배포

Docker를 사용하여 Node.js 애플리케이션 배포

이 기사에서는 Docker 컨테이너 내에 Node 응용 프로그램을 배포하는 방법을 보여줍니다. 참고 :이 튜토리얼은 Docker가 설치되어 있고 읽은 것으로 가정합니다.

CentOS 7에 Harbor를 설치하는 방법

CentOS 7에 Harbor를 설치하는 방법

Harbor는 Docker 이미지를 저장하고 배포하는 오픈 소스 엔터프라이즈 급 레지스트리 서버입니다. 하버, 오픈 소스 Docker Distribution b 확장

Ubuntu 14.04에서 LXC 컨테이너를 안전하게 배포 및 관리

Ubuntu 14.04에서 LXC 컨테이너를 안전하게 배포 및 관리

LXC 컨테이너 (Linux 컨테이너)는 단일 호스트에서 여러 개의 격리 된 Linux 시스템을 실행하는 데 사용할 수있는 Linux의 운영 체제 기능입니다. 그

CentOS 7에서 Kubernetes 시작하기

CentOS 7에서 Kubernetes 시작하기

Kubernetes는 서버 클러스터 전체에서 컨테이너화 된 애플리케이션을 관리하기 위해 Google에서 개발 한 오픈 소스 플랫폼입니다. 그것은 10 년을 기반으로하고

우분투 16.04에 Rancher 설치

우분투 16.04에 Rancher 설치

다른 시스템을 사용하십니까? 소개 Rancher는 컨테이너를 실행하고 개인 컨테이너 서비스를 구축하기위한 오픈 소스 플랫폼입니다. 목장주 기지

CentOS 7에서 Kubeadm으로 Kubernetes 배포

CentOS 7에서 Kubeadm으로 Kubernetes 배포

개요이 기사는 Kubernetes 클러스터를 kubeadm과 함께 시작하고 실행하는 데 도움을주기 위해 작성되었습니다. 이 가이드는 두 대의 서버를 배포합니다.

CoreOS에 docker-compose 설치

CoreOS에 docker-compose 설치

이 기사에서는 CoreOS에 docker-compose를 설치하는 방법에 대해 설명합니다. CoreOS에서는 / usr / 폴더를 변경할 수 없으므로 표준 / usr / local / bin 경로를 사용할 수 없습니다.

CentOS 7에 Rancher 설치

CentOS 7에 Rancher 설치

다른 시스템을 사용하십니까? 소개 Rancher는 컨테이너를 실행하고 개인 컨테이너 서비스를 구축하기위한 오픈 소스 플랫폼입니다. 목장주 기지

CentOS 7에 Docker 설치

CentOS 7에 Docker 설치

다른 시스템을 사용하십니까? Docker는 가상 컨테이너 내에 소프트웨어를 배포 할 수있는 응용 프로그램입니다. Go 프로그램에서 작성되었습니다.

CentOS 7에서 Docker Swarm (CE)을 사용한 고정 세션

CentOS 7에서 Docker Swarm (CE)을 사용한 고정 세션

다른 시스템을 사용하십니까? Docker Swarm은 개별 서버를 컴퓨터 클러스터로 전환하여 확장 및 고 가용성을 용이하게합니다.

데비안 9의 Docker Swarm (CE)과의 끈적한 세션

데비안 9의 Docker Swarm (CE)과의 끈적한 세션

다른 시스템을 사용하십니까? Docker Swarm은 개별 서버를 컴퓨터 클러스터로 전환합니다. 스케일링, 고 가용성

Docker 사용 방법 : 첫 번째 Docker 컨테이너 만들기

Docker 사용 방법 : 첫 번째 Docker 컨테이너 만들기

이 튜토리얼은 Docker 시작의 기본 사항을 설명합니다. Docker가 이미 설치되어 있다고 가정합니다. 이 튜토리얼의 단계는

Docker를 사용한로드 밸런싱

Docker를 사용한로드 밸런싱

웹 응용 프로그램을 실행할 때 일반적으로 멀티 스레딩을 사용하도록 소프트웨어를 변환하지 않고도 리소스를 최대한 활용하려고합니다.

CoreOS에서 고유 한 Docker 레지스트리 설정

CoreOS에서 고유 한 Docker 레지스트리 설정

우리는 여러 시스템에서 애플리케이션 컨테이너를 생성, 관리 및 배포 할 수있는 플랫폼 인 Docker를 알고 있습니다. Docker Inc.는 서비스를 제공합니다

Docker를 사용하여 CentOS 7에서 SQL Server 2017 (MS-SQL) 시작

Docker를 사용하여 CentOS 7에서 SQL Server 2017 (MS-SQL) 시작

전제 조건 Docker 엔진 1.8 이상. 최소 4GB의 디스크 공간. 최소 4GB의 RAM. 1 단계. Docker 설치 SQL-Server를 설치하려면 Docker mus

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가지 상용 데이터 추출 도구

저널링 파일 시스템이란 무엇이며 어떻게 작동합니까?

저널링 파일 시스템이란 무엇이며 어떻게 작동합니까?

우리 컴퓨터는 모든 데이터를 저널링 파일 시스템이라고 하는 체계적인 방식으로 저장합니다. 검색을 누르는 즉시 컴퓨터에서 파일을 검색하고 표시할 수 있는 효율적인 방법입니다.https://wethegeek.com/?p=94116&preview=true

기술적 특이점: 인류 문명의 먼 미래?

기술적 특이점: 인류 문명의 먼 미래?

과학이 빠른 속도로 발전하고 우리의 많은 노력을 인수함에 따라 설명할 수 없는 특이점에 처할 위험도 높아집니다. 특이점이 우리에게 무엇을 의미할 수 있는지 읽어보십시오.

26가지 빅 데이터 분석 기법에 대한 통찰: 1부

26가지 빅 데이터 분석 기법에 대한 통찰: 1부

26가지 빅 데이터 분석 기법에 대한 통찰: 1부

2021년 의료 분야에서 인공 지능의 영향

2021년 의료 분야에서 인공 지능의 영향

의료 분야의 AI는 지난 수십 년 동안 큰 도약을 했습니다. 따라서 의료 분야에서 AI의 미래는 여전히 나날이 성장하고 있습니다.