🐳

【Docker】Nginx+PHP-FPMの環境をつくってみる

2025/01/05に公開

これは??

記事のタイトル通り、Nginx+PHP-FPMの環境をDockerで作ってみます

参考

https://zenn.dev/nogu_d626/articles/d200eddefd8663
↑の記事を参考に環境構築していきます

ディレクトリ構造

$ tree
.
├── compose.yaml
├── docker
│   ├── nginx
│   │   └── nginx.conf
│   └── php
│       └── Dockerfile
└── src
    └── index.php

4 directories, 4 files

ファイル

Nginxの設定ファイル

Nginxコンテナのポート80でリクエストを受け、phpコンテナのポート9000へ渡すように設定を記述

./docker/nginx/nginx.conf
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を起動

./docker/php/Dockerfile
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を表示するのみのシンプルなもの

src/index.php
<?php
phpinfo();

compose.yaml

Nginxは、nginx:latestを使い、localhost:8080で立ち上げ
confファイルのコピーも忘れずに!

phpコンテナの方はビルドコンテキストの指定とバインドマウントのみ

compose.yaml
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のアプリを作成するのでドキュメントルートを変更します

./docker/nginx/nginx.conf
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も必要なのでこのイメージからコピーしてきます

./docker/php/Dockerfile
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 --from=composer:2.8 /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のファイルをおきたいのでバインドマウントの場所を変えます

compose.yaml
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を設定してみても同じエラーが出るな。。🤔

./docker/php/Dockerfile
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を空にして再アクセス

https://qiita.com/EugeneXD/items/b399898ee22e68adc658
こちらの記事を参考に、localeを空にしてみます

./src/fuel/app/config/config.php
// 関係ある場所のみ抜粋

	/**
	 * -------------------------------------------------------------------------
	 *  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