간단한 PHP 도커화 환경 구축

로컬 개발을 위해 애플리케이션을 컨테이너화하는 것이 PHP와 관련하여 기능보다 부담으로 보일 수 있는 .NET 또는 Java와 같은 다른 에코시스템과 달리 이는 프로덕션 환경을 매우 밀접하게 미러링하는 반가운 보너스일 뿐만 아니라 필수적입니다.

일부 애플리케이션에는 로컬 시스템에 없는 PHP 확장이 필요하거나 애플리케이션 자체가 아닌 인프라의 일부로 간주되지만 문제를 일으킬 수 있는 프로덕션 서버에 설정된 일부 특정 php.ini 구성이 있을 수 있습니다. 불일치 때문에 (몇 년 전에 이런 일이 일어났습니다). Docker를 사용하면 이러한 유형의 문제를 해결할 수 있으며 응용 프로그램을 개발하는 정말 좋은 방법이라는 추가적인 이점도 있습니다. 이에 대한 주장은 IDE에서 원격 디버깅을 잘 지원한다는 것입니다.

개요



전체 스택, 즉 fpm, nginx 및 mysql을 데이터베이스로 사용하는 PHP 8.1을 설정하는 과정을 거치고 마지막에는 기본 Symfony 설치를 수행하여 모든 것을 함께 테스트합니다.

전체 설정이 포함된 저장소를 확인하고 싶지 않다면 Github에서 찾을 수 있습니다.

docker-compose 구성 설정



docker-compose에 무엇을 회전시켜야 하는지 알려주는 두 개의 파일이 있습니다. 첫 번째는 docker-compose.yml이고 다른 하나는 docker-compose.override.yml입니다. 재정의 파일은 호스트 이름을 사용하여 호스트를 노출합니다dockerhost. 이는 디버깅과 다른 컨테이너를 더 쉽게 참조하는 데 모두 유용합니다.

version: '3.5'

services:
  devbox:
    container_name: devbox-nginx
    build:
      context: ./docker/nginx
      dockerfile: Dockerfile
    ports:
      - "9001:80"
    volumes:
      - .:/app:cached
    restart: unless-stopped
    depends_on:
      - devbox-service

  devbox-service:
    container_name: devbox-service
    build:
      context: .
    volumes:
      - .:/app:cached
      - ./docker/service/php.ini:/usr/local/etc/php/conf.d/99-app.ini
      - ./docker/service/www.conf:/usr/local/etc/php-fpm.d/www.conf
    restart: unless-stopped
    environment:
      XDEBUG_CONFIG: ${XDEBUG_CONFIG}
      APP_ENV: ${APP_ENV}
      APP_DEBUG: ${APP_DEBUG}
      APP_SECRET: ${APP_SECRET}
    env_file:
      - .env
      - .env.local
    depends_on:
      - mysql

  mysql:
    image: mysql:8.0
    container_name: devbox-mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: database
    ports:
      - "3308:3306"
    volumes:
      - database-volume:/var/lib/mysql

volumes:
  database-volume:
    driver: "local"



Dockerfile 추가



두 개의 Dockerfile이 사용됩니다. 하나는 php-fpm용이고 다른 하나는 nginx용입니다. 앱 자체에 대한 하나는 php-fpm이며 프로젝트의 루트에 있고 다른 하나는 docker/nginx/Dockerfile에 있습니다. nginx Dockerfile은 default.conf에 정의된 nginx 구성을 컨테이너에 복사하기만 합니다. nginx 구성은 docker-compose에 정의된 서비스의 이름이 지정되었다는 사실과 상당히 다릅니다.

nginx용 Dockerfile

FROM nginx:stable

COPY default.conf /etc/nginx/conf.d/default.conf



php-fpm용 Dockefile

FROM php:8.1-fpm-alpine

LABEL maintainer="alexandrunastase@github"
LABEL description="Devbox Docker image"

# User build args
ARG APP_ENV="prod"
ARG APP_DEBUG="0"
ARG APP_LOG="php://stdout"

# Environment variables
ENV APP_ENV=${APP_ENV}
ENV APP_DEBUG=${APP_DEBUG}
ENV APP_LOG=${APP_LOG}

ENV XDEBUG_CONFIG=""
ENV COMPOSER_NO_INTERACTION=1

# Add PHP user
ARG PHP_USER_ID=1000
ARG PHP_GROUP_ID=1000
RUN set -x \
    && addgroup -g $PHP_GROUP_ID -S php \
    && adduser -u $PHP_USER_ID -D -S -G php php

# Install dependencies
RUN set -ex \
    && docker-php-source extract \
    && apk add --update --no-cache \
    ${PHPIZE_DEPS} \
    curl \
    # Runtime deps
    icu-dev icu-libs \
    libzip-dev zlib-dev \
    libxml2-dev \
    oniguruma-dev \
    && pecl install xdebug \
    && docker-php-ext-install intl opcache pdo_mysql zip bcmath mbstring sockets pcntl soap sockets ctype > /dev/null \
    && docker-php-ext-enable intl opcache pdo_mysql zip bcmath mbstring sockets pcntl soap sockets ctype \
    && apk del ${PHPIZE_DEPS} \
    && docker-php-source delete

# Copy configuration files
COPY ./docker/service/www.conf /usr/local/etc/php-fpm.d/www.conf
COPY ./docker/service/php.ini $PHP_INI_DIR/conf.d/99-app.ini
COPY ./docker/service/xdebug.ini $PHP_INI_DIR/conf.d/docker-php-ext-xdebug.ini

# Install composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

COPY --chown=php . /app

WORKDIR /app

USER php



메이크파일 만들기



Makefile은 컨테이너의 이름을 기억하거나 셸 기록을 검색하는 데 필요한 방법을 기억할 필요 없이 일반 명령에 훨씬 쉽게 액세스할 수 있게 해주기 때문에 모든 docker-compose 설정에 유용한 추가 기능입니다.

참고: Makefile을 편집할 때 특히 명령을 들여쓸 때 공백 대신 항상 탭을 사용해야 합니다.

.PHONY: run
run:
    @if [ ! -e ".env.local" ]; then\
        cp .env .env.local; \
    fi
    @docker-compose up -d
    @echo "Service is running on http://localhost:9001"

.PHONY: install
install:
    @docker-compose exec --user="php" -T devbox-service composer install

.PHONY: stop
stop:
    @docker-compose stop

.PHONY: enter
enter:
    @docker-compose exec --user="php" devbox-service /bin/sh

.PHONY: enter-as-root
enter-as-root:
    @docker-compose exec --user="root" devbox-service /bin/sh

.PHONY: test
test:
    @docker-compose exec --user="php" -T devbox-service /bin/sh -c 'APP_ENV="test" ./bin/phpunit --testdox'

.PHONY: destroy
destroy:
    @docker-compose down --rmi local



Symfony 추가 및 모든 테스트



전체 설정을 테스트하기 위해 Symfony 애플리케이션을 설정할 수 있습니다. 여기에서 지침을 찾을 수 있습니다: https://symfony.com/doc/current/setup.html . 나는 글을 쓰는 시점에 5.4인 LTS 버전을 사용했다.

참고: 데이터베이스가 생성되었는지 확인하기 위해 작성기 파일도 업데이트했습니다. 이를 수행할 수 있는 다른 방법이 있으면 건너뛸 수 있습니다.

xDebug 설정



./docker/service/xdebug.ini 파일의 내용을 주석 해제하여 디버깅을 활성화할 수 있습니다.

다음은 PHPStorm에서 xDebug를 구성하는 단계입니다.
  • CLI 인터프리터로 PHP Remote Debugging를 선택합니다. 로컬 통역사가 제거되었는지 확인합니다
  • .
  • 구성 유형으로 Docker Compose를 선택하고 서비스
  • devbox-service를 선택합니다.
  • 수명 주기는 Connect to existing container여야 합니다.

  • 작업 데모



    docker-compose에서 포트 9001은 localhost에 매핑되므로 실행 후 모든 것이 작동하는지 확인할 수 있습니다.

     make run
    


    컨테이너 설정

     make install
    


    모든 작곡가 패키지를 설치합니다.

    200 상태 코드를 반환해야 하는 http://localhost:9001/healthz라는 엔드포인트가 정의되어 있습니다.

    테스트를 실행하려면 다음을 사용할 수 있습니다.

     make test
    


    다른 작성기 패키지를 요구하는 것과 같은 다른 임시 명령을 실행하려면 다음을 수행할 수 있습니다.

     make enter
    


    사용하여 테스트


  • 우분투 21.10
  • 도커 버전: 20.10.14
  • docker-compose 버전: 1.29.1
  • 좋은 웹페이지 즐겨찾기