nginx + php-fpm 環境を Docker でサクッと用意する

約4年ぶりの記事更新。もっと頑張れ俺。

最近 AWS ECS と ECR を使ったシステムを設計・構築することがよくあり、その検証用で適当なコンテナを用意したい場合が結構ある。その度にググって例を探してくるの飽きてきたのでメモとして残しておく。

ディレクトリ構成

app/ 配下のファイルは適当に用意すれば良いのでこの記事では内容については触れない。

project-root/
|-- app/
|   |-- index.html
|   `-- index.php
|-- docker-compose.yaml
|-- nginx/
|   |-- Dockerfile
|   |-- default-local.conf
|   `-- default.conf
`-- php/
    `-- Dockerfile

docker-compose.yaml

compose v1 にも対応できるように version の記載は残しておく。

version: "3"

services:
  nginx:
    image: yskw516/nginx
    build:
      context: .
      dockerfile: ./nginx/Dockerfile
    ports:
      - "80:80"
    volumes:
      - type: bind
        source: ./app
        target: /app
      - type: bind
        source: ./nginx/default-local.conf
        target: /etc/nginx/conf.d/default.conf
    depends_on:
    - php-fpm

  php:
    image: yskw516/php
    build:
      context: .
      dockerfile: ./php/Dockerfile
    volumes:
      - type: bind
        source: ./app
        target: /app

./nginx/Dockerfile

ベースイメージは 2022/05 現在の最新版。

VOLUME は ECS 上でバインドマウントを利用する際に必要になる。(参考)

FROM nginx:1.21.6-alpine

# Setting the timezone
# https://wiki.alpinelinux.org/wiki/Alpine_setup_scripts#setup-timezone
RUN apk --update add alpine-conf && \
    setup-timezone -z Asia/Tokyo && \
    apk del alpine-conf && \
    rm -rf /var/cache/apk/* 

ADD ./app /app

ADD ./nginx/default.conf /etc/nginx/conf.d/

EXPOSE 80

VOLUME [ "/app" ]

./nginx/default.conf

ECS での起動時は nginx と php のコンテナを同一タスクで立ち上げる想定なので、fastcgi_pass が localhost となっている。

上記設定だとローカルで起動した際にコンテナ間通信ができないので、fastcgi_pass を php:9000 にしたローカル環境用の設定ファイル「default-local.conf」を用意し、ローカルでのコンテナ起動時には bind mount でそのファイルが読み込まれるようにする。(docker-compose.yaml で指定)

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    location / {
        root   /app;
        index  index.php index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    location ~ \.php$ {
        root           /app;
        fastcgi_pass   localhost:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

./php/Dockerfile

ベースイメージは 2022/05 現在の最新版。

/app の内容はボリュームにして nginx コンテナからも php コンテナからも見えるようにしたほうがベターな気がするが、ひとまずは両方のコンテナがそれぞれデータを持つようにしてしまっている。

ホストのソースを「ローカルではバインドマウント、ECS ではボリュームで共有」ってどうやれば良いんだろ?要調査。

FROM php:8.1.5-fpm-alpine3.15

# Setting the timezone
# https://wiki.alpinelinux.org/wiki/Alpine_setup_scripts#setup-timezone
RUN apk --update add alpine-conf && \
    setup-timezone -z Asia/Tokyo && \
    apk del alpine-conf && \
    rm -rf /var/cache/apk/* 

ADD ./app /app

EXPOSE 9000

タイトルとURLをコピーしました