Создание рабочего окружения разработки с помощью Docker

Доброго времени суток! В данной статье и следующих я расскажу и покажу, как настроить окружение
разработки c помощью Docker
в котором можно будет создавать PHP и JavaScript проекты.
О том, что такое Docker и зачем он нужен я уже рассказывал здесь.
Фактически в рамках данной статьи мы рассмотрим как создать и настроить связку Nginx+PHP(PHP-FPM)+NodeJS+MySQL с помощью Docker-a.
Все зависимости мы будем прописывать в конфигурационных файлах, так, что каждый у кого есть установленные Docker и Docker Compose,
хоть на Linux, хоть на Windows, сможет запустить проекта буквально одной командой.

Установка Docker на Windows ничем не отличается от установки большинства программ, а для Linux есть подробные инструкции,
которые просто необходимо последовательно выполнить.

Итак, рассмотрим файловую структуру проекта.


.
├── bin
│   └── dapp
├── docker
│   ├── mysql
│   │   ├── conf.d
│   │   ├── init
│   │   └── lib
│   ├── nginx
│   │   ├── cert_data
│   │   ├── common
│   │   │   └── cors.conf
│   │   ├── conf.d
│   │   │   ├── api.dapp.local.conf
│   │   │   └── dapp.local.conf
│   │   ├── generated_certs
│   │   ├── logs
│   │   │   ├── access.log
│   │   │   ├── dapp.access.log
│   │   │   ├── dapp_api.access.log
│   │   │   ├── dapp_api.error.log
│   │   │   ├── dapp.error.log
│   │   │   └── error.log
│   │   ├── ssl
│   │   │   ├── certs
│   │   │   └── private
│   │   ├── Dockerfile
│   │   ├── generate-ssl-2.sh
│   │   ├── nginx.conf
│   │   └── openssl.cnf
│   └── php
│       ├── conf.d
│       │   ├── error_reporting.ini
│       │   └── xdebug.ini
│       ├── Dockerfile
│       └── local.ini
├── src
├── docker-compose.yml
└── update_hosts.sh

Теперь рассмотрим подробнее часть основных файлов и папок проекта.

bin/dapp

Основной скрипт, которые отвечает за запуск и остановку контейнеров. Также с помощью данной скрипта можно войти
в контейнер и работать с файлами в нем, как с обычными файлами. Все изменения сделанные в контейнере будут отображаться
на файлы проекта в папке src/#название проекта#. Далее содержимое этого файла:


#!/usr/bin/env bash

set -e

COMMAND_UP="docker compose up -d"
COMMAND_STOP="docker compose stop"
COMMAND_PS="docker ps"
COMMAND_APP="docker exec -it -u dapp:dapp dapp-php /bin/bash"
COMMAND_APP_AS_ROOT="docker exec -it dapp-php /bin/bash"
COMMAND_APP_EXEC="docker exec -u dapp:dapp dapp-php ${2}"
COMMAND_SERVER="docker exec -it dapp-nginx /bin/bash"
COMMAND_DB="docker exec -it dapp-mysql /bin/bash"
COMMAND_LOGS="docker logs dapp-$2 $3"
COMMAND_RESTART="docker compose restart"
COMMAND_HELP="echo DApp available commands: up, stop, restart, ps, app, app:root, exec, server, db, logs"

cli_command="$1"

case "$cli_command" in

  up|UP ) $COMMAND_UP;;

  stop|STOP ) $COMMAND_STOP;;

  ps|PS ) $COMMAND_PS;;

  app|APP ) $COMMAND_APP;;

  db|DB ) $COMMAND_DB;;

  logs ) $COMMAND_LOGS;;

  server ) $COMMAND_SERVER;;

  restart ) $COMMAND_RESTART;;

  exec ) $COMMAND_APP_EXEC;;

  app:root ) $COMMAND_APP_AS_ROOT;;

  * ) $COMMAND_HELP;;
esac

Работаем с этим файлом следующим образом:


$ bin/dapp up # запускает наши контейнеры (nginx, php, mysql)

$ bin/dapp stop # останавливает контейнеры

$ bin/dapp app # открывает командную строку в контейнере с PHP, рабочей папкой является папка src из хостовой файловой системы

update_hosts.sh


#!/usr/bin/env bash

HOST_BASE="dapp.local"

set -e

function create_hosts_entries {

    hub_template="$1"

    {
      printf "n"
      printf "# =========== DApp Dev Domains ======================= #"
      printf "n"
      printf "127.0.0.1t %sn" "$HOST_BASE"
      printf "127.0.0.1t %s.%sn" "$hub_template" "$HOST_BASE"
      printf "# =========== added by scripts/update_hosts.sh ========== #"
      printf "n"

    } >> /etc/hosts

    printf "/etc/hosts with %s hub updated!n" "$1"
}

create_hosts_entries "api"

Скрипт выше предназначен для автоматического обновления файла /etc/hosts (это для Linux, для Windows файл C:WindowsSystem32driversetchosts
нужно отредактировать вручную), чтобы к локальному сайту можно было обращаться в браузере по имени хоста, в нашем случае dapp.local.

Таким образом в данной статье мы начали рассматривать с Вами, как с помощью Docker можно настроить локальную среду разработки Nginx+PHP+MySQL,
в следующих статьях посмотрим как собрать в Docker нужный именно нам образ PHP и опишем конфигурацию проекта с помощью docker-compose.yml.

Источник