Разделы
PHP (8)
SEO (1)
Социальные сети

Локальный веб-север внутри Docker

Локальный веб-север внутри Docker

Я уже рассказал про то, как работать локально используя XAMPP и Laravel Homestead и теперь пришло время упоковать наш проект в Docker контейнер.

В этой небольшой статье мы создадим локальный веб-сервер на базе "Docker" и "Docker Compose" для нашего "demo" проекта, который будет содержать в себе PHP+Composer, MySQL и Nginx.

При необходимости мы сможем добавить в него NodeJS и всё что нам будет нужно для локальной разработки нашего проекта.

Докер позволяет упаковать всё необходимое внутрь контейнеров.

Каждый контейнер может общаться и взаимодействовать между другими контейнерами.

У нас может быть отдельный контейнер для PHP, отдельный контейнер для Nginx и отдельный контейнер для MySQL и они без проблем смогут общаться между собой.

При необходимости мы легко сможем заменить один контейнер на другой, не трогая другие контейнеры. Это удобно, если мы захотим например перейти с PHP 7.4 на PHP 8.

Давайте установим Docker на наш компьютер.

Установка Docker под Windows и macOS

Если ты используешь Windows или macOS то нужно просто скачать установщик "Docker Desktop" с официального сайта и он всё сделает за тебя :-)

https://www.docker.com/get-started

Установка Docker под Linux

Скачиваем GPG ключ и импортируем его:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Добавляем новый источник приложений:

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

Обновляем кэш пакетов:

sudo apt-get update

Обновляем кэш Policy:

apt-cache policy docker-ce

Устанавливаем Docker:

sudo apt-get install -y docker-ce docker-ce-cli containerd.io

Проверяем запустился ли докер:

sudo systemctl status docker

Установка Docker-Compose под Windows и macOS

Docker Compose под Windows и macOS устанавливается автоматически при установки Docker-Desktop.

Установка Docker-Compose под Linux

Скачиваем docker-compose:

sudo curl -L "https://github.com/docker/compose/releases/download/1.26.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Даём необходимые права на выполнение (execute):

sudo chmod +x /usr/local/bin/docker-compose

Создаём символическую ссылку, чтобы иметь доступ к утилите везде:

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

Добавляем локального пользователя в группу Docker:

sudo usermod -aG docker protonalex

Вместо "protonalex" нужно ввести имя твоего unix пользователя, с которым ты работаешь на своём локальном компьютере.

Далее необходимо применить группу пользователя, командой:

su - protonalex

На этом этап установки завершен.

Создаём необходимые файлы конфигурации

После установки, мы можем начать интеграцию Docker в наш проект.

Для этого мы создадим небольшой проект, в котором будет всего один PHP файл.

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

version: '3.7'

services:
  db:
    image: mysql:5.7
    volumes:
      - ./:/var/www
      - db_data:/var/lib/mysql
    ports:
      - "3386:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: demo
      MYSQL_USER: user
      MYSQL_PASSWORD: pass
  nginx:
    depends_on:
      - php
    image: nginx:latest
    ports:
      - "8025:80"
    volumes:
      - ./:/var/www
      - ./docker/nginx/conf.d:/etc/nginx/conf.d
      - ./docker/nginx/logs:/var/log/nginx/
  php:
    build:
      context: docker/php
      dockerfile: Dockerfile
    depends_on:
      - db
    volumes:
      - ./:/var/www
    environment:
      COMPOSER_ALLOW_SUPERUSER: 1
volumes:
  db_data:

Здесь мы описываем как будут взаимодейстовать наши контейнеры.

Секция mysql

В разделе "db" мы указываем что мы будем использовать базу данных MySQL.

Далее мы говорим что хотим создать базу данных "demo", пользователя "user" который будет иметь пароль "pass". А также супер пользователя (root) который будет иметь пароль "root".

Эта информаци пригодиться нам, если мы захотим подключиться к БД:

Хост: "db"
База данных: "user"
Имя пользователя: "demo"
Пароль: "pass"

Секция nginx

В качестве веб-сервера, мы будем использовать последнюю версию сервера Nginx.

Секция php

Здесь мы указываем что мы будем использовать PHP, а также указываем дополнительный файл "Dockerfile" - который мы создадим чуть позже.

Далее нам необходимо создать папку "docker".

В ней будут находиться ещё две папки, где будут храниться файлы конфигурации для PHP и Nginx.

Внтури папки "docker", необходимо создать папку "nginx" и в ней папку "conf.d" и "logs".

Перейдём в папку "conf.d" в которой будут храниться настройки веб-сервера Nginx и создадим там файл "site.conf" со следующем содержанием:

server {
    server_name demo.local www.demo.local default;
    charset utf-8;
    client_max_body_size 128M;

    listen 80;
    root        /var/www;
    index       index.php;

    access_log  /var/log/nginx/access.log;
    error_log   /var/log/nginx/error.log;

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

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass php:9000;
        try_files $uri =404;
    }
}

Здесь нам нужно указать наш локальный домен, у меня это например "demo.local".

Далее нам нужно создать папку "logs" внутри папки "nginx" где будут храниться лог файлы nginx.

Теперь перейдём в папку "docker" и создадим новую папку "php".

Внутри неё создадим файл "Dockerfile" со следующим содержанием:

FROM php:7.2.11-fpm

RUN apt-get update
RUN apt-get -y install gcc make build-essential autoconf libssl-dev \
  git bash nano wget libc-dev pkg-config librabbitmq-dev libmcrypt-dev zlib1g-dev libicu-dev g++ libpng-dev zip \
            curl \
            imagemagick \
            libfreetype6-dev \
            libcurl3-dev \
            libjpeg-dev \
            libjpeg62-turbo-dev \
            libmagickwand-dev \
            libpq-dev \
            libxml2-dev \
            libzip-dev \
            mysql-client \
            openssh-client \
            unzip
RUN pecl install mcrypt-1.0.1

RUN docker-php-ext-configure gd \
        --with-freetype-dir=/usr/include/ \
        --with-png-dir=/usr/include/ \
        --with-jpeg-dir=/usr/include/ && \
    docker-php-ext-configure bcmath && \
    docker-php-ext-install \
        soap \
        zip \
        curl \
        bcmath \
        exif \
        gd \
        iconv \
        intl \
        mbstring \
        opcache \
        pdo_mysql \
        pdo_pgsql \
        pcntl \
        sockets

# Install composer
RUN curl -sS https://getcomposer.org/installer | php -- \
        --filename=composer \
        --install-dir=/usr/local/bin && \
        echo "alias composer='composer'" >> /root/.bashrc && \
        composer

# Add GITHUB_API_TOKEN support for composer
RUN chmod 700 \
        /usr/local/bin/docker-php-entrypoint \
        /usr/local/bin/composer

RUN echo "php_admin_value[error_reporting] = E_ALL & ~E_STRICT & ~E_DEPRECATED" >> /usr/local/etc/php-fpm.d/www.conf \
 && echo "php_admin_value[display_startup_errors] = on" >> /usr/local/etc/php-fpm.d/www.conf \
 && echo "php_admin_flag[log_errors] = on" >> /usr/local/etc/php-fpm.d/www.conf \
 && echo "php_flag[display_errors] = on" >> /usr/local/etc/php-fpm.d/www.conf \
 && echo "catch_workers_output = yes" >> /usr/local/etc/php-fpm.d/www.conf \
 && mv /usr/local/etc/php/php.ini-development /usr/local/etc/php/php.ini

VOLUME ["/var/www"]
WORKDIR /var/www

Здесь мы устанавливам PHP со всеми необходимыми расширениями.

Ну вот в принципе и всё.

Мы создали все необходимые файлы конфигурации.

Собираем контейнеры

Теперь мы можем собрать наши контейнеры, делается это с помощью команды:

docker-compose build

Данный процесс может занять некоторое время.

Пересобирать контейнеры нужно только тогда, когда мы что-то меняли в файлах конфигурации Docker.

Запускаем

Чтобы запустить наши докер контейнеры, вводим команду:

docker-compose up -d

Посмотреть запустились ли контейнеры можно командой:

docker ps

Далее нам необходимо добавить в файл "/etc/hosts" наш новый домен:

127.0.0.1 demo.local

Теперь мы можем открыть наш сайт и проверить всё ли работает:

http://demo.local:8025

Если мы сделали всё правильно, то должны увидить надпись "Hello World" и вывод команды "phpinfo".

Входим в контейнер по SSH

Чтобы войти в контейнер по SSH, нам нужно ввести команду:

docker-compose exec php /bin/bash

Останавливаем контейнеры

Чтобы остановить наши контейнеры, нам необходимо ввести команду:

docker-compose down

Пробуем подключиться к БД через Adminer

Скачааем Adminer с официального сайта и перезапишем index.php

wget "https://github.com/vrana/adminer/releases/download/v4.7.7/adminer-4.7.7-mysql-en.php" -O "adminer.php"

Если мы откроем бразуер и введём:

http://demo.local:8025/

То увидим веб-приложения Adminer.

Давайте попробуем войти:

  • System (Система): "MySQL" (по умолчанию).
  • Server (Сервер): "db"
  • Username (Имя пользоваля): "user"
  • Password (Пароль): "pass"

Если мы нажмём "Login" (Войти), то увидим нашу базу данных "demo".

Исходный код:

https://github.com/dignityinside/docker-demo

Спасибо Ивану Орлову за вдохновление и пример интеграции Docker в свой проект!


Реклама:

Оставьте комментарий!

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий:

  • minix
    minix написал(а):

    Докер это круто, но я пока не осилил его. Использую Xampp или OpenServer.


Написать новый комментарий

Интересное
Реклама

Mail.ru, vk.com, yandex.ru, google.com - сделаны разве на готовом движке? Узнай, как создать свой движок на PHP и MySQL.