분류 php

PHP 앱용 드롭 인 Docker 스택

컨텐츠 정보

  • 조회 590 (작성일 )

본문

오랫동안 MAMP Pro를 사용하여 로컬 개발 환경을 관리했습니다. MAMP 팀이 예외적인 설치 작업을 수행했지만 로컬에 설치된 PHP 버전으로 모든 것을 계속 실행하는 것은 매우 번거로웠습니다.


그런 다음 첫 번째 Laravel 프로젝트와 함께 Homestead가 왔지만 실제로 익숙해지지 않았습니다.


마지막으로 약 1 년 전에 Docker를 처음 사용해 보았습니다. 직장에서 더 큰 프로젝트에 사용하기 시작했습니다. 지난 몇 달 동안 저는 모든 개인 프로젝트에 대해 견고한 Docker 설정을 점진적으로 구현했습니다. 이 스택은 매우 견고하고-가장 중요한-아주 작은 구성만으로도 사용하기 쉽다고 생각하므로 개발 프로세스의 속도를 빠르게 해주기 때문에 여러분과 공유하고 싶습니다.


Docker를 사용해야 하는 이유는 무엇입니까? 


MAMP 앱은 꽤 잘 작동했습니다. 그러나 한 가지 중요한 결함이 있습니다. 모든 앱이 동일한 PHP 구성을 공유한다는 것입니다. 그리고 애플리케이션에서 사용하는 경우 동일한 데이터베이스 서버 및 캐시 서비스 (예 : Redis).


Docker는 애플리케이션만 실행되고 액세스 권한이 있는 각 애플리케이션에 대해 격리 된 컨테이너를 만듭니다. 이로 인해 더 많은 보안이 판매 될뿐만 아니라 (개발에만 중요하지는 않더라도) 각 앱에 대해 고정 된 환경이 제공됩니다. 즉, 다른 앱을 처리하거나 구성을 전환 할 필요 없이 PHP, 데이터베이스 및 웹 서버를 앱 요구 사항에 완벽하게 구성 할 수 있습니다.


드롭 인 Docker 스택 


내가 작업하는 대부분의 프로젝트는 일반 PHP, 더 큰 Laravel 스택 또는 Wordpress 또는 Drupal과 같은 PHP 기반 CMS로 개발되었으므로 한 번의 조정만으로 구성한 작은 Docker 스택을 한 앱에서 다른 앱으로 쉽게 복사 할 수 있습니다. 더 나은-전혀 조정이 없습니다.


Github에서 이 Docker 스택의 모든 파일을 찾을 수 있습니다.


시작하기 전에 컴퓨터에 Docker를 설치해야 합니다.


모놀리식 아키텍처를 통한 마이크로 서비스 


Docker 기반 애플리케이션을 개발하고 배포하는 데는 두 가지 접근 방식이 있습니다. 사용 된 모든 서비스와 구성을 하나의 컨테이너에 넣거나 설정을 서로 통신하는 여러 Docker 컨테이너로 분할합니다 (예 : 마이크로 서비스 아키텍처처럼).


개인적으로 모든 서비스를 별도의 구성으로 단일 컨테이너에 포함하는 것을 선호합니다. 따라서 PHP 기본 이미지를 사용하고 MySQL, nginx 및 Redis를 설치하는 대신 각 서비스에 대해 서비스 별 이미지를 사용하고 있습니다. 세 가지 큰 장점 :


  • Maintenance is easier. 서비스를 수동으로 설치하면 단일 서비스가 업데이트 되거나 구성이 변경되면 기본 이미지가 업데이트 되어야 한다는 문제가 항상 발생합니다.
  • Easily swap services. 앱의 아키텍처가 변경되면 Dockerfile을 다시 방문하고 설치가 계속 작동하는지 확인하는 대신 docker-compose.yml 파일의 일부 줄을 교체하여 서비스를 쉽게 교체 할 수 있습니다.
  • Last but not least: security. 모든 서비스가 다른 모든 서비스의 모든 것에 액세스 할 수 있는 모든 것을 실행하는 하나의 시스템을 갖는 것은 아끼지 않습니다. 서비스가 포트를 통해서만 서로 통신 할 수 있다면 아마도 수백 개의 가능한 취약점을 차단했을 것입니다.

보안이 개발에 그다지 중요하지 않더라도 계속 주시해야 합니다. 깨끗한 설정으로 시작하면 프로덕션에서 Docker를 사용하는 프로세스가 훨씬 쉬워집니다.


Bitnami Docker 이미지 


스택은 컨테이너화 된 배포 및 호스팅을 위한 주요 업체 중 하나인 Bitnami에서 제공하는 Docker 이미지를 사용합니다. 몇 가지 이유로 Bitnami 이미지를 사용하기로 결정했습니다.


  • Bitnami는 PHP, MySQL / MariaDB, Redis, Memcached, MongoDB, Node.js 등에 대한 수십 개의 이미지를 제공합니다.
  • 각 서비스의 모든 이미지는 동일한 회사에서 개발되어 모든 이미지가 동일한 기반과 구조를 공유하므로 구성이 더 쉽습니다.
  • 제 생각에 이미지는 작은 이미지 크기와 풍부한 기능 세트 사이의 완벽한 균형을 제공합니다.
  • Bitnami 이미지는 Minideb라는 배포판 위에 빌드됩니다. Debian 기반이지만 크기가 작고 Docker 요구 사항과 일치하도록 수정되었습니다.
  • 단일 개발자가 개발 한 이미지는 현재 또는 나중에 폐기되거나 정기적으로 업데이트 되지 않을 가능성이 높기 때문에 사용하지 않습니다.
  • 대조적으로 Bitnami 이미지는 서비스의 새 버전이 나올 때마다 자동으로 업데이트 됩니다.

Teaser Image 


스택에 대한 세부 정보 


자, 요점에 도달합시다. 스택은 구성 파일 2 개 중 4 개 파일로 구성되며 1 개는 may 프로젝트에서 찾을 수 있는 .env 파일입니다.


디렉토리 구조 


/
├─ docker
│ ├─ php.ini
│ └─ nginx.conf
├─ // Your other app files
├─ .env
└─ docker-compose.yml


내 기본 설정은 PHP, MySQL 호환 데이터베이스 서버, nginx 및 Redis로 구성됩니다. 모든 서비스는 docker-compose.yml 파일에 정의되어 있습니다.


docker-compose의 일부 


# --- PHP 7.2
php:
  container_name: "project-php"
  image: bitnami/php-fpm:7.2
  volumes:
    - .:/app
    - ./docker/php.ini:/opt/bitnami/php/etc/conf.d/php.ini:ro

# --- nginx 1.14
nginx:
  container_name: "project-nginx"
  image: bitnami/nginx:1.14
  ports:
    - "127.0.0.1:80:8085"
  depends_on:
    - php
  volumes:
    - .:/app
    - ./docker/nginx.conf:/opt/bitnami/nginx/conf/vhosts/site.conf:ro



이것은 PHP 및 nginx 컨테이너의 정의입니다. 보시다시피 PHP 7.2로 실행됩니다. 이것이 하는 유일한 일은 / app 디렉터리 (모든 Bitnami 컨테이너의 기본 디렉터리)에서 프로젝트를 사용할 수 있도록 하고 사용자 지정 php.ini를 적용하는 것입니다.


기본 README 파일에서 각 서비스의 정의에 대한 세부 정보를 찾을 수 있습니다.


설정 구성 


대부분의 경우 스택 및 암호에 대한 변수 세부 정보가 포함되어 있으므로 .env 파일 만 변경하면 됩니다. 메인 스택은 모든 일반 PHP 프로젝트에서 작동하지만 각 시스템은 웹 서버 구성에 대한 요구 사항이 다를 수 있으므로 nginx.conf 파일을 변경하여 Laravel 또는 CMS에서 쉽게 작동하도록 만들 수 있습니다.


설치 및 사용 


  • 주 파일 (/ public 및 README.md를 제외한 모든 파일)을 프로젝트에 복사합니다.
  • .env.example 파일의 복사본을 만들고 이름을 .env로 지정하거나 필요한 값을 기존 .env 파일에 복사합니다. Laravel 사용자는 아무것도 복사 할 필요가 없습니다.
  • 현재 구성이 프로젝트 설정과 일치하는지 확인하십시오. Wordpress 또는 Drupal과 같은 CMS에는 추가 구성이 필요합니다.
  • docker-compose.yml 파일에서 프로젝트를 자신의 프로젝트 이름으로 바꿉니다.
  • docker-compose up -d 실행

그러면 Docker는 모든 이미지를 다운로드하고 시작합니다. 기본적으로 호스트 컴퓨터의 포트 80은 nginx에 바인딩 되어 있으므로 브라우저에서 http : // localhost를 열어 앱에 액세스 할 수 있습니다.


마지막 생각들 


저는 지금 여러 프로젝트에서 이 작은 스택을 사용했습니다. 또한 내가 만들고 있는 북마크 관리자인 Linkace를 지원합니다. 그것은 나에게 꽤 잘 작동하지만 당신이 자신의 선호 사항이 있거나 당신의 앱에서 작동하지 않는지 완전히 이해합니다. Github 리포지토리에 의견을 남겨주세요.