Рассмотрим сценарий, который позволит быстро развернуть простой веб-сервер в docker. В качестве компонентов мы будем использовать:
Помимо этого, мы приведем пример минимальных настроек для работы данного сервера.
Предварительная настройка хоста docker
Пример сценария и настройка веб-сервера
Запуск контейнеров и проверка работоспособности
Получение валидного сертификата
Дополнительная информация
Подготовим операционную систему к работе.
1. Установка Docker.
Для запуска сценария нам необходимо установить docker и docker-compose. Для каждого типа Linux необходимо выполнить свой набор команд.
Подробнее процесс описан в инструкции Установка Docker на Linux .
2. Каталог для работы.
Создадим и перейдем в каталог, где будут находиться файлы веб-сервера и сам сценарий docker-compose.
mkdir /opt/webserver
cd /opt/webserver
Команды ниже будут выполняться из расчета, что мы находимся в созданном каталоге.
Мы готовы к созданию сценария.
Создаем файл docker-compose:
vi docker-compose.yml
* сценарий создаст 4 контейнера:
5 — 18 | Создаем контейнер веб-сервера nginx. В качестве образа используем одноименный nginx. |
16 | Конфигурационные файлы будут находится в каталоге nginx/conf.d хостовой машины (в каталоге с docker-compose.yml) и /etc/nginx/conf.d внутри контейнера. |
17 | Каталоги для хранения сертификатов. |
18 | Файлы веб-приложения — www_data на хосте docker и /usr/share/nginx/html внутри контейнера. |
20 — 33 | Контейнер с PHP. |
21 — 24 | Мы не будем брать готовый образ и сами соберем контейнер с использованием Dockerfile. Создание и описание последнего будет ниже в инструкции. |
32 | Как и для веб-сервера мы используем каталог www_data с рабочими файлами сайта, но пробрасываем их в каталог /var/www/html внутри контейнера. |
33 | Файл с настройками PHP. |
35 — 47 | Контейнер с базой данных MariaDB. |
42 | При инициализации будет создана база с именем website . |
43 | При инициализации будет создан пользователь с именем website . |
44 | Пароль пользователя website будет website123 . |
45 | Указываем пароль для суперпользователя root. |
49 — 59 | Контейнер с phpMyAdmin. |
56 | С помощью данной переменной окружения говорим, на каком контейнере запущена СУБД. |
57 | Разрешаем передачу файлов размером не более 50 Мб. По умолчанию ограничение в 2 Мб. |
59 | Обратите внимание, что данный контейнер мы вешаем на внешний 81 порт. |
Создадим каталог для хранения Dockerfile — он нам нужен для сборки контейнера с PHP:
mkdir php
Создадим в данном каталоге файл Dockerfile:
vi php/Dockerfile
* с помощью данного файла будет собран контейнер с интерпретатором php и компонентом php-fpm, принимающим запросы на обработку скриптов.
1 | В качестве базового образа берем php:8.2-fpm. Из его названия видно, что версия php будет 8.2. Меняем на версию, которая нужна, именно, вам. |
7 — 8 | Дополнительно установим php расширение mysqli . Как правило, для рабочего проекта нужно больше разрешений. Вы можете их перечислить через пробел. |
Создадим конфигурационный файл php.ini:
vi php/php.ini
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT & ~E_NOTICE
short_open_tag = On
post_max_size = 1G
upload_max_filesize = 512M
date.timezone = «Europe/Moscow»
* где:
Создаем каталог:
mkdir -p nginx/conf.d
И создаем конфигурационный файл nginx для виртуального домена:
vi nginx/conf.d/remontka.com.conf
* данный файл описывает поведение и ответ веб-сервера nginx при обращении к домену remontka.com .
2 — 3 | Сервер будет слушать на портах 80 и 443. |
5 | Указывает, для какого домена будет действовать данная настройка. |
7 — 10 | Данная настройка понадобится, если мы захотим получить бесплатный сертификат от Let’s Encrypt. |
12 — 14 | Перенаправляет запросы с http на https. |
16 — 17 | Пути до файлов сертификатов. Необходимы для работы https. |
29 — 36 | Данный блок описывает поведение nginx при обработке файлов с расширением php. В нашем примере запросы будут передаваться контейнеру web_php. |
Создаем каталог для хранения сертификатов:
mkdir nginx/ssl
Генерируем самоподписанные сертификаты:
openssl req -new -x509 -days 1461 -nodes -out nginx/ssl/remontka.com.crt -keyout nginx/ssl/remontka.com.key -subj «/C=RU/ST=SPb/L=SPb/O=Global Security/OU=IT Department/CN=remontka.com/CN=www.remontka.com»
* данная команда сформирует ключи remontka.com.crt и remontka.com.key в каталоге nginx/ssl относительно нашей рабочей папки.
Для тестирования веб-сервера нам будет достаточно самозаверенного сертификата. Но для продуктивной среды лучше будет получить сертификаты от доверенного центра.
Сценарий для развертывания веб-сервера готов.
Для создания и запуска контейнеров выполняем команду:
docker-compose up -d
Запуск контейнеров займет какой-то время. Ждем.
Создадим файл:
vi www_data/index.php
<?php
phpinfo();
?>
Можно проверить работу сервера из командной строки:
curl -k https://127.0.0.1
Мы должны получить ответ в виде html-страницы с параметрами PHP.
Того же самого эффекта можно добиться в браузере, перейдя по адресу https://<IP-адрес хоста docker>. При получении предупреждения безопасности, игнорируем его.
Ранее мы настроили веб-сервер с самоподписанным сертификатом, но в рабочей среде нам нужен сертификат, которому доверяют многие системы. Проще всего использовать бесплатный сертификат от Let’s Encrypt. Для его получения сначала открываем наш файл docker-compose:
vi docker-compose.yml
И добавляем новый volume для контейнера web_nginx:
—
services:
web_nginx:
…
volumes:
…
— ./nginx/well-known/:/usr/share/nginx/html
* мы пробрасываем внутрь контейнера каталог nginx/well-known .
Теперь можно запустить команду:
docker run -it —rm —name certbot -v «/opt/webserver/nginx/ssl:/etc/letsencrypt» -v «/opt/webserver/nginx/well-known:/usr/share/nginx/html» certbot/certbot certonly —webroot —agree-tos —email postmaster@remontka.com —webroot-path /usr/share/nginx/html/ -d remontka.com -d www.remontka.com
* данная команда создаст временный контейнер, который запросит сертификат для домена remontka.com и его поддомена www.remontka.com. В качестве каталога, где будет размещен временный файл проверки будет использоваться /usr/share/nginx/html, который является каталогом /opt/webserver/nginx/well-known на хосте docker и также смотри в папку /usr/share/nginx/html внутри веб-контейнера web_nginx.
Если настройка выполнена верно, мы должны получить файлы сертификата, которые будут находиться в каталоге /opt/webserver/nginx/ssl/live/remontka.com . Пропишем новые сертификаты:
vi nginx/conf.d/remontka.com.conf
ssl_certificate /etc/nginx/ssl/live/remontka.com/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/live/remontka.com/privkey.pem;
Перечитаем конфигурацию веб-сервером. Сначала проверим ее:
docker exec web_nginx nginx -t
И если ошибок нет:
docker exec web_nginx nginx -s reload
Для продления сертификата используем команду:
docker run -it —rm —name certbot -v «/opt/webserver/nginx/ssl:/etc/letsencrypt» -v «/opt/webserver/nginx/well-known:/usr/share/nginx/html» certbot/certbot renew
Дополнительная информация по работе с docker и веб-серверами:
1. Создание собственного образа Docker .
2. Настройка веб-сервера в Docker (NGINX + PHP + MariaDB) .
3. Шпаргалка по работе с docker-compose .
Zulip — программное обеспечение для реализации корпоративного чата. Разработан в 2012 году, в 2014 был…
Zookeeper — cервис-координатор, который позволяет обеспечить контроль синхронизации данных. Разработан на Java компанией Apache Software…
Zimbra — программное обеспечение для реализации почтового сервиса или, если сказать точнее, автоматизации совместной деятельности…
Zabbix — бесплатная система мониторинга. Позволяет отслеживать состояние сетевых узлов, компьютеров и серверов. Возможности: Поддержка…
YouTube — компания-владелец одноименного портала для просмотра и хранения видео. Чтобы пользоваться данным порталом достаточно…
Yota — провайдер, предоставляющий доступ к сети Интернет по беспроводной связи. Впервые, сервис начал работать…