DockerによるSymfony 5の開発


私たちはplaying with Kubernetes 先週、プロジェクトはphpinfo ()関数コールで小さなPHPファイルでした.
今日、私の同僚は私に彼を少しのガイドに導くよう頼みました、彼は現実の世界例でそれを試みたいのでSymfony プロジェクトだからこれを見てみましょう、それは、簡単迅速かつ楽しい!
シンフォニー用途Composer 依存関係やスクリプトを管理するには、名前空間、作曲家という名前のファイルで.JSON依存関係はベンダーと呼ばれるディレクトリにダウンロードされます.
開発に焦点を当て、我々は準備が整ったと孤立した環境を作成したいので、誰でもリポジトリをクローン化し、アプリケーションを簡単に実行できます.それで3つのコンテナを使うつもりです.
  • MySQLは、データの永続的なボリュームを
  • PHP - FPM ,アプリケーションのコード用のマウントボリューム付き
  • NGinxは、アプリケーションの資産のためのPHP - FPMによる構成、ログ、およびマウントされたボリュームを共有するためのマウントされたボリュームを備えています

  • また、データベースの資格情報、アプリケーションの秘密キー、などのコンテナのパラメータのいくつかの環境変数を使用する必要があります.
    私たちは使用するつもりですDocker-Compose 構成を配置し、すべてのコンテナを実行します.
    Project
    │
    ├── docker-compose.yml
    │
    ├── database/
    │   ├── Dockerfile
    │   └── data/
    │
    └── php-fpm/
    │   └── Dockerfile
    │
    ├── nginx/
    │   ├── Dockerfile
    │   └── nginx.conf
    │
    └── logs/
        └── nginx/
    

    MySQLデータベース


    MariADBコンテナを作成しましょう
    # docker/database/Dockerfile
    
    FROM mariadb:latest
    CMD ["mysqld"]
    EXPOSE 3306
    
    説明
  • 使用するMariaDB official image
  • mysqldを実行してサーバを起動します.
  • データベース接続のポート3306を公開する
  • PHP - FPM


    PHP - FPMコンテナでは、依存関係をインストールし、データベース移行を開始します.したがって、私たちはPDO MySQL拡張モジュールをインストールする必要があります.
    しかし、MySQLサーバーが準備される前に移行を実行すると問題が生じるかもしれません.これを処理する必要があります.
    Dockerを使用すると、別のコンテナを待つように設定に依存関係を指定できます.しかし、MySQLサーバが準備されるまで、Dockerの構成は待つことを意味しません.MySQLコンテナが稼働するまで待つだけです.
    幸いにも、ヘルプからwait-for-it スクリプトは、MySQLコンテナのポート3306がオープンされるまで待機することができます(または資格情報を使用してMySQLに接続できるまで待機することもできます).
    # docker/php-fpm/Dockerfile
    
    FROM php:fpm-alpine
    COPY wait-for-it.sh /usr/bin/wait-for-it
    RUN chmod +x /usr/bin/wait-for-it
    RUN apk --update --no-cache add git
    RUN docker-php-ext-install pdo_mysql
    COPY --from=composer /usr/bin/composer /usr/bin/composer
    WORKDIR /var/www
    CMD composer install ; wait-for-it database:3306 -- bin/console doctrine:migrations:migrate ;  php-fpm 
    EXPOSE 9000
    
    説明
  • php - fpm offical imageを使用します.
  • コピーをスクリプトに入れる
  • 待機を許可する
  • 依存関係のインストールにgitを追加する
  • PHPをインストールする
  • 作曲家の公式イメージから作曲家ファイルを取る
  • ワーキングディレクトリを/var/wwwに設定します.
  • 依存関係をインストールし、MySQLコンテナがマイグレーションスクリプトを実行するまで待機します.最後にPHP FPMを実行してサーバを起動します.
  • PHP - FPMポート( 9000 )を公開する
  • 金研


    OKEY、この部分は少し複雑です、我々はNGNX構成ファイル、PHP - FPMプロキシとデフォルトNGinxサイトのための分離されたファイルを作成するつもりです.
    最初にDockerfile定義
    # docker/nginx/Dockerfile
    
    FROM nginx:alpine
    WORKDIR /var/www
    CMD ["nginx"]
    EXPOSE 80
    
    説明
  • 上記のように、我々はNGinx公式イメージを使います
  • インストールディレクトリを/var/wwwに設定します.PHP - FPMと同じディレクトリにマウントされたボリュームでこれを共有します
  • nginxを起動する
  • ポート80をWebに公開
  • さて、NGinXサーバの設定
    # docker/nginx/nginx.conf
    user  nginx;
    worker_processes  4;
    daemon off;
    
    error_log  /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;
    
    events {
        worker_connections  1024;
    }
    
    
    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;
        access_log  /var/log/nginx/access.log;
        sendfile        on;
        keepalive_timeout  65;
    
        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-available/*.conf;
    }
    
    NGINX‐PHP‐FPM構成
    # docker/nginx/conf.d/default.conf
    
    upstream php-upstream {
        server php-fpm:9000;
    }
    
    Nginxサイトの設定
    # docker/nginx/sites/default.conf
    
    server {
        listen 80 default_server;
        listen [::]:80 default_server ipv6only=on;
    
        server_name localhost;
        root /var/www/public;
        index index.php index.html index.htm;
    
        location / {
             try_files $uri $uri/ /index.php$is_args$args;
        }
    
        location ~ \.php$ {
            try_files $uri /index.php =404;
            fastcgi_pass php-upstream;
            fastcgi_index index.php;
            fastcgi_buffers 16 16k;
            fastcgi_buffer_size 32k;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_read_timeout 600;
            include fastcgi_params;
        }
    
        location ~ /\.ht {
            deny all;
        }
    }
    

    Dockerの構成


    我々は3つのコンテナの定義を持って、今ちょうど我々はセットアップを設定する必要がありますすべての集まりを接続するには、Dockerの構成
    # docker/docker-compose.yml
    version: '3'
    
    services:
      database:
        build:
          context: ./database
        environment:
          - MYSQL_DATABASE=${DATABASE_NAME}
          - MYSQL_USER=${DATABASE_USER}
          - MYSQL_PASSWORD=${DATABASE_PASSWORD}
          - MYSQL_ROOT_PASSWORD=${DATABASE_ROOT_PASSWORD}
        ports:
          - "3306:3306"
        volumes:
          - ./database/init.sql:/docker-entrypoint-initdb.d/init.sql
          - ./database/data:/var/lib/mysql
    
      php-fpm:
        build:
          context: ./php-fpm
        depends_on:
          - database
        environment:
          - APP_ENV=${APP_ENV}
          - APP_SECRET=${APP_SECRET}
          - DATABASE_URL=mysql://${DATABASE_USER}:${DATABASE_PASSWORD}@database:3306/${DATABASE_NAME}?serverVersion=5.7
        volumes:
          - ../src:/var/www
    
      nginx:
        build:
          context: ./nginx
        volumes:
          - ../src:/var/www
          - ./nginx/nginx.conf:/etc/nginx/nginx.conf
          - ./nginx/sites/:/etc/nginx/sites-available
          - ./nginx/conf.d/:/etc/nginx/conf.d
          - ./logs:/var/log
        depends_on:
          - php-fpm
        ports:
          - "80:80"
    
    とサンプル環境変数:
    # docker/.env
    
    DATABASE_NAME=symfony
    DATABASE_USER=appuser
    DATABASE_PASSWORD=apppassword
    DATABASE_ROOT_PASSWORD=secret
    
    APP_ENV=dev
    APP_SECRET=24e17c47430bd2044a61c131c1cf6990
    

    共生


    symfonyインストールに進みましょう.
    $ symfony new src
    

    遊び時間


    すべてが正しくセットアップです!我々の容器で遊びましょう!
    $ docker-compose up
    
    それらのコンテナが準備ができたら、あなたはhttp://localhost , Symfony 5ウェルカム画面が表示されます.すべてが完璧に動作し、楽しい時を過す!
    私は上記のすべてのファイルのリポジトリを作成しましたhttps://gitlab.com/martinpham/symfony-5-docker