Rapid Docker на AWS (5 серии деталей)
Программное обеспечение для доставки является проблемой. Бесконечные инструкции по установке подробно объясняют, как установить и настроить приложение, а также все его зависимости. Но на практике, следующие инструкции по установке заканчиваются разочарованием: требуемая версия PHP не доступна для установки из репозитория, файл конфигурации находится в другом каталоге, инструкции по установке не покрывают необходимую операционную систему или хотите использовать, и т. д.
И это становится хуже: иметь возможность масштабировать по требованию и восстанавливаться после сбоя на AWS, нам необходимо автоматизировать установку и конфигурацию нашего приложения и его среды выполнения. Реализация необходимой автоматизации с помощью неправильных инструментов очень трудоемкая и подверженная ошибкам.
Но что, если бы вы могли объединить свое приложение со всеми его зависимостями и запустить его на любой машине: ваш MacBook, ваш компьютер Windows, ваш тестовый сервер, ваш локальный сервер и облачную инфраструктуру? Вот что такое Docker.
Короче говоря: Docker — это инструментарий для доставки программного обеспечения.
Или, как объясняет Джефф Николофф в Docker in Action (Manning): «Docker-это программа командной строки, фоновый демон и набор удаленных сервисов, которые используют логистический подход к решению проблем с общими программными делами и упрощения вашего опыта установки, запуска, публикация и удаление программного обеспечения. Это достигает этого с использованием технологии UNIX, называемой контейнерами ».
Вы узнаете, как использовать Docker для доставки вашего веб -приложения в AWS в этой части серии. Самое главное, мы покажем вам, как создавать изображения Docker, чтобы объединить ваше веб -приложение.
Прежде чем мы продолжим, я хочу выделить несколько важных лучших практик при работе с контейнерами Docker.
- Используйте один процесс на контейнер. Если ваше приложение состоит из более чем одного процесса, разделите их на несколько контейнеров. Например, если вы запускаете Nginx и PHP-FPM, создайте два контейнера. Пример PHP в следующем разделе показывает, как это сделать.
- Не используйте SSH. Не устанавливайте и не включайте SSH в контейнере. Используйте
Docker Attach
Войти в контейнер, если это необходимо для отладки. Или даже лучше, оптимизируйте ведение журнала для отладки. - Используйте переменные среды вместо файлов конфигурации. Не используйте файлы для хранения конфигурации для вашего приложения. Вместо этого используйте переменные среды. Мы рассмотрим, как это сделать в следующем разделе.
- Используйте стандартный выход (STDOUT) и стандартную ошибку (STDERR) для ведения журнала. Не пишите файлы журналов. Docker имеет встроенную поддержку для отправки сообщений журнала из Stdout и Stderr в различные централизованные решения для ведения журнала.
С контейнерами Docker различия между различными платформами, такими как ваша машина разработчика, ваша тестовая система и ваша производственная система скрыты под слоем абстракции. Но как распространять свое приложение со всеми его зависимостями на несколько платформ? Создав изображение Docker. Изображение Docker аналогично изображению виртуальной машины, таким как изображение машины Amazon (AMI), которое используется для запуска экземпляра EC2. Изображение Docker содержит операционную систему, среду выполнения, сторонние библиотеки и ваше приложение. Следующий рисунок показывает, как вы можете принести изображение и запустить контейнер на любой платформе.
Но как создать изображение Docker для вашего веб -приложения? Создавая сценарий, который строит изображение шаг за шагом: A So Cool Dockerfile
Анкет
В следующем примере вы узнаете, как докеризировать свое веб -приложение. В примере используется простое веб -приложение, записанное в PHP без использования каких -либо фреймворков.
Пример приложения использует следующую структуру проекта:
conf
каталог конфигурации (содержит файлы .ini)CSS
каталог стилей (содержит файлы .css)img
Каталог изображений (содержит файлы .gif)lib
Справочник библиотек (содержит файлы .php)index.php
Основной файл
Типичная настройка для обслуживания приложения PHP состоит из:
- Веб -сервер (например, Nginx)
- Процесс PHP (например, PHP-FPM)
Поэтому нам нужно запустить два процесса: Nginx и PHP-FPM. Тем не менее, контейнер должен работать только по одному процессу за раз. Это означает, что нам нужно построить два изображения. На следующем рисунке показаны два контейнера: контейнер NGINX получает запрос от клиента и перенаправляет запросы PHP в контейнер PHP-FPM. Оба контейнера работают на одном хосте, чтобы избежать дополнительной задержки сети.
Начните с создания изображения Docker для Nginx. Nginx обслуживает статические файлы. В нашем примере приложения статические файлы хранятся в CSS
и IMG
каталог уже. Кроме того, Nginx перенаправляет запросы PHP PHP на PHP-FPM.
Следующий фрагмент показывает файл конфигурации docker/nginx/default.conf
который говорит Nginx для обслуживания статических файлов из /var/www/html
и перенаправить запросы PHP в PHP-FPM. Вам не нужно вносить какие -либо изменения в конфигурации NGINX при подаче вашего веб -приложения.
server { listen 80; server_name localhost; root /var/www/html; # pass the PHP scripts to FastCGI server # listening on 127.0.0.1:9000 location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SCRIPT_NAME $fastcgi_script_name; include fastcgi_params; } # redirect / to index.php location ~ ^\/$ { return 301 $scheme://$http_host/index.php$is_args$args; } }
Далее вам нужен Dockerfile
Для создания собственного изображения Nginx. Следующий фрагмент показывает файл Docker/nginx/dockerfile
что мы создали для нашего образца приложения.
Первая инструкция определяет базовое изображение. При создании изображения нам не нужно начинать с нуля. Мы можем использовать предварительно построенное базовое изображение.
FROM nginx:1.14
Следующая инструкция копирует файл конфигурации Nginx с вашего диска на изображение Docker.
COPY docker/nginx/default.conf /etc/nginx/conf.d/default.conf
Следующие две инструкции скопируют CSS
и img
каталоги от вашего местного диска в корневую каталог Nginx /var/www/html/
На изображении Docker.
Настройка В зависимости от того, где вы храните статические файлы вашего веб -приложения, вам нужно соответствующим образом изменить эти инструкции. Убедитесь, что вы копируете все статические файлы в /var/www/html/
Анкет
COPY css /var/www/html/css COPY img /var/www/html/img
Следующая инструкция запускает команду Chown для передачи владения всеми статическими файлами в nginx
пользователь. Пользователь NGINX является частью базового изображения.
RUN chown -R nginx:nginx /var/www/html
Dockerfile
готово. Пришло время построить первое изображение.
docker build -t php-basic-nginx:latest -f docker/nginx/Dockerfile .
Следующая таблица объясняет параметры Docker Build
Команда создать новое изображение:
-t php-basic-nginx: самый последний | Добавьте тег (имя) в новое изображение. |
-f docker/nginx/dockerfile | Расположение Dockerfile. |
. | Используйте текущий каталог в качестве контекста сборки (все пути, например, в копии, относительно контекста сборки). |
Следующим шагом является создание изображения PHP-FPM. Следующие фрагменты показывают файл Docker/PHP-FPM/Dockerfile
используется нашим образцом приложения.
Первая инструкция определяет базовое изображение. Мы используем базовое изображение с PHP 7.3, предварительно установленным для нашего образца приложения.
Настройка Следующие версии также поддерживаются: 7.2 и 7.1.
FROM php:7.3-fpm-stretch
Затем следует включить PHP Конфигурация оптимизирована для производственных рабочих нагрузок и установка расширений PHP КПД
и PDO_MYSQL
Анкет
Настройка Не стесняйтесь установить Дополнительные расширения если нужно.
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini" RUN docker-php-ext-install -j$(nproc) pdo pdo_mysql
Следующие команды установки envsubst
. Вы узнаете больше о том, как создать файлы конфигурации с помощью envsubst
через секунду. Не нужно ничего менять здесь.
RUN apt-get update && apt-get install -y gettext COPY docker/php-fpm/custom-entrypoint /usr/local/bin/ RUN chmod u+x /usr/local/bin/custom-entrypoint ENTRYPOINT ["custom-entrypoint"] RUN mkdir /var/www/html/conf/
После этого скрипт копирует все шаблоны конфигурации .tmp
Расположен в conf/
Анкет
COPY conf/*.tmp /tmp/conf/
Следующие инструкции копируют файлы PHP с вашего диска в корневую каталог PHP-FPM.
Настройка При подаче вашего собственного приложения вам, скорее всего, потребуется изменить эти инструкции по копированию, чтобы убедиться, что все файлы PHP скопированы на изображение. Кроме того, когда вы добавляете новые файлы PHP в свое приложение, обязательно добавьте их в этот список.
COPY *.php /var/www/html/ COPY lib /var/www/html/lib RUN chown -R www-data:www-data /var/www/html
Последняя инструкция сообщает Docker начать процесс PHP-FPM по умолчанию. Вам не нужно ничего менять здесь.
CMD ["php-fpm"]
Dockerfile
готово. Но мы пропустили одну задачу: файлы конфигурации. Мы предполагаем, что вы храните конфигурацию для вашего веб -приложения в файлах. При использовании Docker, и особенно при использовании Fargate, использование файлов конфигурации является громоздким. Вместо этого вы должны использовать переменные среды для настройки вашего приложения.
У вас есть два варианта:
- Измените свое приложение, чтобы прочитать всю конфигурацию из переменных среды.
- Не изменяйте свое приложение, но используйте переменные среды для создания файлов конфигурации с помощью
envsubst
Анкет
В следующих шагах вы узнаете, как записать файлы конфигурации на запуск контейнера на основе переменных среды с envsubst
Анкет
В нашем примере приложения используется файл конфигурации для настройки подключения базы данных: conf/app.ini
[database] host=mysql name=test user=app password=secret
Наша цель — использовать переменные среды для каждого свойства. Сделать это с envsubst
, нам нужно создать шаблон конфигурации. Следующий фрагмент показывает шаблон conf/app.ini.tmp
для нашего conf/app.ini
Файл конфигурации.
В шаблоне каждое значение было заменено заполнителем. Например, $ {Database_host}
Ссылки переменная среды Database_host
Анкет
[database] host="${DATABASE_HOST}" name="${DATABASE_NAME}" user="${DATABASE_USER}" password="${DATABASE_PASSWORD}"
По умолчанию Dockerfile
добавляет все файлы шаблонов конфигурации .tmp
хранится в conf
на изображение. Каждый раз, когда начинается контейнер, он выполняет скрипт, расположенный в Docker/PHP-FPM/Custom-IntryPoint
Анкет Следующий фрагмент показывает, как Custom-EntryPoint
Скрипт создает файлы конфигурации на основе всех ваших шаблонов конфигурации.
echo "generating configuration files" FILES=/tmp/conf/* for f in $FILES do c=$(basename $f .tmp) echo "... $c" envsubst < $f > /var/www/html/conf/${c} done
Настройка Чтобы добавить свои собственные файлы конфигурации, создайте шаблон конфигурации, заменив все динамические значения на заполнители (например, $ env_name
). Храните шаблон конфигурации в conf
папка. Вот и все. Во время выполнения контейнер создаст файл конфигурации на основе шаблона.
Далее используйте Docker Build
команда для создания изображения PHP-FPM:
docker build -t php-basic-php-fpm:latest \ -f docker/php-fpm/Dockerfile .
Вы успешно создали два изображения Docker. Вы узнаете, как проверить свои изображения Docker локально в 3 -й части серии.
У вас есть вопросы? Пожалуйста, оставьте их в комментариях. Это второй пост серии. Следуйте за мной, чтобы убедиться, что вы не упускаете следующие посты.
Этот пост является отрывом из нашей новой книги Быстрый докер на AWS Анкет Книга включает в себя образцы кода для PHP, Ruby (Rails), Python (Django), Джава (Spring Boot) и Node.js (Express).
Rapid Docker на AWS (5 серии деталей)
Оригинал: «https://dev.to/andreaswittig/rapid-docker-on-aws-how-to-build-a-docker-image-8ha»