PHP8 및 MariaDB를 사용하여 Symfony 프로젝트의 LAMP Docker 설정

하나 더 있어?!
그래, 내 검색 기술이 서툴러졌거나, 내 요구가 너무 구체적이거나, 동시에 매우 기본적이거나, 사용 가능한 온라인 강좌를 따르거나 기존 프로젝트를 다운로드한 후에 구축 과정에서 붕괴와 중단이 발생할 수 있다.그러나 구성을 몇 번 변경하면 적절한 요구 사항을 충족할 수 있는 단일 솔루션을 찾을 수 없습니다.
나는 나에게 완전히 적합하지 않은 사람들에게서 얻은 자질구레한 것들, 그리고 내가 이 과정에서 얻은 지식과 Docker에 대한 이해의 결과를 생각해내야 한다.여러분과 나누고 싶습니다.아마도 이런 형식하에서 그것은 다른 사람에게 유용할 것이다.
저는 로컬 개발에서 Docker를 사용하기로 결정했습니다. 왜냐하면 제가 하고 있는 프로젝트마다 서로 다른 버전의 PHP, NodeJS, 심지어 서로 다른 버전의 Composer가 필요하기 때문입니다.내가 주의력을 다른 항목으로 옮길 때마다, 이 버전들을 전환/업그레이드/강등하는 것은 매우 번거롭다.
Docker는 정말 느릴 수 있지만, Docker의 장점과 단점을 열거하는 것은 본문의 주제가 아닙니다.
나는 줄마다 코드의 세부 사항을 깊이 파고들고 모든 명령을 설명할 생각은 없다.내가 할 수 있는 일은 너에게 이 멋진 것을 보라고 격려하는 것이다. "Docker for local web development" series 여기서 너는 더 많은 것을 배울 수 있다.이것도 나의 주요 자원이다.

시작해보도록 하겠습니다.


나의 모든 새로운 프로젝트는 PHP8을 사용할 것이다. 왜냐하면 나는 버전 8 이전에 없었던 강력한 기능을 이용하고 싶기 때문이다.나는 처음에 최신 버전을 사용하는 것이 가치가 있다고 생각했기 때문에 이것이 바로 내가 처리해야 할 창고이다.Symfony 5.2 지원 PHP 8 attributes 은 루트와 필요한 의존항을 정의합니다. 이것은 지원하는 또 다른 이유입니다.Apache를 서버로, MariaDB를 데이터베이스로 사용할 예정입니다.
내 Symfony 프로젝트를 토대로 DB 내용을 수동으로 처리할 때의 번거로움을 피하기 위해PhpMyAdmin을 추가할 것이다.
나는 이 정확한 창고를 사용하기 위해 로컬에 여러 개의 프로젝트를 사용할 계획이다. 그래서 나는 충분하고 간단하며 다시 사용할 수 있는 방법을 생각해서 신속하게 시작해야 하지만, 필요할 때 위에서 구축하고 확장할 수 있다.
선결 조건DockerDocker Compose(이것은 플랫폼에 따라 Docker 설치의 일부일 수 있습니다.)Windows를 사용하는 경우 WSL2 기능이 활성화되어 있는지 확인합니다.

폴더 구조 개요


최종 폴더 구조를 먼저 제공한 경우 다음과 같이 이해하기 쉬울 수 있습니다.
.
├── codebase/
├── docker/
│   ├── db/
│   │   └── mariadb/
│   │       └── my.cnf
│   └── server/
│       ├── apache/
│       │   └── sites-enabled/
│       │       └── site.conf
│       ├── php/
│       │   └── php.ini
│       └── Dockerfile
├── .env
└── docker-compose.yml
모든 폴더 이름은 임의입니다.이름을 바꾸려면 구성에서 해당 이름을 변경해야 합니다.codebase 폴더는 우리의 모든 프로젝트 코드를 저장할 것입니다.이것은 Symfony 응용 프로그램이 될 것이기 때문에, 우리는 public 폴더를 가지고, 그 안에 index.php 파일을 포함할 것이다. 이것은 우리가 전체 설치 과정에서 의존하는 것이다.우선 codebase 폴더가 비어 있습니다..env 파일에는 프로젝트 레벨 Docker 환경 변수가 있습니다.이 안내서의 일부로서, 나는 로컬 기기의 hosts 파일을 설정하지 않아서, 사이트 접근을 더욱 편리하게 하지만,localhost: [포트] 를 통해 접근할 것이다.포트가 사용되지 않았는지 확인하고 로컬 컴퓨터의 사용 가능한 포트를 용기의 포트80에 비추어야 합니다.마찬가지로 PhpMyAdmin에 포트를 매핑합니다.몇몇 관례를 견지하여 일치를 유지하다.
예를 들어 프로젝트 A는 포트81018102, 프로젝트 B는 포트81038104를 사용한다.
DB 포트에도 적용됩니다.로컬 컴퓨터에서 기본 포트 3306이 사용되었을 수 있습니다.
설정에 추가 복사와 붙여넣기를 피하기 위해서 APP_NAME 변수를 사용합니다. 그러나 이것은 완전히 당신에게 달려 있습니다.MYSQL_* 설정 변수는 매우 자해하는 것이다.
.env 파일은 다음과 같습니다.
APP_NAME=symfony_project_2021
APP_PORT=8101
APP_DB_ADMIN_PORT=8102
DB_PORT=33016

MYSQL_ROOT_PASS=superSecr3t
MYSQL_USER=app_user
MYSQL_PASS=t3rceS
MYSQL_DB=symfony_project_2021

Docker Compose

docker-compose.yml YAML 파일은 저희가 서비스를 정의하는 곳입니다. Docker Compose는 이를 바탕으로 이미지를 구축하고 용기를 시작합니다.우리는 모든 서비스를 내부 네트워크symfony_project_2021_net에 연결하고 내부 네트워크도 docker-compose.yml에 정의할 것이다.
다음과 같은 3가지 서비스를 사용할 예정입니다.
  • server
  • db_server
  • db_admin
  • version: '3.9'
    
    networks:
      symfony_project_2021_net:
    
    services:
      server:
        build:
          context: .
          dockerfile: ./docker/server/Dockerfile
        container_name: '${APP_NAME}-server'
        ports:
          - '${APP_PORT}:80'
        working_dir: /var/www/html
        environment:
          - 'DATABASE_URL=mysql://${MYSQL_USER}:${MYSQL_PASS}@db_server:3306/${MYSQL_DB}?serverVersion=10.5'
        volumes:
          - ./codebase:/var/www/html
          - ./docker/server/apache/sites-enabled:/etc/apache2/sites-enabled
          - ./docker/server/php/php.ini:/usr/local/etc/php/conf.d/extra-php-config.ini
        depends_on:
          db_server:
            condition: service_healthy
        networks:
          - symfony_project_2021_net
    
      db_server:
        image: mariadb:10.5.9
        container_name: '${APP_NAME}-db'
        restart: always
        ports:
          - '${DB_PORT}:3306'
        environment:
          MYSQL_ROOT_PASSWORD: '${MYSQL_ROOT_PASS}'
          MYSQL_USER: '${MYSQL_USER}'
          MYSQL_PASSWORD: '${MYSQL_PASS}'
          MYSQL_DATABASE: '${MYSQL_DB}'
        volumes:
          - db_data:/var/lib/mysql
          - ./docker/db/mariadb/my.cnf:/etc/mysql/conf.d/my.cnf
        healthcheck:
          test: mysqladmin ping -h 127.0.0.1 -u root --password=$$MYSQL_ROOT_PASSWORD
          interval: 5s
          retries: 5
        networks:
          - symfony_project_2021_net
    
      db_admin:
        image: phpmyadmin/phpmyadmin:5
        container_name: '${APP_NAME}-db-admin'
        ports:
          - '${APP_DB_ADMIN_PORT}:80'
        environment:
          PMA_HOST: db_server
        depends_on:
          db_server:
            condition: service_healthy
        volumes:
          - db_admin_data:/var/www/html
        networks:
          - symfony_project_2021_net
    
    volumes:
      db_data:
      db_admin_data:
    
    
    우리는 Docker 공식 사진을 사용하여 db_serverdb_admin 컨테이너를 구축할 것이다.너는 Docker Hub 에서 공식 (그리고 많은 다른) 컨테이너 사진을 찾을 수 있다.

    서버


    Dockerfile을 사용하여 이미지 모양새server를 지정합니다./docker/server/Dockerfile:
    FROM php:8.0-apache
    
    RUN a2enmod rewrite
    
    RUN apt-get update && apt-get install -y git unzip zip
    
    WORKDIR /var/www/html
    
    COPY --from=mlocati/php-extension-installer /usr/bin/install-php-extensions /usr/local/bin/
    RUN install-php-extensions gd pdo_mysql bcmath zip intl opcache
    
    COPY --from=composer:2.0 /usr/bin/composer /usr/local/bin/composer
    
    DockerPHP extension installer 스크립트는 필요한 모든 APT/APK 패키지를 설치합니다.스크립트 실행이 끝날 때 더 이상 필요하지 않은 패키지가 삭제되기 때문에 그림이 훨씬 작아집니다.docker-php-ext-install를 사용하는 것이 항상 효과가 있는 것은 아니기 때문에 이 추가 스크립트를 사용하고 있습니다.필요한 경우 설치할 확장 목록을 확장할 수 있습니다.
    그 후에 우리는 작곡가를 끌어들일 것이다.Composer를 위한 용기를 따로 설치하는 게 어때요?
    로컬 폴더codebase의 내용은 프로젝트 루트/var/www/html에 매핑된 볼륨으로 간주됩니다.

    아파치


    사이트 정의는 Apache 끝에서 docker/server/apache/sites-enabled/site.conf:
    <VirtualHost *:80>
      DocumentRoot /var/www/html/public
      <Directory /var/www/html/public>
          AllowOverride None
          Order Allow,Deny
          Allow from All
    
          <IfModule mod_rewrite.c>
              Options -MultiViews
              RewriteEngine On
              RewriteCond %{REQUEST_FILENAME} !-f
              RewriteRule ^(.*)$ index.php [QSA,L]
          </IfModule>
      </Directory>
    </VirtualHost>
    
    마찬가지로 이것은 Symfony 특유의 것이다.

    프로비저닝


    마지막으로 각각 /docker/server/php/php.ini/docker/db/mariadb/my.cnf에서 PHP와 MariaDB에 추가 설정을 제공했다.
    필요한 경우 이러한 파일에서 기본값을 구성하고 무시할 수 있습니다.
    upload_max_filesize = 30M
    post_max_size = 80M
    short_open_tag = Off
    memory_limit =  256M
    
    [mysqld]
    collation-server = utf8mb4_unicode_ci
    character-set-server = utf8mb4
    
    명명된 볼륨을 사용하여 데이터를 영구화할 것입니다.데이터베이스 서비스 용기가 파괴될 때마다 데이터베이스가 파괴되기 때문에 우리는 이런 볼륨이 필요하다.이것이 docker-compose.yml 중 마지막 절의 목적이다.볼륨은 db_serverdb_admin 서비스에서 참조됩니다.
    용기의 작동 순서가 매우 중요합니다. 이것이 바로 우리가 설정한 순서입니다. depends_on환경 서버 변수를 지정하는 것도 전적으로 귀하에 달려 있습니다.Symfony 프로젝트 루트 폴더의 다른 파일.env을 자유롭게 사용할 수 있습니다.DATABASE_URL 변수는 Symfony에 특정합니다. 서버에 표시하려면

    이렇게 정의된 변수는 .env 파일(Symfony 프로젝트 루트 폴더)에 정의된 변수보다 우선합니다.
    너도 Laravel 프로젝트를 위해 같은 일을 할 수 있다.

    준비됐어, 시작...


    터미널에서 docker-compose up -d --build 부팅 용기를 실행합니다.이 과정은 약간의 시간이 필요하지만, 용기를 처음 구축할 때만 가능하다.
    완성 후 부두 운행docker-compose ps에서 컨테이너를 검사한다.

    또한 Docker 데스크톱 응용 프로그램에서는 다음을 볼 수 있습니다.

    지금부터 모든 것은 공원에서 산책해야 한다.혹은 이것이 내가 찾을 수 있는 모든 온라인 자원을 주목할 때의 생각이다😃
    실행 server 을 통해 server 용기 (그중 docker-compose exec server bash 은 용기의 이름) 에서 Bash를 실행합니다.
    서버의 작업 디렉토리를 /var/www/html로 설정했습니다.뛰면서 뛰다composer create-project symfony/website-skeleton ..원하는 경우 Symfony 설치 프로그램을 설치할 수도 있습니다Dockerfile.
    그러면 Symfony 항목이 설치됩니다.
    로컬 Composer와 PHP 버전이 다를 수 있고 호환성 문제가 발생할 수 있으므로 서버에서 직접 이 작업을 수행하는 것이 중요합니다.
    지금 검사http://localhost:8101/http://localhost:8102/.당신의 사이트와PhpMyAdmin은 사용할 수 있을 것입니다!

    이 설명서가 로컬 설정에 완전히 적용되지 않았습니까?당신은 무엇을 완전히 개선하거나 바꿀 수 있습니까?
    프로젝트를 시작하고 실행하기 위해 어떤 다른 용기를 사용합니까?

    좋은 웹페이지 즐겨찾기