Dockerコンテナー(PHP-FPM、Nginx、PostgreSQL)でのPHPアプリケーションの実行

過去1年間、仮想化環境でのオペレーティングシステムレベルでの展開を自動化するソフトウェアが勢いを増しています。 この記事は、この分野の初心者がDockerコンテナーにアプリケーションをパックする方法の例として役立ちます。



PHPアプリケーションは、従来の形式では、次のコンポーネントで構成されています。



  1. Webサーバー
  2. DBMS
  3. PHPアプリケーション


この例では、Nginx、PostgreSQL、PHP-FPMを使用します。



1. Dockerをインストールする



開始するには、Dockerが必要です。 公式のDocker Webサイトからダウンロードできます。



2.画像​​の作成



Dockerは、機能を説明するDockerFileファイルに基づいて画像を作成します。 コンポーネント用に3つのイメージを作成します。



DockerFileNginx



FROM nginx:mainline-alpine RUN set -ex \ && addgroup -g 82 -S www-data \ && adduser -u 82 -D -S -G www-data www-data \ && mkdir -p /etc/pki/nginx/ \ && apk update \ && apk --no-cache add --update openssl \ && openssl dhparam -out /etc/pki/nginx/dhparams.pem 4096 \ && sed -i -e 's/user\s*nginx;/user www-data www-data;/g' /etc/nginx/nginx.conf \ && sed -i -e 's/worker_processes\s*1;/worker_processes auto;/g' /etc/nginx/nginx.conf \ && rm -rf /var/cache/apk/* COPY config/website.conf /etc/nginx/conf.d/website.conf
      
      





このDockerFileでは、グループ82でwww-dataユーザーを作成し、Nginxをインストールします。 COPYの最後の行は、アプリケーション構成がconfig / website.confフォルダーにあることを前提としています。 /etc/nginx/conf.d/website.confにコピーされます。



DockerFilePostgresql



 FROM postgres:9.5.2 RUN localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8 ENV LANG en_US.utf8
      
      





このイメージでは、postgres:9.5.2イメージに基づいてビルドし、コマンドを実行してロケールと言語を決定します。



Dockerfile



 FROM alpine:edge # Timezone ENV TIMEZONE Europe/Moscow ENV PHP_MEMORY_LIMIT 1024M ENV MAX_UPLOAD 128M ENV PHP_MAX_FILE_UPLOAD 128 ENV PHP_MAX_POST 128M</blockquote> RUN set -ex \ && addgroup -g 82 -S www-data \ && adduser -u 82 -D -S -G www-data www-data \ && echo "@testing http://dl-4.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories \ && apk update \ && apk upgrade \ && apk add --update tzdata \ && cp /usr/share/zoneinfo/${TIMEZONE} /etc/localtime \ && echo "${TIMEZONE}" > /etc/timezone \ && apk --update add --no-cache php7-fpm@testing php7-mcrypt@testing php7-openssl@testing php7-json@testing php7-mysqli@testing php7-session@testing php7-gd@testing php7-xmlreader@testing php7-xmlrpc@testing \ php7-zip@testing php7-iconv@testing php7-curl@testing php7-zlib@testing php7@testing php7-ctype@testing php7-pgsql@testing php7-pdo_pgsql@testing bash rsync \ && sed -i -e "s/;daemonize\s*=\s*yes/daemonize = no/g" /etc/php7/php-fpm.conf \ && sed -i -e "s/listen\s*=\s*127.0.0.1:9000/listen = [::]:9000/g" /etc/php7/php-fpm.d/www.conf \ && sed -i -e "s/;chdir\s*=\s*\/var\/www/chdir = \/usr\/src\/app/g" /etc/php7/php-fpm.d/www.conf \ && sed -i -e "s/user\s*=\s*nobody/user = www-data/g" /etc/php7/php-fpm.d/www.conf \ && sed -i -e "s/group\s*=\s*nobody/group = www-data/g" /etc/php7/php-fpm.d/www.conf \ && sed -i -e "s/;clear_env\s*=\s*no/clear_env = no/g" /etc/php7/php-fpm.d/www.conf \ && sed -i -e "s/;catch_workers_output\s*=\s*yes/catch_workers_output = yes/g" /etc/php7/php-fpm.d/www.conf \ && sed -i "s|;date.timezone =.*|date.timezone = ${TIMEZONE}|" /etc/php7/php.ini \ && sed -i "s|memory_limit =.*|memory_limit = ${PHP_MEMORY_LIMIT}|" /etc/php7/php.ini \ && sed -i "s|upload_max_filesize =.*|upload_max_filesize = ${MAX_UPLOAD}|" /etc/php7/php.ini \ && sed -i "s|max_file_uploads =.*|max_file_uploads = ${PHP_MAX_FILE_UPLOAD}|" /etc/php7/php.ini \ && sed -i "s|post_max_size =.*|post_max_size = ${PHP_MAX_POST}|" /etc/php7/php.ini \ && sed -i "s/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/" /etc/php7/php.ini \ && apk del tzdata \ && rm -rf /var/cache/apk/* COPY . /usr/src/app RUN chown -R www-data:www-data /usr/src/app EXPOSE 9000 CMD ["php-fpm7"]
      
      





この画像は、主にアプリケーションに役立ちます。 最初に、PHPとPHP-FPMに必要なものをすべてインストールします。 次に、現在のアプリケーションフォルダーを、アプリケーションが置かれる/ usr / src / appにコピーします。 最後に、PHP-FPMを実行します。



DockerFileベースのイメージの作成



そのため、画像を作成する必要があるDockerFilesがあります。 画像は非常に簡単に作成されます。 次のコマンドを実行するだけで十分です。



 docker build -t myusername/myproject-nginx:latest -f DockerfileNginx .
      
      





 docker build -t myusername/myproject-postgresql:latest -f DockerfilePostgreSql .
      
      





 docker build -t myusername/myproject:latest .
      
      





将来、これらのコマンドに--no-cacheを追加して、毎回コンポーネントをコンパイルしないようにすることをお勧めします。



画像を作成し、Docker Hubのアカウントに添付します。 次に、Docker Hubのリポジトリに画像を送信する必要があります。 次のコマンドを実行します。



 docker push myusername/myproject-nginx:latest
      
      





 docker push myusername/myproject-postgresql:latest
      
      





 docker push myusername/myproject:latest
      
      





サーバーで画像を実行する



もうすぐです! リポジトリからイメージをダウンロードして実行することは私たちに任されています。 次のコマンドを使用してダウンロードします。



 docker pull myusername/myproject-nginx:latest
      
      





 docker pull myusername/myproject-postgresql
      
      





 docker pull myusername/myproject
      
      





それらを実行するために残っています。 これも簡単です。



 docker run —name myproject-nginx -d -p 80:80 myusername/myproject-nginx:latest
      
      





 docker run —name myproject-postgresql9.5.2 -d -p 5432:5432 myusername/myproject-postgresql9.5.2:latest
      
      





 docker run —name myproject -d -p 9000:9000 myusername/myproject:latest
      
      





出来上がり! アプリケーションはDockerコンテナーで実行されます。 それでも、すべての初心者の読者のために、私は間違いなくDockerのドキュメントをチェックします。



新しい技術の習得にご成功をお祈りします!



All Articles