Рубрики
Uncategorized

Rapid Docker на AWS: Как построить изображение Docker?

Программное обеспечение для доставки является проблемой. Бесконечные инструкции по установке подробно объясняют, как установить … Tagged с AWS, Docker, DevOps.

Rapid Docker на AWS (5 серии деталей)

Программное обеспечение для доставки является проблемой. Бесконечные инструкции по установке подробно объясняют, как установить и настроить приложение, а также все его зависимости. Но на практике, следующие инструкции по установке заканчиваются разочарованием: требуемая версия PHP не доступна для установки из репозитория, файл конфигурации находится в другом каталоге, инструкции по установке не покрывают необходимую операционную систему или хотите использовать, и т. д.

И это становится хуже: иметь возможность масштабировать по требованию и восстанавливаться после сбоя на AWS, нам необходимо автоматизировать установку и конфигурацию нашего приложения и его среды выполнения. Реализация необходимой автоматизации с помощью неправильных инструментов очень трудоемкая и подверженная ошибкам.

Но что, если бы вы могли объединить свое приложение со всеми его зависимостями и запустить его на любой машине: ваш MacBook, ваш компьютер Windows, ваш тестовый сервер, ваш локальный сервер и облачную инфраструктуру? Вот что такое Docker.

Короче говоря: Docker — это инструментарий для доставки программного обеспечения.

Или, как объясняет Джефф Николофф в Docker in Action (Manning): «Docker-это программа командной строки, фоновый демон и набор удаленных сервисов, которые используют логистический подход к решению проблем с общими программными делами и упрощения вашего опыта установки, запуска, публикация и удаление программного обеспечения. Это достигает этого с использованием технологии UNIX, называемой контейнерами ».

Вы узнаете, как использовать Docker для доставки вашего веб -приложения в AWS в этой части серии. Самое главное, мы покажем вам, как создавать изображения Docker, чтобы объединить ваше веб -приложение.

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

  1. Используйте один процесс на контейнер. Если ваше приложение состоит из более чем одного процесса, разделите их на несколько контейнеров. Например, если вы запускаете Nginx и PHP-FPM, создайте два контейнера. Пример PHP в следующем разделе показывает, как это сделать.
  2. Не используйте SSH. Не устанавливайте и не включайте SSH в контейнере. Используйте Docker Attach Войти в контейнер, если это необходимо для отладки. Или даже лучше, оптимизируйте ведение журнала для отладки.
  3. Используйте переменные среды вместо файлов конфигурации. Не используйте файлы для хранения конфигурации для вашего приложения. Вместо этого используйте переменные среды. Мы рассмотрим, как это сделать в следующем разделе.
  4. Используйте стандартный выход (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 состоит из:

  1. Веб -сервер (например, Nginx)
  2. Процесс 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»