Docker, Dockerfile, docker-compose для своего проекта

Много сказано про docker и docker-compose. Здесь не то, чтобы что-то новое, скорей как некая шпаргалка того, чем пользуюсь.

Запуск из консольной команды

список файлов в образе, в которой примонтировали локальную папку

docker run --rm -v $(PWD)/manager:/app --workdir=/app php:7.2-cli ls

запуск скрипта php из указанной папки

docker run --rm -v $(PWD)/manager:/app --workdir=/app php:7.2-cli php bin/app.php

запуск apache из указанной папки на порту 8080

docker run --rm -v $(PWD)/manager/public:/var/www/html -p 8080:80 php:7.2-apache

Docker registry

Создание и сохранение образа в registry

Авторизация

docker login -u $DOCKER_HUB_USER -p $DOCKER_HUB_PASSWORD

если авторизаци происходит из консоли, то необходимо делать так:

echo $DOCKER_HUB_PASSWORD | docker login -u $DOCKER_HUB_USER --password-stdin

если подключение идет не к официальному докерхабу, то необходимо указать после всех параметров куда идет подключение. Например registry.gitlab.com.
Для авторизации в registry gitlab может понадобиться использовать deploy token от gitlab (использование deploy token)

Создание образа

docker build -t <my.container.registry.io>/<my_app>:<my_tag> .

если Dockerfile находится не в корневой папке, то необходимо указать до него путь через директиву -f (--file): -f docker/Dockerfile

сохранение образа в registry

docker push <my.container.registry.io>/<my_app>:<my_tag>

Можно сохранить в registry.gitlab.com/group/repository:tag для этого необходимо сделать build под этот репозиторий и выполнить команду push. Образ будет доступ в разделе Packages & Registries > Container Registry

Сборка PHP-FPM

cтруктура каталогов:

docker
> nginx # папка для конфигураций nginx
> > default.conf
> nginx.docker # докер-файл nginx
> php-fpm.docker # докер-файл php-fpm

Файлы

nginx/default.conf

server {
    listen 80;
    index index.php index.html;
    root /app/public;

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

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

здесь важно правильно указать имя образа php-fpm

nginx.docker

FROM nginx:1.15-alpine

COPY ./nginx/default.conf /etc/nginx/conf.d/default.conf

WORKDIR /app

php-fpm.docker

FROM php:7.2-fpm

WORKDIR /app

для окружения development можно прокидывать папки через -v ${PWD}/app:/app или подобно, для продакшена можно копировать содержимое в образ, для этого необходимо добавить в каждый файл *.docker строку COPY ./ ./

Для запуска через чистый docker необходимо так же создать сеть

Простой вариант деплоя и возможно использования в production с образами из реестра контейнеров

version: '3'
services:
    my-nginx:
        image: ${REGISTRY_ADDRESS}/my-nginx:${IMAGE_TAG}
        restart: always
        depends_on:
            -   my-php-fpm
        ports:
            - "80:80"
    my-php-fpm:
        image: ${REGISTRY_ADDRESS}/my-php-fpm:${IMAGE_TAG}
        restart: always
    my-php-cli:
        image: ${REGISTRY_ADDRESS}/my-php-cli:${IMAGE_TAG}

понятно что переменные передаются в файле .env

в Makefile можно создать команду для деплоя, где будет выполнено на удаленной машине:

ssh ${PRODUCTION_HOST} -p ${PRODUCTION_PORT} 'авторизация в docker' и т.д.

в общем виде:

  1. авторизация в docker
  2. копирования файла для docker-compose-production.yml в docker-compose.yml на сервер (например используя scp)
  3. добавление необходимых переменных окружения в файл .env — например адрес реестра REGISTRY_ADDRESS и версию IMAGE_TAG
  4. скачивание образов — docker-compose pull
  5. пересборка и запуск образов docker-compose up --build -d

Composer

в докер-файл для cli можно добавить две строки для установки composer

RUN apt-get update && apt-get install -y unzip

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/bin --filename=composer --quiet

ENV COMPOSER_ALLOW_SUPERUSER 1

для установки composer ещё понадобится unzip. Если используется какой-нибудь более простой образ, то возможно понадобится ещё устновить curl.
Так же можно добавить константу COMPOSER_ALLOW_SUPERUSER=1, поскольку все образы docker запускаются от root, то при запуске composer выводит предупреждение, чтобы избавиться от него можно использовать константу = 1

Далее вызываем образ php-cli и команду composer install в нем для того, чтобы установить пакеты composer.

prod

Если при сборке для разработки достаточно вызвать образ php-cli, то тут уже лучше добавить пакеты в образ, потому как нет смысла дополнительно на проде скачивать эти пакеты.

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

RUN composer install --no-dev --prefer-dist --optimize-autoload

но есть минус, что при любом изменении кода, docker будет скачивать и заново устанавливать все пакеты composer, но поскольку пакеты меняются довольно редко, это будет не оптимально. Таким образом можно сначала скопировать только файлы composer.json и composer.lock, установить зависимости composer и затем скопировать остальной код

COPY ./composer.json ./composer.lock ./

RUN composer install --no-dev --prefer-dist --optimize-autoload

COPY ./ ./

Начало оптимизаций

php

Можно установить opcache, добавив установку расширения opcache командой

docker-php-ext-install opcache

так же opcache необходимо включить, для этого в файле php/defaul.ini:

[global]
opcache.enable=1

и скопировать его в образ

COPY ./docker/production/php/default.ini /usr/local/etc/php/conf.d/default.ini

docker — многостадийная сборка

обозначим собираемый образ как ‘builder’ (любое имя)

FROM php:7.2-fpm AS builder
... # сборка билда
RUN composer install --no-dev --prefer-dist --optimize-autoload

FROM php:7.2.-fpm
RUN apt-get update \
    && docker-php-ext-install opcache

COPY ./docker/production/php/default.ini /usr/local/etc/php/conf.d/default.ini
WORKDIR /app
COPY --from=builder /app ./
COPY ./ ./

копирование папки vendor из образа на предыдущем шаге, плюс в том, что теперь в образе не остается кеш, который был создан при установке пакетов composer и затем копирование нашего кода в образ.

Источники

Leave a comment

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.