Amazon Linux2 + Dockerで「Welcome to nginx!」
o_wani
owani.net#stay.hungry
ローカル環境がVagrantで動いているLaravelの既存プロジェクトがある。
今回はその既存プロジェクトをローカルの開発環境Dockerでも動くようにした。ネット上ではいろいろな、docker-compose.ymlがあるが、今回は自分のローカルで動作する内容を記載しておく。
また既存プロジェクトでは、ファイルを扱うライブラリ「libreoffice」やメール受信のための「imap」も使用しているためそれに対応した。
各ミドルウェアのバージョンは保ち動作させるように配慮した。
(ローカル環境と本番環境は動作の整合性を保つために合わせる)
※今回はPHP7.2のDocker Imageがないっぽいので、PHP7.4を使用する。
ローカルで環境構築のための各ツール「git」「docker」「docker-compose」をインストールしておく。
$ git --version
git version 2.17.1.windows.2
$ docker --version
Docker version 19.03.1, build 74b1e89e8a
$ docker-compose --version
docker-compose version 1.24.1, build 4667896b
今回のディレクトリ構造は下記のとおり。「アプリ」「DB」「WEB」の3つのイメージを動かす。
.
├── www [アプリ]
├── Dockerfile [本番環境デプロイ用]
├── Vagrantfile
├── docker-compose.yml [開発環境デプロイ用]
├── infra [開発環境デプロイ用]
└── docker
├── mysql
├── nginx
└── php
version: "3.8"
volumes:
php-fpm-socket:
db-store:
services:
db:
image: mysql:5.7
container_name: db
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD:-secret}
MYSQL_DATABASE: ${DB_DATABASE:-db}
MYSQL_USER: ${DB_USERNAME:-db_user}
MYSQL_PASSWORD: ${DB_PASS:-password}
TZ: 'Asia/Tokyo'
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
volumes:
- ./infra/docker/mysql/db-store:/var/lib/mysql
- ./infra/docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
- ./infra/docker/mysql/sql:/docker-entrypoint-initdb.d
ports:
- 3306:3306
web:
build:
context: .
dockerfile: ./infra/docker/nginx/Dockerfile
ports:
- ${WEB_PORT:-80}:80
volumes:
- php-fpm-socket:/var/run/php-fpm
- ./www:/work/www
app:
build:
context: .
dockerfile: ./infra/docker/php/Dockerfile
volumes:
- php-fpm-socket:/var/run/php-fpm
- ./www:/work/www
environment:
DB_CONNECTION: mysql
DB_HOST: db
DB_PORT: 3306
DB_DATABASE: ${DB_DATABASE:-db}
DB_USERNAME: ${DB_USERNAME:-db_user}
DB_PASSWORD: ${DB_PASSWORD:-password}
links:
- db
[mysqld]
character_set_server = utf8mb4
# timezone
default-time-zone = SYSTEM
log_timestamps = SYSTEM
# Error Log
log-error = mysql-error.log
# Slow Query Log
slow_query_log = 1
slow_query_log_file = mysql-slow.log
long_query_time = 1.0
log_queries_not_using_indexes = 0
# General Log
general_log = 1
general_log_file = mysql-general.log
[mysql]
default-character-set = utf8mb4
[client]
default-character-set = utf8mb4
FROM node:14.2-alpine as node
FROM nginx:1.12-alpine
SHELL ["/bin/ash", "-oeux", "pipefail", "-c"]
ENV TZ=Asia/Tokyo
RUN apk update && \
apk add --update --no-cache --virtual=.build-dependencies g++
# node command
COPY --from=node /usr/local/bin /usr/local/bin
# npm command
COPY --from=node /usr/local/lib /usr/local/lib
# yarn command
COPY --from=node /opt /opt
# nginx config file
COPY ./infra/docker/nginx/default.conf /etc/nginx/conf.d/default.conf
WORKDIR /work/www
./infra/docker/nginx/default.conf
nginxの設定ファイルは以下。
access_log /dev/stdout main;
error_log /dev/stderr warn;
server {
listen 80;
root /work/www/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
index index.html index.htm index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
FROM php:7.4-fpm-alpine
COPY ./.env.example ./www/.env
COPY ./www /work/www
COPY ./infra/docker/php/php-fpm.d/www.conf /usr/local/etc/php-fpm.d/www.conf
COPY ./infra/docker/php/php.ini /usr/local/etc/php/php.ini
# timezone environment
ENV TZ=Asia/Tokyo
# locale
ENV LANG=ja_JP.UTF-8
# JSTに変更
RUN apk add tzdata && \
cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
RUN apk upgrade --update && \
apk --no-cache add icu-dev autoconf make g++ gcc ca-certificates wget curl
# for gd
RUN apk add --no-cache \
freetype-dev \
libjpeg-turbo-dev \
libpng-dev
# for imap
RUN apk add imap-dev krb5-dev libressl-dev
# 使用するモジュール追加
RUN apk add --no-cache php7-bcmath php7-pecl-memcached unzip libzip-dev
RUN docker-php-ext-install gd intl pdo_mysql opcache zip bcmath
# for imap
RUN PHP_OPENSSL=yes \
docker-php-ext-configure imap --with-kerberos --with-imap-ssl \
&& docker-php-ext-install imap \
&& docker-php-ext-enable imap
# for libreoffice
RUN mkdir -p /usr/share/man/man1
RUN apk add --no-cache libreoffice
# for composer
ENV COMPOSER_VERSION 1.8.0
RUN curl -L -O https://getcomposer.org/download/${COMPOSER_VERSION}/composer.phar && \
chmod +x composer.phar && mv composer.phar /usr/local/bin/composer
WORKDIR /work/www
./infra/docker/php/php.ini
phpの設定ファイルは以下。
zend.exception_ignore_args = off
expose_php = on
max_execution_time = 30
max_input_vars = 1000
upload_max_filesize = 64M
post_max_size = 128M
memory_limit = 256M
error_reporting = E_ALL
display_errors = on
display_startup_errors = on
log_errors = on
error_log = /dev/stderr
default_charset = UTF-8
[Date]
date.timezone = "Asia/Tokyo"
[mysqlnd]
mysqlnd.collect_memory_statistics = on
[Assertion]
zend.assertions = 1
[mbstring]
mbstring.language = Japanese
mbstring.internal_encoding = "UTF-8"
./infra/docker/php/php-fpm.d/www.conf
[www]
listen = /var/run/php-fpm/php-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0666
$ docker-compose up --build
....
....
$ docker-compose ps
Name Command State Ports
----------------------------------------------------------
app_1 docker-php-entrypoint php-fpm Up 9000/tcp
web_1 nginx -g daemon off; Up 0.0.0.0:80->80/tcp
db docker-entrypoint.sh mysql ... Up 0.0.0.0:3306->3306/tcp, 33060/tcp
http://localhostでアクセスできるはずです。
できなければ docker-machine envなどでIPアドレスを確認してそこにアクセスするといいかもしれません。
また、何回か試している過程で下記エラーがあった場合
Illuminate\Database\QueryException : SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name does not resolve
いったんイメージを削除してビルドするとなおりました。
$ docker-compose down --rmi all --volumes