約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