Много сказано про 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' и т.д.
в общем виде:
- авторизация в docker
- копирования файла для docker-compose-production.yml в docker-compose.yml на сервер (например используя scp)
- добавление необходимых переменных окружения в файл
.env
— например адрес реестра REGISTRY_ADDRESS и версию IMAGE_TAG - скачивание образов —
docker-compose pull
- пересборка и запуск образов
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 и затем копирование нашего кода в образ.
Источники
- Docker: Using —password via the CLI is insecure. Use —password-stdin
- GitLab Container Registry
- Deploy Tokens