HTML Diff
1 added 1 removed
Original 2026-01-01
Modified 2026-02-26
1 <p><strong>В этом гайде разбираемся, для чего нужен Docker и Docker Compose, что такое контейнеризация и Docker-образы, а также как развернуть простое веб-приложение с использованием PHP-FPM, Nginx и Postgres.</strong></p>
1 <p><strong>В этом гайде разбираемся, для чего нужен Docker и Docker Compose, что такое контейнеризация и Docker-образы, а также как развернуть простое веб-приложение с использованием PHP-FPM, Nginx и Postgres.</strong></p>
2 <p>Давайте представим себе разработчика, который приходит на работу в новую компанию. На онбординге тимлид дает ему первое шуточное задание: изучить сайт организации и найти на нем страницу с фотографиями котиков.</p>
2 <p>Давайте представим себе разработчика, который приходит на работу в новую компанию. На онбординге тимлид дает ему первое шуточное задание: изучить сайт организации и найти на нем страницу с фотографиями котиков.</p>
3 <p>Разработчик узнаёт, что сайт компании работает с помощью веб-сервера Nginx, менеджера процессов PHP-FPM и системы управления базами данных Postgres. Теперь программист ищет нужную страницу. Поиск выглядит так:</p>
3 <p>Разработчик узнаёт, что сайт компании работает с помощью веб-сервера Nginx, менеджера процессов PHP-FPM и системы управления базами данных Postgres. Теперь программист ищет нужную страницу. Поиск выглядит так:</p>
4 <ol><li>Разработчик вводит в браузере адрес сайта</li>
4 <ol><li>Разработчик вводит в браузере адрес сайта</li>
5 <li>Браузер запрашивает HTML-страницу с котиками по указанному адресу</li>
5 <li>Браузер запрашивает HTML-страницу с котиками по указанному адресу</li>
6 <li>HTTP-сервер Nginx принимает запрос и делегирует создание страницы PHP-FPM</li>
6 <li>HTTP-сервер Nginx принимает запрос и делегирует создание страницы PHP-FPM</li>
7 <li>PHP-FPM запрашивает данные о котиках из базы Postgres, строит HTML-страницу и отдает обратно его серверу Nginx, а тот - клиенту-браузеру</li>
7 <li>PHP-FPM запрашивает данные о котиках из базы Postgres, строит HTML-страницу и отдает обратно его серверу Nginx, а тот - клиенту-браузеру</li>
8 <li>Разработчик видит страницу с котиками.</li>
8 <li>Разработчик видит страницу с котиками.</li>
9 </ol><p>Свое первое задание разработчик выполняет на компьютере тимлида, где уже установлен Nginx, PHP-FPM и Postgres. На следующий день ему выдают новый компьютер, на котором этих программ нет.</p>
9 </ol><p>Свое первое задание разработчик выполняет на компьютере тимлида, где уже установлен Nginx, PHP-FPM и Postgres. На следующий день ему выдают новый компьютер, на котором этих программ нет.</p>
10 <p>Чтобы начать работать над сайтом вместе с коллегами, разработчик разворачивает проект, то есть устанавливает и настраивает все необходимое для работы. Он делает это последовательно:</p>
10 <p>Чтобы начать работать над сайтом вместе с коллегами, разработчик разворачивает проект, то есть устанавливает и настраивает все необходимое для работы. Он делает это последовательно:</p>
11 <ul><li>Устанавливает Nginx</li>
11 <ul><li>Устанавливает Nginx</li>
12 <li>Устанавливает PHP-FPM и все нужные расширения</li>
12 <li>Устанавливает PHP-FPM и все нужные расширения</li>
13 <li>Настраивает совместную работу Nginx и PHP-FPM</li>
13 <li>Настраивает совместную работу Nginx и PHP-FPM</li>
14 <li>Устанавливает Postgres, создает пользователей, нужные базы и схемы.</li>
14 <li>Устанавливает Postgres, создает пользователей, нужные базы и схемы.</li>
15 </ul><p>Установка идет долго: приходится ждать, пока сначала установится одна программа, потом другая. Сложности добавляет и то, что вся его команда работает над проектом на разных операционных системах: одни на macOS, а другие на Ubuntu или Windows.</p>
15 </ul><p>Установка идет долго: приходится ждать, пока сначала установится одна программа, потом другая. Сложности добавляет и то, что вся его команда работает над проектом на разных операционных системах: одни на macOS, а другие на Ubuntu или Windows.</p>
16 <p>Чтобы не терять время, устанавливая программу за программой, разработчик мог бы автоматизировать свои действия с помощью программы Docker. Она разворачивает проект программиста за считанные минуты.</p>
16 <p>Чтобы не терять время, устанавливая программу за программой, разработчик мог бы автоматизировать свои действия с помощью программы Docker. Она разворачивает проект программиста за считанные минуты.</p>
17 <h2>Содержание</h2>
17 <h2>Содержание</h2>
18 <ul><li><a>Что такое Docker</a></li>
18 <ul><li><a>Что такое Docker</a></li>
19 <li><a>Как работает Docker</a></li>
19 <li><a>Как работает Docker</a></li>
20 <li><a>Как создать свой Docker-образ</a></li>
20 <li><a>Как создать свой Docker-образ</a></li>
21 <li><a>Что такое Docker Compose и как он работает</a></li>
21 <li><a>Что такое Docker Compose и как он работает</a></li>
22 <li><a>Как создать простое веб-приложение с помощью Docker</a></li>
22 <li><a>Как создать простое веб-приложение с помощью Docker</a></li>
23 <li><a>Итог</a></li>
23 <li><a>Итог</a></li>
24 </ul><h2>Что такое Docker</h2>
24 </ul><h2>Что такое Docker</h2>
25 <p><a>Docker</a>- это популярная программа, в основе которой лежит технология контейнеризации. Docker позволяет запускать Docker-контейнеры с приложениями из заранее заготовленных шаблонов - Docker-образов (или по-другому Docker images).</p>
25 <p><a>Docker</a>- это популярная программа, в основе которой лежит технология контейнеризации. Docker позволяет запускать Docker-контейнеры с приложениями из заранее заготовленных шаблонов - Docker-образов (или по-другому Docker images).</p>
26 <p>Контейнеризация - это технология, которая помогает запускать приложения изолированно от операционной системы. Приложение как бы упаковывается в специальную оболочку - контейнер, внутри которого находится среда, необходимая для работы.</p>
26 <p>Контейнеризация - это технология, которая помогает запускать приложения изолированно от операционной системы. Приложение как бы упаковывается в специальную оболочку - контейнер, внутри которого находится среда, необходимая для работы.</p>
27 <p>Простыми словами контейнер - это некая изолированная песочница для запуска ваших приложений.</p>
27 <p>Простыми словами контейнер - это некая изолированная песочница для запуска ваших приложений.</p>
28 <p>На картинке видно, что приложение 1 и приложение 2 изолированы как друг от друга, так и от операционной системы.</p>
28 <p>На картинке видно, что приложение 1 и приложение 2 изолированы как друг от друга, так и от операционной системы.</p>
29 <p>Что еще может делать Docker:</p>
29 <p>Что еще может делать Docker:</p>
30 <ul><li>Управлять изолированными приложениями</li>
30 <ul><li>Управлять изолированными приложениями</li>
31 <li>Ускорять и автоматизировать развертывание приложений</li>
31 <li>Ускорять и автоматизировать развертывание приложений</li>
32 <li>Доставлять приложения до серверов</li>
32 <li>Доставлять приложения до серверов</li>
33 <li>Масштабировать приложения</li>
33 <li>Масштабировать приложения</li>
34 <li>Запускать на одном компьютере разные версии одной программы.</li>
34 <li>Запускать на одном компьютере разные версии одной программы.</li>
35 </ul><blockquote><h3>Читайте также:</h3>
35 </ul><blockquote><h3>Читайте также:</h3>
36 <p>Как читать чужой код: 6 правил, которые<a>стоит помнить разработчику</a></p>
36 <p>Как читать чужой код: 6 правил, которые<a>стоит помнить разработчику</a></p>
37 </blockquote><h2>Как работает Docker</h2>
37 </blockquote><h2>Как работает Docker</h2>
38 <p>Концепцию программы легче понять на практике. Сначала установим на компьютер<a>Docker</a>и запустим HTTP-сервер Nginx. Для этого введем следующую команду:</p>
38 <p>Концепцию программы легче понять на практике. Сначала установим на компьютер<a>Docker</a>и запустим HTTP-сервер Nginx. Для этого введем следующую команду:</p>
39 <p>docker run -p 8080:80 nginx:latest</p>
39 <p>docker run -p 8080:80 nginx:latest</p>
40 <p>Далее откроем браузер и забьем в адресную строку: 127.0.0.1:8080. Откроется страница приветствия Nginx.</p>
40 <p>Далее откроем браузер и забьем в адресную строку: 127.0.0.1:8080. Откроется страница приветствия Nginx.</p>
41 <p>Теперь разберемся подробнее, что происходит, когда мы вводим команду docker run -p 8080:80 nginx:latest. Она выполняет следующее:</p>
41 <p>Теперь разберемся подробнее, что происходит, когда мы вводим команду docker run -p 8080:80 nginx:latest. Она выполняет следующее:</p>
42 <ol><li>Скачивает docker-образ - шаблон для создания Docker-контейнера - nginx:latest из публичного репозитория<a>Docker Hub</a>(если его не скачивали ранее). Docker-образ содержит все необходимое для запуска приложения: код, среду выполнения, библиотеки, переменные окружения и файлы конфигурации. На<a>странице</a>Nginx в Docker Hub можно найти Docker-образ<a>nginx</a>, где latest - это тег (метка, снимок), который ссылается на самый свежий docker-образ и описывает его.</li>
42 <ol><li>Скачивает docker-образ - шаблон для создания Docker-контейнера - nginx:latest из публичного репозитория<a>Docker Hub</a>(если его не скачивали ранее). Docker-образ содержит все необходимое для запуска приложения: код, среду выполнения, библиотеки, переменные окружения и файлы конфигурации. На<a>странице</a>Nginx в Docker Hub можно найти Docker-образ<a>nginx</a>, где latest - это тег (метка, снимок), который ссылается на самый свежий docker-образ и описывает его.</li>
43 <li>Запускает Docker-контейнер с помощью Docker-образа</li>
43 <li>Запускает Docker-контейнер с помощью Docker-образа</li>
44 <li>Пробрасывает порт. Ранее мы объясняли, что процессы в Docker-контейнерах запускаются в изоляции от ОС, то есть все порты между ОС и Docker-контейнером закрыты. Для того, чтобы мы смогли обратиться к Nginx, нужно пробросить порт, что и делает опция -p 8080:80, где 80 - это порт Nginx внутри контейнера, а 8080 - порт в локальной сети ОС.</li>
44 <li>Пробрасывает порт. Ранее мы объясняли, что процессы в Docker-контейнерах запускаются в изоляции от ОС, то есть все порты между ОС и Docker-контейнером закрыты. Для того, чтобы мы смогли обратиться к Nginx, нужно пробросить порт, что и делает опция -p 8080:80, где 80 - это порт Nginx внутри контейнера, а 8080 - порт в локальной сети ОС.</li>
45 </ol><h2>Как создать свой Docker-образ</h2>
45 </ol><h2>Как создать свой Docker-образ</h2>
46 <p>Теперь попробуем создать свой Docker-образ, взяв за основу nginx:latest. Docker умеет создавать Docker-образ, читая текстовые команды, которые записаны в файл Dockerfile.</p>
46 <p>Теперь попробуем создать свой Docker-образ, взяв за основу nginx:latest. Docker умеет создавать Docker-образ, читая текстовые команды, которые записаны в файл Dockerfile.</p>
47 <p>Вот пример простейшего Dockerfile:</p>
47 <p>Вот пример простейшего Dockerfile:</p>
48 <p>Команда FROM задает базовый (родительский) Docker-образ и всегда вызывается в первую очередь. Команда COPY копирует файлы в Docker-контейнер.</p>
48 <p>Команда FROM задает базовый (родительский) Docker-образ и всегда вызывается в первую очередь. Команда COPY копирует файлы в Docker-контейнер.</p>
49 <p>С помощью COPY можно заменить стандартную велком-страницу Nginx на такую страницу:</p>
49 <p>С помощью COPY можно заменить стандартную велком-страницу Nginx на такую страницу:</p>
50 <p>&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;body&gt; &lt;h1&gt;Welcome to custom Nginx page!&lt;/h1&gt; &lt;/body&gt; &lt;/html&gt;</p>
50 <p>&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;body&gt; &lt;h1&gt;Welcome to custom Nginx page!&lt;/h1&gt; &lt;/body&gt; &lt;/html&gt;</p>
51 <p>Узнать подробнее об этих и других командах Docker можно в официальной<a>документации</a>.</p>
51 <p>Узнать подробнее об этих и других командах Docker можно в официальной<a>документации</a>.</p>
52 <p>Теперь, когда мы разобрались, за что отвечают команды, создадим Docker-образ из Dockerfile:</p>
52 <p>Теперь, когда мы разобрались, за что отвечают команды, создадим Docker-образ из Dockerfile:</p>
53 <p>Поясним, какие команды мы использовали в этом коде:</p>
53 <p>Поясним, какие команды мы использовали в этом коде:</p>
54 <ul><li>-t nginx_custom:latest - это имя будущего Docker-образа, latest - это тег</li>
54 <ul><li>-t nginx_custom:latest - это имя будущего Docker-образа, latest - это тег</li>
55 <li>-f /opt/src/docker-for-kids/dockerFiles/Nginx-custom/Dockerfile - путь до Dockerfile</li>
55 <li>-f /opt/src/docker-for-kids/dockerFiles/Nginx-custom/Dockerfile - путь до Dockerfile</li>
56 <li>/opt/src/docker-for-kids - директория, в контексте которой будет создан Docker-образ. Контекст - это все то, что доступно для команд из Dockerfile при сборке (билде) образа. Процесс создания Docker-образа может ссылаться на любой из файлов в контексте.</li>
56 <li>/opt/src/docker-for-kids - директория, в контексте которой будет создан Docker-образ. Контекст - это все то, что доступно для команд из Dockerfile при сборке (билде) образа. Процесс создания Docker-образа может ссылаться на любой из файлов в контексте.</li>
57 </ul><p>Теперь запускаем команду:</p>
57 </ul><p>Теперь запускаем команду:</p>
58 <p>$ docker run -p 8080:80 Nginx_custom:latest</p>
58 <p>$ docker run -p 8080:80 Nginx_custom:latest</p>
59 <p>Docker-образ готов.</p>
59 <p>Docker-образ готов.</p>
60 <blockquote><h3>Читайте также:</h3>
60 <blockquote><h3>Читайте также:</h3>
61 <p>Как настроить VS Code<a>для разработки на PHP</a>и JavaScript</p>
61 <p>Как настроить VS Code<a>для разработки на PHP</a>и JavaScript</p>
62 </blockquote><h2>Что такое Docker Compose и как он работает</h2>
62 </blockquote><h2>Что такое Docker Compose и как он работает</h2>
63 <p>С ростом количества Docker-контейнеров их становится труднее поддерживать. Конфигурация каждого контейнера описывается в своем Dockerfile, и их нужно запускать отдельной командой. Это же касается сборки или пересборки контейнеров.</p>
63 <p>С ростом количества Docker-контейнеров их становится труднее поддерживать. Конфигурация каждого контейнера описывается в своем Dockerfile, и их нужно запускать отдельной командой. Это же касается сборки или пересборки контейнеров.</p>
64 - <p>Работу облегчает<a>Docker Compose</a>- это инструмент для описания многоконтейнерных приложений. С его помощью можно собрать один файл, в котором наглядно описываются все контейнеры. Еще Docker Compose позволяет собирать, останавливать и запускать файлы одной командой.</p>
64 + <p>Работу облегчает<a>Docker Compose</a>- это инструмент для оисания многоконтейнерных приложений. С его помощью можно собрать один файл, в котором наглядно описываются все контейнеры. Еще Docker Compose позволяет собирать, останавливать и запускать файлы одной командой.</p>
65 <p>Для описания приложений используется YAML-файл.</p>
65 <p>Для описания приложений используется YAML-файл.</p>
66 <p>Если изображать этот код схематично, то описание приложения выглядит так:</p>
66 <p>Если изображать этот код схематично, то описание приложения выглядит так:</p>
67 <p>Каждый сервис находится внутри Docker-контейнера. Точкой входа в приложение, как и в случае с тем разработчиком и веб-сайтом компании, является Nginx. Пользователи веб-сайта делают запросы к Nginx, у которого проброшен порт 80.</p>
67 <p>Каждый сервис находится внутри Docker-контейнера. Точкой входа в приложение, как и в случае с тем разработчиком и веб-сайтом компании, является Nginx. Пользователи веб-сайта делают запросы к Nginx, у которого проброшен порт 80.</p>
68 <p>Разберем еще несколько команд, которые реализует Docker:</p>
68 <p>Разберем еще несколько команд, которые реализует Docker:</p>
69 <ol><li>network. Как мы объяснили ранее, каждое приложение в Docker-контейнере находится в изоляции. networks объединяет все Docker-контейнеры в одну сеть с именем test-network, и это позволяет обращаться к нужному контейнеру по его имени.</li>
69 <ol><li>network. Как мы объяснили ранее, каждое приложение в Docker-контейнере находится в изоляции. networks объединяет все Docker-контейнеры в одну сеть с именем test-network, и это позволяет обращаться к нужному контейнеру по его имени.</li>
70 <li>volumes - это механизм для хранения данных вне Docker-контейнера, то есть в файловой системе нашей ОС. volumes решает проблему совместного использования файлов.</li>
70 <li>volumes - это механизм для хранения данных вне Docker-контейнера, то есть в файловой системе нашей ОС. volumes решает проблему совместного использования файлов.</li>
71 </ol><p>Все примеры, а также исходники Dockerfile можно взять из<a>репозитория</a>на GitHub.</p>
71 </ol><p>Все примеры, а также исходники Dockerfile можно взять из<a>репозитория</a>на GitHub.</p>
72 <blockquote><h3>Полезно узнать:</h3>
72 <blockquote><h3>Полезно узнать:</h3>
73 <p><a>Как настроить маппинг портов</a>между хостом и Docker-контейнером</p>
73 <p><a>Как настроить маппинг портов</a>между хостом и Docker-контейнером</p>
74 </blockquote><h2>Как создать простое веб-приложение с помощью Docker</h2>
74 </blockquote><h2>Как создать простое веб-приложение с помощью Docker</h2>
75 <p>Создадим простое веб-приложение, которое покажет нам сообщение об успешном подключении к базе данных. Вместо адреса базы данных используем host=postgres, такое же имя cервиса, как и в YAML-файле. Напомню, что эта возможность появилась благодаря общей сети test-network.</p>
75 <p>Создадим простое веб-приложение, которое покажет нам сообщение об успешном подключении к базе данных. Вместо адреса базы данных используем host=postgres, такое же имя cервиса, как и в YAML-файле. Напомню, что эта возможность появилась благодаря общей сети test-network.</p>
76 <p>PDO - это интерфейс для доступа к базам данных в PHP. Подробнее об этом можно узнать в официальной<a>документации</a>.</p>
76 <p>PDO - это интерфейс для доступа к базам данных в PHP. Подробнее об этом можно узнать в официальной<a>документации</a>.</p>
77 <p>Теперь, чтобы создать все Docker-образы и запустить Docker-контейнеры нужно выполнить:</p>
77 <p>Теперь, чтобы создать все Docker-образы и запустить Docker-контейнеры нужно выполнить:</p>
78 <p>docker-compose up --build</p>
78 <p>docker-compose up --build</p>
79 <p>Выполняем index.php и видим успешное соединение с базой данных.</p>
79 <p>Выполняем index.php и видим успешное соединение с базой данных.</p>
80 <p>Веб-приложение для самостоятельного запуска можно найти в<a>репозитории</a>на GitHub.</p>
80 <p>Веб-приложение для самостоятельного запуска можно найти в<a>репозитории</a>на GitHub.</p>
81 <h2>Итог</h2>
81 <h2>Итог</h2>
82 <p>Освоив Docker, разработчики могут разворачивать все необходимые им сервисы на каком угодно компьютере. Также эта программа - отличный инструмент для быстрой доставки до серверов, тестирования. Изучить Docker не так тяжело, как может показаться новичкам, но зато это умение значительно сэкономит их время на ручной установке софта. Почитать про Docker подробнее можно на<a>официальном сайте</a>.</p>
82 <p>Освоив Docker, разработчики могут разворачивать все необходимые им сервисы на каком угодно компьютере. Также эта программа - отличный инструмент для быстрой доставки до серверов, тестирования. Изучить Docker не так тяжело, как может показаться новичкам, но зато это умение значительно сэкономит их время на ручной установке софта. Почитать про Docker подробнее можно на<a>официальном сайте</a>.</p>