Настройка Docker (PHP + Nginx + MySql)

Это заметка для тех, кто начинает свою работу с Docker или кто имеет мало опыта в этом. Вы узнаете как быстро сделать сборку для запуска веб приложения. Настройки делались в Ubuntu 19.01.

Я считаю, что у вас уже установлен и настроен docker. Если нет, то смотрите тут.

Для начала нам нужно создать в корне проекта файл docker-compose.yml и указать там такие параметры:

version: '3'

services:

  php:
    build:
      context: ./docker/php
    ports:
      - 9000:9000
    volumes:
      - ./:/srv/www/api
      - ./docker/php/www.conf:/usr/local/etc/php-fpm.d/www.conf
    environment:
      MYSQL_HOST: ${MYSQL_HOST}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}

  nginx:
    image: nginx:1.13.8
    ports:
      - 80:80
    volumes:
      - ./:/srv/www/api
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php

  mysql:
    image: mysql:8.0.20
    ports:
      - 3306:3306
    depends_on:
      - php
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_HOST: ${MYSQL_HOST}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}

Создаём файл .env и указывает там параметры для работы с базой данных:

MYSQL_HOST=mysql
MYSQL_DATABASE=apidb
MYSQL_USER=root
MYSQL_PASSWORD=root
MYSQL_ROOT_PASSWORD=root

Создаём конфигурационный файл default.conf для nginx в папке docker/nginx:

server {
    listen 80 default_server;

    server_name api.dev;

    root /srv/www/api;

    location / {
        try_files $uri /index.php$is_args$args;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }

    error_log /var/log/nginx/api_error.log;
    access_log /var/log/nginx/api_access.log;
}

Создаём конфигурационный файл www.conf для php в папке docker/php:

[www]

user = www-data
group = www-data

listen = nginx:9000

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

Создаём конфигурационный файл Dockerfile в папке docker/php:

FROM php:7.4-fpm

RUN docker-php-ext-install mysqli

Переходим в консоль. Будем считать, что наш проект лежит в папке api. Выполним команду docker-compose up:

$ docker-compose up
Creating network "api_default" with the default driver
Creating api_php_1 ... done
Creating api_nginx_1 ... done
Creating api_mysql_1 ... done
Attaching to api_php_1, api_nginx_1, api_mysql_1
...

Для тестирования приложения я использую curl. Для этого нам нужен IP адрес. Получим его:

$ echo $(docker network inspect api_default | grep Gateway | grep -o -E '[0-9\.]+')
172.18.0.1

Выполним запрос:

$ curl 172.18.0.1/index.php
Welcome!