【Docker】Nginx+PHP-FPMの環境をつくってみる
これは??
記事のタイトル通り、Nginx+PHP-FPMの環境をDockerで作ってみます
参考
↑の記事を参考に環境構築していきます
ディレクトリ構造
$ tree
.
├── compose.yaml
├── docker
│ ├── nginx
│ │ └── nginx.conf
│ └── php
│ └── Dockerfile
└── src
└── index.php
4 directories, 4 files
ファイル
Nginxの設定ファイル
Nginxコンテナのポート80でリクエストを受け、phpコンテナのポート9000へ渡すように設定を記述
server {
listen 80;
server_name localhost;
root /var/www/html;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include fastcgi_params;
# .phpへのリクエストは、FastCGI を使用してPHPコンテナのポート9000へ
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
PHP
イメージは、php:7.4-fpmを使います
あとは、コードをコピーしつつPHP-FPMを起動
FROM php:7.4-fpm
# パッケージリストの更新とインストール済みパッケージのアップグレード
RUN apt-get update && apt-get upgrade -y
# 作業ディレクトリを設定
WORKDIR /var/www/html
# PHPのソースコードをコンテナにコピー
COPY . .
# PHP-FPMのデフォルトポート(9000)を公開
EXPOSE 9000
# PHP-FPMを起動
CMD ["php-fpm"]
src/index.php
phpinfoを表示するのみのシンプルなもの
<?php
phpinfo();
compose.yaml
Nginxは、nginx:latestを使い、localhost:8080で立ち上げ
confファイルのコピーも忘れずに!
phpコンテナの方はビルドコンテキストの指定とバインドマウントのみ
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./src:/var/www/html
- ./docker/nginx/nginx.conf:/etc/nginx/conf.d/default.conf
depends_on:
- php
php:
build:
context: ./docker/php
volumes:
- ./src:/var/www/html
コンテナを起動
compose.yaml
があるディレクトリでdocker-compose up -d
を実行してコンテナを起動
http://localhost:8080/ にアクセスして↓が表示されればOK
fuelphpも使ってみる
Nginx+PHP-FPMの環境ができたのでここにfuelphpを導入してみます
Nginxの設定ファイル
/var/www/
にfuelphpのアプリを作成するのでドキュメントルートを変更します
server {
listen 80;
server_name localhost;
- root /var/www/html;
+ root /var/www/public;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include fastcgi_params;
# .phpへのリクエストは、FastCGI を使用してPHPコンテナのポート9000へ
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
PHP
fuelphpのアプリを作成するためにgit, zip, unzipをインストール
composerも必要なのでこのイメージからコピーしてきます
FROM php:7.4-fpm
# パッケージリストの更新とインストール済みパッケージのアップグレード
RUN apt-get update && apt-get upgrade -y
+# git zip unzip をインストール
+RUN apt-get install -yq git zip unzip
+
+# Composerのインストール
+COPY /usr/bin/composer /usr/bin/composer
+
# 作業ディレクトリを設定
WORKDIR /var/www/
# PHPのソースコードをコンテナにコピー
COPY . .
# PHP-FPMのデフォルトポート(9000)を公開
EXPOSE 9000
# PHP-FPMを起動
CMD ["php-fpm"]
srcフォルダ
index.phpは不要なので削除します
compose.yaml
/var/www/
にfuelphpのファイルをおきたいのでバインドマウントの場所を変えます
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "8080:80"
volumes:
- - ./src:/var/www/html
+ - ./src:/var/www
- ./docker/nginx/nginx.conf:/etc/nginx/conf.d/default.conf
depends_on:
- php
php:
build:
context: ./docker/php
volumes:
- - ./src:/var/www/html
+ - ./src:/var/www
ディレクトリ構成
$ tree
.
├── compose.yaml
├── docker
│ ├── nginx
│ │ └── nginx.conf
│ └── php
│ └── Dockerfile
└── src
もう一度コンテナをビルドして起動
docker-compose build
でイメージをビルドしなおして、docker-compose up -d
でコンテナを立ち上げなおします
phpコンテナにログインしてfuelphpのアプリを作成します
手順は公式ドキュメントの通り
$ docker exec -it nginxphp-fpm-php-1 sh
# cd /var/www/
# composer create-project fuel/fuel --prefer-dist .
これで、http://localhost:8080/ にアクセスしてみます
ん!?エラーかい。。
Fuel\Core\PhpErrorException [ Fatal Error ]:
The configured locale(s) "en_US" can not be found on your system.
↓のようにlocaleを設定してみても同じエラーが出るな。。🤔
FROM php:7.4-fpm
# パッケージリストの更新とインストール済みパッケージのアップグレード
RUN apt-get update && apt-get upgrade -y
+# ロケールの設定
+RUN apt-get install -y libpq-dev libonig-dev locales
+RUN localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
+ENV LANG en_US.UTF-8
+ENV LANGUAGE en_US.UTF-8
+
# git zip unzip をインストール
RUN apt-get install -yq git zip unzip
# 以下略
localeを空にして再アクセス
こちらの記事を参考に、localeを空にしてみます
// 関係ある場所のみ抜粋
/**
* -------------------------------------------------------------------------
* Localization & internationalization settings
* -------------------------------------------------------------------------
*/
/**
* The default language.
*/
// 'language' => 'en',
/**
* Fallback language when file isn't available for default language.
*/
// 'language_fallback' => 'en',
/**
* PHP set_locale() setting. Use null to not set.
*/
// 'locale' => 'en_US',
+ 'locale' => '',
http://localhost:8080/ にアクセスすると無事表示されました
Discussion