[PHP] mac에서 docker로 개발환경 만들기(m1)

2024. 5. 28. 20:56Language/PHP

반응형

 

(본 포스팅은 docker가 미리 설치되어 있음을 가정합니다.)

 

회사의 윈도우 pc에서 xampp로 실행하는 프로젝트를 집에 있는 맥에서도 동일하게 구현하기 위해 docker를 설치했다.

mac에서도 xampp를 사용해서 개발환경을 구성할 수 있지만, 팀장님께서 docker를 추천해주셔서 xampp를 버리고 docker의 컨테이너 세계에 발을 들여보게 되었다.

 

1.  디렉토리 생성

프로젝트가 위치한 폴더에 index와 Dockerfile을 생성한다.

(프로젝트를 docker로 구성하고, 감을 다시 한번 익히기 위해 연습용 폴더를 만들었다.)

 

// 디렉토리 생성
mkdir docker
cd docker

// Dockerfile 생성
touch Dockerfile

 

가장 기본페이지가 될 index.php와 Dockerfile 외에 custom-apache.conf 파일과 vhost.conf 파일도 추가했다.

(pc와 프로젝트, php 버전에 따라 필요 구성이 달라질 수 있다.)

 

 

 

 

✔️ custom-apache.conf: Apache 웹 서버의 사용자 정의 설정.  PHP 설정, 디렉토리 권한, 모듈 로드 등을 구성할 수 있다.

✔️ vhost.conf:  Apache 가상 호스트 설정을 정의하는 파일.

 

 

2.  Dockerfile 작성

Dockerfile은 docker에서 이미지 빌드 과정을 자동화하는 역할을 수행한다. 

Dockerfile은 확장자가 없는 일반 텍스트 파일이며, 반드시 Dockerfile이라는 이름으로 지정해야 Docker가 인식할 수 있다.

 

💡 Dockerfile

# Use the official PHP image as the base image
FROM php:8.0-apache

# Set the working directory in the container
WORKDIR /var/www/html

# Install PHP extensions and dependencies
RUN apt-get update && \
    apt-get install -y \
        libzip-dev \
        zip && \
    docker-php-ext-install zip && \
    docker-php-ext-install pdo_mysql mysqli pdo

 # Copy the source code to the container
COPY ./ /var/www/html

COPY custom-apache.conf /etc/apache2/conf-available/custom-apache.conf

RUN a2enconf custom-apache

# Expose port 80
EXPOSE 80 

# Start the Apache server
CMD ["apache2-foreground"]

 

 

처음 빌드 했을  때 custom-apache.conf와 vhost의 경로가 제대로 매핑되지 않아 Dockerfile에서 COPY 명령어로 경로를 지정해주었다.

 

 

💡 vhost.conf 파일

<Directory />
  Options Indexes FollowSymLinks MultiViews
  AllowOverride All
  Require all granted
</Directory>
<VirtualHost *:80>
        ServerName test.localhost
        DocumentRoot "/var/www/html/"
</VirtualHost>

 

💡 custom-apache.conf 파일

ServerName test.localhost

 

3.  Docker 이미지 빌드

터미널에서 docker 명령어를 입력해서 이미지를 빌드한다.

// dorker 빌드 명령어
docker build -t test:dev . && docker run -it —rm —name tester -p 80:80 test:dev

 👉 vscode 터미널 열기 단축키 : Ctrl + J 

 

위 명령어의 의미는 다음과 같다.

1. docker build -t test:dev . : 현재 디렉토리의 Dockerfile을 사용하여 'test:dev' 태그를 가진 Docker 이미지를 빌드

 

2. docker run -it --rm --name tester -p 80:80 test:dev : 방금 빌드한 'test:dev' 이미지를 사용하여 'tester'라는 이름의 컨테이너를 실행한다.

- 컨테이너 프로세스가 종료되면 자동으로 컨테이너가 제거된다.

- 호스트의 80번 포트와 컨테이너의 80번 포트가 연결된다.

 

빌드가 완료된 이미지는 docker에 앱을 열면 아래와 같이 생성된 것을 확인할 수 있다.

 


그런데 왜 docker는 프로젝트들을 이미지라고 칭하는걸까..? 문득 궁금해져서 급 검색해보고 왔다.

 

 

Docker에서 생성된 프로젝트를 이미지라고 부르는 이유

  • 불변성(Immutable) :  Docker 이미지는 한번 생성되면 변경할 수 없다. 이미지는 읽기 전용이며, 변경 사항이 있으면 새로운 이미지 레이어를 생성한다. 이렇게 함으로써 애플리케이션의 일관성과 재현성을 보장할 수 있는 것.
  • 레이어 구조 : Docker 이미지는 레이어로 구성되어 있다. 베이스 이미지 위에 여러 레이어가 쌓이고, 각 레이어는 파일 시스템의 일부 변경 사항을 나타낸다. 이 레이어 구조 덕분에 공유 레이어를 재사용하여 이미지 크기를 줄일 수 있다.
  • 포터블(Portable) : Docker 이미지는 컨테이너 실행 환경을 완전히 캡슐화하고 있어 어디서나 동일한 방식으로 실행될 수 있다. 이미지 파일을 다른 머신으로 복사하거나 레지스트리에 푸시하여 배포할 수 있다.

 

 

4. 웹 브라우저에서 확인

💡 index.php

<?php
echo "Hello World!";
?>

 

index.php에 기본 코드를 넣어놓고, http://test.localhost/ 을 실행한다.

 

 

정상적으로 출력이 되는 모습을 확인할 수 있다.

 

5.  volumes 연결하기

사실 위 단계까지만 진행하면 개발 환경을 구성할 수는 있지만, 소스 코드 변경 시 컨테이너를 재빌드해야 하는 번거로움이 있다.

이를 해결하기 위해 호스트의 코드 디렉토리를 컨테이너에 마운트하여 코드 변경 시 자동으로 반영되도록 할 수 있다.

 

✔️ docker-compose.yml :  볼륨 마운트 설정뿐만 아니라 여러 개의 컨테이너를 정의하고 네트워크, 환경변수 등을 한 번에 관리할 수 있게 해주는 도구

 

💡 docker-compose.yml

version: "3.8"
services:
  web:
    container_name: test-web
    build:
      context: ./
      dockerfile: Dockerfile
    privileged: true
    ports:
      - "80:80"
    volumes:
      - ./:/var/www/html

 

추가한 docker-compose.yml 파일과 함께 다시 빌드를 하면 아래와 같이 수정한 내용이 바로 반영되는 것을 확인할 수 있다.

 

 

 

 

반응형

'Language > PHP' 카테고리의 다른 글

php SSL 적용 (http:// https://로 변경)  (0) 2024.05.06
top
bottom