분류 php

로컬 라라벨 개발을 위한 Docker의 아름다움

컨텐츠 정보

  • 조회 599 (작성일 )

본문

tl;dr


빠른 길을 가고 아래의 자세한 튜토리얼을 건너 뛰고 싶습니까? 

OS용 Docker를 설치 하고 이 저장소를 복제하고 Laravel 앱 파일을 src 디렉토리에 추가하고 방금 복제 한 루트 프로젝트 디렉토리에서 실행하십시오.


docker-compose build && docker-compose up -d. 


https://dev.to/aschmelyun/the-beauty-of-docker-for-local-laravel-development-13 


간단한 소개 


시작하기 전에 이 기사는 Docker에 대한 본격적인 자습서가 아니거나 도구 세트의 복잡성에 대한 설명이 아님을 알아야 합니다. LAMP 스택을 컴퓨터에 직접 설치하는 대신 Docker 및 docker-compose를 사용하여 로컬 개발 환경을 빠르게 구성 할 수 있는 간소화 된 연습입니다. 여기에는 몇 가지 주의 사항이 있지만 아래 방법은 Laravel 앱을 개발할 때 가장 효과적인 방법입니다.


Docker가 무엇인지 모르는 사람들을 위해 간단한 개요를 살펴 보겠습니다. 

opensource.com에 따르면 :


Docker는 컨테이너를 사용하여 응용 프로그램을 보다 쉽게 ​​생성, 배포 및 실행할 수 있도록 설계된 도구입니다. 

컨테이너를 사용하면 개발자는 라이브러리 및 기타 종속성과 같은 필요한 모든 부분이 포함 된 응용 프로그램을 패키지로 만들어 하나의 패키지로 제공 할 수 있습니다. 


Docker를 물이 빠진 VM으로 생각할 수 있습니다.


이것이 도움이 되거나 유용한 이유는 무엇입니까? 다른 버전의 Linux, PHP 또는 다른 웹 소프트웨어를 실행하는 여러 프로덕션 서버가 있는 경우 해당 변수를 컨테이너에 복제 할 수 있으며 프로덕션 머신에서 응용 프로그램이 의도 한대로 정확하게 실행되도록 보장 할 수 있습니다.


이 게시물의 분위기에 더 잘 맞아 로컬 컴퓨터의 여러 버전에 걸쳐 여러 개의 Laravel 프로젝트가 있는 경우 PHP 버전 스위처와 같은 것을 구현하고 실제 컴퓨터의 구성을 수정하지 않고도 각 앱에 대해 특정 Docker 구성을 가질 수 있습니다 . 

각 컨테이너가 다른 컨테이너와 격리 된 상태에서 동시에 두 프로젝트에 액세스 할 수도 있습니다.


Docker 설치 


이 기사 기간 동안 스크린 샷과 참조는 MacOS 사용자와 관련이 있습니다. 

그러나 설치 및 사용 지침은 Windows에서 매우 유사해야 합니다 (거의 정확하지 않은 경우).


먼저 설치 관리자 (https://docs.docker.com/docker-for-mac/install/)를 가져옵니다.


일반적인 애플리케이션 설치 프로세스를 실행하여 앱이 완료된 후 앱을 엽니 다. 처음 열 때 시스템 비밀번호를 통해 Docker에 권한을 부여하라는 메시지가 표시되면 상단 상태 표시 줄에 작은 고래 아이콘이 표시됩니다.


프로젝트 구조 


다음은 Laravel + Docker 프로젝트에 사용한 구조입니다. 이 기사의 나머지 부분에서는 프로젝트가 동일한 레이아웃으로 설정되었다고 가정하지만 이를 명시적으로 따를 필요는 없습니다.

my-project.com/
├── nginx/
│   └── default.conf
├── src/
│   └── (Laravel app files)
├── docker-compose.yml
└── Dockerfile

다음 두 부분에서는 각 파일의 기능을 살펴 보겠습니다. 그러나 지금은 위의 레이아웃을 사용하여 빈 자리 표시 자로 만듭니다. 또한 src/디렉토리에 전체 라라벨 앱 파일을 추가 (또는 생성)하십시오.


스택 만들기 


Docker를 사용할 때 가장 좋은 방법은 각 컨테이너가 단일 서비스를 제공해야 한다는 것입니다. 

일반적인 LEMP 스택을 생성하고 있으므로 웹 서버 (Nginx), PHP 및 MySQL에 필요합니다. 

이론적으로 우리는 이러한 각 서비스에 대해 개별 컨테이너를 만든 다음 이를 서로 연결하려고 시도 할 수 있지만 Docker에는 이를 위해 docker-compose라는 아름다운 기본 제공 도구가 있습니다.


우리가 하는 일은 사용될 서비스를 정의하고, 런타임시 Docker는 각각을 컨테이너로 프로비저닝하고 가상 네트워크에서 모두 랩핑합니다. 즉, 모든 컨테이너에서 각 서비스에 액세스 할 수 있습니다.


시작하려면 docker-compose.yml 파일을 열고 맨 위에 다음을 추가하십시오.


docker-compose.yml screenshot beginning 


방금 추가 한 내용에 대한 간단한 설명 :


  • 버전 : 3, docker-compose 엔진의 최신 및 가장 권장되는 버전
  • 네트워크 : 우리는 하나의 네트워크 인 laravel을 사용하고 있으며 이름 외에 다른 옵션을 추가하지 않습니다.
  • 서비스 : 스택을 구성 할 이미지를 지정할 위치

Nginx 추가 


위의 docker-compose.yml 파일 맨 아래에 지정한 서비스 제목 바로 아래에 다음을 추가합니다.


docker-compose.yml screenshot of nginx service 


위의 작업은 Docker에게 nginx : stable-alpine 이미지 (여기에서 볼 수 있는 전체 소스)로 빌드 된 nginx라는 컨테이너를 원한다고 알려줍니다. 

우리는 가볍고 반응성이 높은 풋 프린트로 알파인 리눅스를 기본 OS로 사용하고 있습니다.


다음으로 컨테이너 nginx의 이름을 지정하고 로컬 컴퓨터에서 : 80 포트를 : 8080으로 노출합니다. 이 포트 번호는 결국 우리 사이트에 액세스하기 위해 사용하는 것이므로 원하는 비 예약 포트 번호로 조정할 수 있습니다.


웹 서버 볼륨의 경우 다음 두 가지를 추가합니다.


  • local/src 폴더는 컨테이너의 /var/www 경로에 바인딩 됩니다. 심볼릭 링크와 달리 /src에서 수정 한 내용은 /var/www의 서버에서 즉시 사용할 수 있습니다.
  • 우리가 만든 /nginx/default.conf 파일은 /etc/nginx/conf.d/default.conf 컨테이너 파일에 연결되어 있으며 로컬 컴퓨터에서 nginx 웹 서버를 수정하는 기능을 제공합니다.

이 제목 아래에 원하는 수의 디렉토리 또는 파일을 지정하여 로컬 시스템에서 nginx 컨테이너로 심볼릭 링크 할 수 있습니다.


depend_on 항목에 php와 mysql (다음에 생성 할 서비스)을 모두 추가함으로써 Docker에게 초기화시 php와 mysql 컨테이너가 nginx보다 먼저 실행되어야 한다고 알려줍니다. 또한 nginx 컨테이너 만 가동하려고 하면 해당 종속 컨테이너도 모두 부팅됩니다.


마지막으로,이 컨테이너는 docker-compose.yml 파일의 시작 부분에서 만든 라 라벨 네트워크 아래에 명시 적으로 지정되어 있습니다.


MySQL 추가 


docker-compose.yml 파일에 추가 할 다음 서비스는 MySQL입니다. 이것은 비교적 간단합니다.

docker-compose.yml screenshot adding the mysql service 


처음에는 이미지와 컨테이너 이름을 지정하고 컨테이너에서 MySQL의 안정성을 유지하는 데 도움이 된 기타 설정을 설정하고 있습니다.


기본 MySQL 포트 : 3306은 로컬 컴퓨터에 노출되는 포트이며 환경 객체를 사용하여 초기화 중에 사용 된 데이터베이스를 수정하기 위해 사용되는 몇 가지 변수를 설정할 수 있습니다. Laravel 앱용 Docker를 구성하고 있으므로 일반적인 Laravel .env 파일에 있는 기본 데이터베이스 이름 / 사용자 이름 / 암호를 사용하고 있습니다.


nginx와 마찬가지로 이 서비스를 라 라벨 네트워크에 연결합니다. ✨ 간단합니다!


PHP 추가 


Nginx 및 MySQL과 달리, PHP 컨테이너를 추가하는 것은 조금 더 복잡한 경로를 취할 것입니다. 

이전 두 서비스를 통해 컨테이너를 빌드하기 위해 이미지를 직접 참조 할 수 있었지만, Laravel이 요구하는 종속성 때문에 실제로 로컬 Dockerfile에서 자체 이미지를 빌드 해야 합니다.


그 부분에 도달하기 전에 다음 (및 마지막) 서비스로 다음을 docker-compose.yml 파일에 추가하십시오.

docker-compose.yml screenshot of adding the php service 


이미 차이를 발견 할 수 있습니다. 이전에 사용한 이미지 제목을 빌드 제목으로 바꿉니다. 그 아래에 컨텍스트를 현재 프로젝트 디렉토리로 지정하고 dockerfile을 Dockerfile (이미 앞에서 생성)으로 지정합니다.


nginx 컨테이너와 마찬가지로 루트 디렉토리에 동일한 볼륨을 지정한 다음 컨테이너에 포트 : 9000을 노출하고 네트워크를 라라 벨로 설정합니다.


이제 해당 서비스를 추가 했으므로 Dockerfile에 다음을 추가해야 합니다.


Dockerfile screenshot for building the PHP image 


우리가 여기서 하는 일은 :

  • 7.2fpm-alpine PHP 이미지에서 PHP 컨테이너를 빌드 하도록 지정합니다.
  • Laravel의 ORM이 데이터베이스 방법과 함께 사용하는 pdo 및 pdo_mysql PHP 확장 설치

docker-php-ext-install 명령은 Docker에 내장되어 있으며 문서화 되어 있지 않습니다. PHP 확장을 통과하면 새로 작성된 컨테이너 내의 설치 및 구성을 처리합니다.


nginx 구성 


우리가 만든 /nginx/default.conf 파일을 기억하십니까? 그것을 열고 다음을 추가하십시오 :

Screenshot of the default nginx configuration 


대부분의 기본 라 라벨 앱과 함께 사용되는 상용구 nginx 구성이기 때문에 여기서는 논의 할 것이 많지 않습니다. 루트 경로는 Laravel 앱을 연결 한 / var / www nginx 디렉토리의 공용 폴더로 설정되었습니다.


도커 시작 


우리는 모든 개별 조각을 순서대로 갖추었으므로 이제 Docker 네트워크를 조립할 차례입니다! 터미널 창을 열고이 프로젝트의 루트 디렉토리로 이동하십시오. 

컨테이너 (php) 중 하나가 Dockerfile을 이미지로 사용하고 있기 때문에 이번 컨테이너를 처음으로 돌릴 때 가장 먼저 해야 할 일은 build 명령을 실행하여 이미지 데이터를 생성하는 것입니다.


docker-compose build 


완료하는 데 시간이 조금 걸리며 잠시 동안 아무 일도 일어나지 않는 것처럼 보일 수 있습니다. 1-2 분 정도 주면 터미널에서 메시지가 성공적으로 작성되고 태그 지정되었습니다. 그런 다음 다음을 사용하여 실제로 컨테이너 시작을 진행할 수 있습니다.


docker-compose up -d 


Docker는 라 라벨 네트워크를 만든 다음 docker-compose.yml 파일의 서비스 섹션에서 지정한 3 개의 컨테이너를 만듭니다. -d 플래그에 대해 궁금한 경우 분리 된 플래그이며 모든 명령이 처리 된 후 컨테이너를 계속 실행합니다. 그렇지 않으면 Docker는 초기화가 완료되는 즉시 중지합니다. 웹 서버에는 무의미합니다!


라라벨 설정 


앱에 처음 액세스하기 전에 Laravel .env 파일을 약간 조정해야 합니다. 특히 데이터베이스 연결 및 앱 도메인에 관한 것입니다. src 디렉토리에서 프로젝트의 .env 파일을 열고 다음 행을 수정하십시오.


  • DB_HOST = mysql-이 이름은 docker-compose.yml 파일에서 만든 MySQL 서비스의 이름이며 Docker 네트워크에서 다른 컨테이너의 서비스를 참조하는 데 사용됩니다.
  • APP_URL = http : // localhost : 8080-this 해결 가능한 주소를 가리키도록 nginx 컨테이너에 노출 된 포트 번호를 추가하십시오.


앱에 액세스 


위 단계의 모든 것이 성공적으로 시작되었다고 가정하면 이제 노출 된 포트가 있는 컨테이너를 방문하여 앱의 방문 페이지를 볼 수 있습니다!


브라우저에서 http : // localhost : 8080으로 이동하십시오. 여기서 8080은 docker-compose.yml 파일의 nginx 서비스에서 지정한 첫 번째 포트입니다.

Screenshot of a browser showing the Laravel landing screen 

? 붐! Docker 네트워크에서 Laravel 앱을 실행하고 있습니다!


물론 TablePlus와 같은 도구를 사용하여 MySQL 데이터베이스에 액세스하려는 경우 간단하게 연결할 수 있습니다. docker-compose.yml 파일의 MySQL 서비스에 노출 된 포트와 함께 127.0.0.1을 호스트로 사용하기 만하면 됩니다 (이 예제에서는 기본 3306으로 유지함). .


환경 변수에 사용자 이름과 비밀번호를 각각 MYSQL_USER 및 MYSQL_PASSWORD (홈스테드 및 비밀)로 지정했습니다.

Screenshot of TablePlus configuration 

참고 : 다른 프로젝트에 대해 여러 네트워크를 한 번에 실행하려는 경우 로컬 컴퓨터에 표시 할 다른 포트를 지정해야 합니다 (예 : 하나는 8080, 다른 하나는 8081). 그렇지 않으면 컨테이너 초기화 중에 포트에 이미 할당 된 오류 메시지가 표시됩니다.


명령 실행 


Laravel은 마이그레이션, 대기열 및 테스트와 같은 작업에 명령 줄을 상당히 자주 사용합니다. docker-compose의 exec 명령을 사용하면 Docker 네트워크에서 이를 쉽게 실행할 수 있습니다.


Docker는 시스템에 ssh하고 OS에서 직접 명령을 실행하는 VM 대신 명령을 컨테이너로 전달한 다음 해당 명령의 출력을 터미널로 다시 에코하는 것을 선호합니다. 예를 들어 터미널에서 프로젝트 루트의 다음 명령을 실행하여 Laravel과 함께 제공되는 기본 마이그레이션을 실행 해 보겠습니다.


docker-compose exec php php /var/www/artisan migrate 


이것을 조금 분해 해 봅시다 :

  • docker-compose exec는 Docker에게 컨테이너 네트워크에서 명령을 실행하고 싶다고 알려줍니다.
  • php 우리가 명령을 실행하려는 컨테이너 이름. PHP 명령을 실행할 예정이므로 PHP가 실행되는 컨테이너에 있어야 합니다.
  • php/var/www/artisan은 실행 중인 명령의 실제 이름을 마이그레이션 합니다. 우리는 ./src의 현지 볼륨을 통해 연결되고 표준 라라벨 마이그레이션을 실행하는 장인의 절대 경로를 사용하고 있습니다.

Screenshot of a terminal after running a docker-compose migrate command 


명령을 실행 한 후 마이그레이션 결과가 표시되고 데이터베이스에 두 개의 테이블이 채워집니다!


로컬 터미널에서 선택한 Docker 컨테이너로 여러 명령을 실행할 수 있습니다. 명령을 실행하려는 컨테이너에 설치되어 사용 가능한 서비스에 유의하십시오.


힌트 : 명령을 실행하기 위해 컨테이너에 직접 ssh하려는 경우 매우 간단한 해결 방법이 있습니다. 달리는 docker-compose exec {container_name}/bin/sh는 {container_name} 인수에 지정된 컨테이너에 대한 지속적인 연결을 엽니다.


선의 끝 


글쎄, 우리는 그것을 가지고 있다! Docker를 설치하고 단일 네트워크에 래핑 된 3 개의 컨테이너로 구성된 LEMP 스택을 생성하도록 Docker-compose 파일을 설정 및 구성했으며, 해당 네트워크에서 포트를 노출하여 앱과 데이터베이스에 액세스 할 수 있으며 CLI 명령을 실행할 수도 있습니다. docker-compose의 exec 메소드를 통해.


컨테이너와 네트워크를 중단하려면 프로젝트의 루트 폴더로 이동하여 실행하는 것만 큼 간단합니다. docker-compose down. 이렇게 하면 컨테이너와 컨테이너에 저장된 관련 비 볼륨 데이터가 모두 소멸되고 파괴됩니다.


Docker는 다른 Laravel 버전에 걸친 여러 프로젝트를 저글링 할 때 전 세계에 다양한 개발 가능성을 열어주었습니다. 7.1을 사용하여 PHP 컨테이너를 사용하여 Docker 네트워크에서 하나의 프로젝트를 쉽게 실행할 수 있으며 현재 프로젝트가 PHP 7.3에서 어떻게 수행되는지 확인하려면 Dockerfile에서 단일 문자를 변경하고 컨테이너를 다시 빌드 하는 것만 큼 간단합니다 도커 작성 네트워크를 다시 시작하십시오.


나는 그것을 거부하지 않을 것이며, 당신은 머신 하드웨어에서 직접 스택을 실행하는 것보다 더 나은 로컬 개발 성능을 얻지 못할 것이다. 그러나 다목적 성, 사용 편의성, 병렬 환경 및 사용자 정의에 대한 성능의 상충 관계는 저보다 훨씬 뛰어납니다.