Laravel & PHP 도커화
1. Target 설정
애플리케이션 컨테이너 : PHP 인터프리터, Nginx 웹 서버, MySql 데이터베이스
유틸리티 컨테이너 :
Composer : npm 유사, 써드파티 패키지를 설치하는 관리자, Laravel 설치
Laravel Artisan : 데이터베이스 마이그레이션 등
npm : Laravel의 뷰에서 일부 자바스크립트 코드가 필요한 경우
2. Nginx
- nginx 포트 80 노출이 기본값
역할 : 요청을 받고 그 요청을 PHP 컨테이너로 송신하는 역할
공식 이미지 작업 방법 : ./nginx/nginx.conf:/etc/nginx.conf:ro
3. PHP
- PHP 공식 + Laravel
언어 버젼 : 7.4-fpm-alpine ~ nginx 구성을 위해선 fpm 이미지가 필요하다.
- 부가 종속성 도구 : docker-php-ext-install ~ pdo, pdo install이 필요
- 작업 디렉토리 : /var/www/html ~ 웹 서버의 표준 폴더
-> Laravel php 어플리케이션을 보관하는 컨테이너 내부의 폴더
-> 최종 어플리케이션 보관 폴더
-> 부가 종속성 설치
- CMD나 엔트리포인트를 커스텀 이미지에 추가하지 않으면 베이스 이미지의 해당 명령을 사용한다.
- 도커파일을 찾을 수 있는 경로를 context에 입력
- php 인터프리터가 소스코드에 접근할 수 있도록 연결 : 바인드 마운트
+ delegated 옵션 : 컨테이너가 데이터를 기록해야 할 때 배치 단위로 통신한다. ~ 안정성은 떨어지지만, 속도가 향상된다.
~ php 컨테이너에서 ./html에 접근할 필요가 많지 않기 때문에 안정성보다는 속도, 그리고 데이터 수정에 대한 결과가 바로 나타날 필요가 없어서 사용한다.
통신 포트를 고려할 때, 로컬 호스트를 통한 통신인지 컨테이너 간 통신인지 확실하게 구분해야 한다.
4. Mysql 컨테이너
- 환경변수 선언과 할당을 통한 데이터베이스 사용자 설정
5. Composer ~ Laravel
- composer 베이스 이미지 활용
https://laraveldaily.com/post/composer-ignore-platform-reqs
Composer ignore-platform-reqs: When You Need That Flag?
Sometimes when using composer install or composer update commands you might install packages that don't fulfill system requirements, something like "your php version (8.1.2) does not satisfy that requirement". To ignore these requirements you can use the f
laraveldaily.com
엔트리포인트를 설정하기 위해 커스텀을 빌드해서 사용한다.
- 유틸리티 컨테이너는 개별 실행이 일반적이다
docker-compose run --rm composer create-project --prefer-dist laravel/laravel .
6. 일부 도커 컴포즈 서비스만 구동하기
Laravel의 env ~ 데이터베이스 연결설정
- php laravel 애플리케이션 내부에서 컨테이너로 전송 ~ 도커는 컨테이너 이름을 IP주소로 변환할 수 있다. 동일한 네트워크에서 실행되고 있으므로
- 메인 엔트리포인트인 서버 서비스에 먼저 요청이 도달하고 php 요청만 인터프리터로 전달된다. php 인터프리터만 소스 코드를 알고 있기 때문에 php 파일 또한 서버 서비스에도 노출이 되어야한다. ~ 부가 볼륨을 추가해야한다.
./src:/var/www/html : 웹 서버 폴더에서 콘텐츠를 제공하고, 파일을 찾기 때문에
도커 컴포즈에서 일부 서비스만 실행하기 : 타겟 설정 ~ docker-compose up SERVICE NAME
+ server에 종속성을 추가해 server 서비스만 실행해도 인터프리터와 데이터베이스가 전부 실행되도록 설정
~ depend_on
+ 도커 컴포즈가 도커파일을 재평가해 필요한 경우 이미지를 리빌드하게 하기 : --build
7. 유틸리티 컨테이너를 통한 부가도구 설치
1) artisan
- php로 빌드된 Laravel 명령이기 때문에 php와 빌드 설정이 동일하다.
- 소스 코드를 바인드 마운트해 노출시켜 애플리케이션과 연결
- 기존 커스텀 php 이미지에는 엔트리포인트가 없다. ~ nginx에 의해 개별 파일을 처리(funnel)하는 데 사용된다.
= nginx를 위한 유틸리티 컨테이너처럼 사용된다.
엔트리포인트 추가하기 : yaml에서 entrypoint ~ 서버 서비스에서는 엔트리포인트가 필요하지 않기 때문에 artisan에서만 별도로 추가한다.
2) npm
working_dir : 작업 폴더 설정
entrypoint : ["npm"]
volumes: artisan 동일논리
3) 실행
- artisan migrate : artisan 명령 중 하나, 데이터베이스에 데이터를 기록하고 설정이 잘 작동하는 지 확인
8. 도커파일이 있는 도커 컴포즈, 도커파일이 없는 도커 컴포즈
컴포즈 방식은 도커파일을 만드는 방식과 만들지 않는 방식이 있고, 선택할 수 있다.
도커파일을 만드는 방식이 권장 : 의도가 명확하고, yaml에서는 COPY나 RUN을 사용할 수 없기 때문에
9. 바인드마운트와 COPY
ngint.conf 파일이 복사된 후에 컨테이너에서 이름 바꾸기
이동 명령 mv
이후 복사된 nginx.conf를 default.conf로 변경
작업 디렉토리 변경
copy로 src 파일을 이미지에 복사
~ 스냅샷을 통해 소스 코드 변경을 보장하기 위함 : 배포 시 소스 코드의 반영 ~ 바인드마운트는 할 수 없다.
chown 명령 ~ change ownership : 폴더 소유권을 변경하고 읽기/쓰기 권한을 제어
www-data : php 기본 사용자 ~ 쓰기 권한이 없음
바인드 마운트를 통해 개발 중의 코드 변경을, COPY를 통해 스냅샷 버전 관리로 소스 코드 변경사항을 관리할 수 있다.
전체 실행
- 컴포즈 빌드
- 컴포저 실행하여 laravel 설치
- 데이터베이스 연결
- 도커 컴포즈 실행
- 유틸리티 컨테이너 실행
'개발공부 > Docker & Kubernetes 실전 가이드 강의' 카테고리의 다른 글
Udemy : Docker & Kubernetes 실전 가이드 (9) - 1 (0) | 2023.04.15 |
---|---|
Udemy : Docker & Kubernetes 실전 가이드 (7) (0) | 2023.04.12 |
Udemy : Docker & Kubernetes 실전 가이드 (6) (0) | 2023.04.11 |
Udemy : Docker & Kubernetes 실전 가이드 (5) (0) | 2023.04.10 |
Udemy : Docker & Kubernetes 실전 가이드 (4) (0) | 2023.04.10 |