symfonyプロジェクトのためのシンプルなDockerセットアップ


私たちがDockerなしでプロジェクトで働くことは、もはやACCSTEOのケースです.もちろん、プロジェクトはDockerizedで生まれません、誰かはそれをしなければなりません.時々私は.私はPHP開発者であり、私はSymfony framework 日常的に.本稿では、Symfonyプロジェクトの開発Docker設定例を紹介します.

シンフォニープロジェクトでDockerを使いましょう。


それがDockerセットアップになるとき、1つのサイズはすべての解決に合いません.それは常に特定のプロジェクトのニーズに依存します.しかし、いくつかの良いプラクティスは、例えば、公式に記載されているDocker documentation
既存のプロジェクト、単純なもの、PHP、symfony、MySQLデータベースを取り上げましょう.しかし、Dockerはありません.そのため、ローカルのWebサーバ、適切なPHPバージョン、適切なデータベースエンジンなどをインストールするのではなく、まず最初にすべきことがあります.Dockerize!
なぜ私は最初にdockerizingに時間を費やす必要がありますか?私は一度それをします、そして、このプロジェクトに取り組んでいる誰でもそれから利益を得ます.あなたはなぜそれがDockerを使用する価値がある理由についての詳細を読むことができますthe article 我々のCEO piotrの.
私は、あなたがすでに持っていると仮定しますDocker Engine and Docker Compose インストールされていない場合は、そうするべきです.
さあ、必要なことに集中しましょう.このプロジェクトは現在Apache、PHP 7.4およびMySQL 5.7で実行されています.

Dockerを使ってDockerを構成します。気象研


私はDockerの作成を追加しました.メインのプロジェクトディレクトリのYMLファイルで、最初のコンテナをデータベースで定義しました.ファイルDockerを作成します.YMLはDockerアプリケーションを管理し実行するために使用されます.
ファイルの冒頭では、設定のバージョンを定義することができます.Dockerエンジン+ Dockerの異なるバージョンでは、構成することができます異なるバージョンの作業を構成するcheck here .
version: '3.8'

DockerコンテナのMySQLデータベース


最初のサービス、データベースを定義することから始めましょう.まず、「DB」を選びました.
version: '3.8'

services:
    db:
その後、私はDBサービスが何であるかを定義しなければなりませんでした.たとえば、イメージオプションを使用できます.画像として、適切なDockerイメージを選択しなければなりませんでした.我々は、これのためにウェブで利用できる既製のイメージを使用することができます.ツールのほとんどはDocker画像が付属しています.そして、これらのイメージを検索するにはsearch engine .
私の場合、プロジェクトはMySQLバージョン5.7を使用し、そのようなイメージも利用できます.
version: '3.8'

services:
    db:
        image: mysql:5.7
としてdocumentation このイメージのために、このコンテナのいくつかのものは、環境変数を使用して構成されることができます.
つの変数は必須ですMYSQL_ROOT_PASSWORD . 推測できるように、これはMySQLルートのスーパーユーザパスワードです.しかし、役に立ついくつかの他の変数があります.MYSQL_DATABASE , この名前のデータベースは、イメージスタートアップ中に作成されます.定義するならMYSQL_USER , MYSQL_PASSWORD , この名前とパスワードを持つユーザが作成され、彼はMYSQL_DATABASE .
version: '3.8'

services:
    db:
        image: mysql:5.7
        environment:
            - MYSQL_ROOT_PASSWORD=somerootpass
            - MYSQL_PASSWORD=somepass
            - MYSQL_DATABASE=dockerizeme_db
            - MYSQL_USER=someuser

シンフォニーDockerイメージ


しかし、すべてのために既製のイメージはありません.例えば、我々のアプリケーションの必要に応じて設定されたWebサーバの準備イメージはありません.
PHPを使用したWebサーバー用のコンテナーを定義している間、イメージオプションを使用しませんでしたが、ビルドオプションを使用してディレクトリ(.)これには、イメージがビルドされるファイル(dockerfile)が含まれます.しかし、すぐにDockerfileについて.
version: '3.8'

services:
    db:
        # cut for readability, see above
    web:
        build: .
さらに進む基本的なApache設定を追加するのもいいでしょう.Dockerディレクトリをメインのプロジェクトディレクトリに追加し、Docker環境設定に関連するファイルを保存します.そして、そのディレクトリにApacheを加えました.confファイル.このファイルはWebサーバの基本的な構成です.
<VirtualHost *:80>
    DocumentRoot /var/www/public

    <Directory /var/www/public>
        AllowOverride None
        Order Allow,Deny
        Allow from All

        <IfModule mod_rewrite.c>
            RewriteEngine On
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteRule ^(.*)$ index.php [QSA,L]
        </IfModule>
    </Directory>
</VirtualHost>
外から“コンテナ”にアクセスしましょう.私は、これのためにポートオプションを使用しました.コンテナの内部からポート80がポート8080で外部に露出します.
version: '3.8'

services:
    db:
        # cut for readability, see above
    web:
        # cut for readability, see above
        ports:
            - 8080:80
なぜ私はポート80に8080にそれを入れなかったのですか?私たちはよく、ポート80でローカルに動くApacheを持っているので、我々は衝突をします、そして、Dockerコンテナは始まらないでしょう.
最後にDockerが作成されます.以下のようになります.
version: '3.8'

services:
    db:
        image: mysql:5.7
        environment:
            - MYSQL_ROOT_PASSWORD=somerootpass
            - MYSQL_PASSWORD=somepass
            - MYSQL_DATABASE=dockerizeme_db
            - MYSQL_USER=someuser
    web:
        build: .
        ports:
            - 8080:80

アパッチとPHPのためのDockerfile


今、我々は一歩後退する必要があります.我々のウェブイメージの詳細に入りましょう.定義するために、主プロジェクトディレクトリにDockerfileファイルを追加しました.もちろん、我々は既製の公共イメージを出発点として使用し、わずかに我々のニーズに合わせます.PHP : 7.4 Apacheイメージをベースにしました.
Dockerfileの冒頭で、私たちのベースであるDockerイメージを定義しました.
FROM php:7.4-apache
それから、Apachemod_rewrite :
RUN a2enmod rewrite
その後、クラシックアップデートを行いましたlibzip-dev (作曲家に必要なジップに必要な)git wget 経由でapt get install.などの拡張pdo mysqli pdo_mysql zip Docker PHP ext install機構を介して、ベースイメージで見つけることができますdocumentation . 一方、私はまた、コンテナに不要なファイルを削除し、彼らはスペースを取るだけです.
RUN apt-get update \
  && apt-get install -y libzip-dev git wget --no-install-recommends \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

RUN docker-php-ext-install pdo mysqli pdo_mysql zip;
アプリケーション使用Composer アプリケーションの依存関係を管理するために、コンテナにインストールします.
RUN wget https://getcomposer.org/download/2.0.9/composer.phar \ 
    && mv composer.phar /usr/bin/composer && chmod +x /usr/bin/composer
Apache設定ファイルをコンテナの適切な場所にコピーし、プロジェクトファイルをコンテナの/var/wwwにコピーします.
COPY docker/apache.conf /etc/apache2/sites-enabled/000-default.conf
COPY . /var/www
Instruction Workdirは他の命令のワーキングディレクトリを設定します.
WORKDIR /var/www
最後のコマンドで、コンテナフォアグラウンドでApacheを実行します.
CMD ["apache2-foreground"]
要約すると、Webコンテナ用のDockerFileがあります.
FROM php:7.4-apache

RUN a2enmod rewrite

RUN apt-get update \
  && apt-get install -y libzip-dev git wget --no-install-recommends \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

RUN docker-php-ext-install pdo mysqli pdo_mysql zip;

RUN wget https://getcomposer.org/download/2.0.9/composer.phar \
    && mv composer.phar /usr/bin/composer && chmod +x /usr/bin/composer

COPY docker/apache.conf /etc/apache2/sites-enabled/000-default.conf
COPY . /var/www

WORKDIR /var/www

CMD ["apache2-foreground"]
それだけですか.最低は、はい!今私が走るならdocker-compose up -d コンソールのプロジェクトディレクトリでは、コンテナが作成され、プロジェクト全体が起動します.

でもちょっと待って.本当に動作しているか確認しましょう.

もちろんです.私たちのプロジェクトにはさらに一歩が必要だ.例えば、何composer install ? データベース移行?プロジェクトのREADMEでこれらの手順を説明することができます.コンテナーをコンテナーにインストールし、「移行」(bin/console doc : mig : mig)を実行します.

スタートアップの改善


例えば、entrypointを使用することによって、これらのステップを「自動化する」ことを試みることができます.entryPointを使用することは最良の解決策ではありませんが、この段階での開発を容易にします.コンテナを起動する度に実行したいと仮定しましょう.
  • 作曲家インストール
  • ロードされる新しいデータベース移行
  • データベース内の新鮮な備品(ダミー/テストデータ).
  • それで、私はentrypointを加えました.それをする単純なスクリプトでDockerディレクトリのsh
    #!/usr/bin/env bash
    
    composer install -n
    bin/console doc:mig:mig --no-interaction
    bin/console doc:fix:load --no-interaction
    
    exec "$@"
    
    それから私はdockerfileを少し修正しなければなりませんでした.
    FROM php:7.4-apache
    
    # … cut for readability
    
    COPY docker/apache.conf /etc/apache2/sites-enabled/000-default.conf
    COPY docker/entrypoint.sh /entrypoint.sh
    
    # … cut for readability
    
    RUN chmod +x /entrypoint.sh
    
    CMD ["apache2-foreground"]
    
    ENTRYPOINT ["/entrypoint.sh"]
    
    新しいスクリプトファイルをコンテナにコピーし、実行可能なパーミッションをそのファイルに追加します.Dockerfileの末尾に、ファイルがentrypointであることを定義しました
    今、私はこれらの変更を適用するためにDockerイメージを再構築しなければなりませんでしたdocker-compose build web , コンテナを再起動します.アプリケーションをチェックしましょう.

    動く!今、このプロジェクトをダウンロードしてDockerを持っている人は、単にそれを実行することができます.
    また、Mac上でDockerで動作することはできますか?あなたはKrzySiekによって最新のポストでそれについて読むことができますhere :)
    Dockerは強力なツールです、私はあなたにあなたが箱であなたのプロジェクトを始めるのを許す最小限のスニペットを見せました.あなたの無料の電子書籍でより実用的なヒントと高度なDockerの最適化技術を見つけることができますDocker Deep Dive