Docker — полезный и интересный инструмент. Сама я начала с ним работать не то чтобы давно, однако уже прониклась и предполагаю, что дальше буду по большей части работать именно с ним.
Что же такое докер… Докер — это средство, которое позволяет нам отделить инфраструктуру собственной машины от инфраструктуры разрабатываемого приложения. Внутри докера можно разрабатывать, тестировать и запускать приложения самой разной направленности, при этом без необходимости настраивать свой рабочий пк под работу с конкретными технологиями.
Например, я, как php-разработчик (в основном), по большей части страдаю от того, что мне приходится устанавливать несколько версий php на свой компьютер, устанавливать веб-серверы, всё это настраивать и т.д. и т.п.* Можно, конечно, установить одну версию php, один веб-сервер, но тогда получается сложно имитировать те же процессы, что происходят на реальном сервере проекта. И здесь нам может помочь докер. Нам нужно всего лишь скачать несколько образов — нужную версию php, веб-сервер, базу данных, связать это всё несколькими командами и можно работать. При этом не засоряя рабочую машину кучей версий всего подряд.
*У меня лично например установлены на локальной машине: apache2, nginx, mariaDB, MySQL, nodejs и 7 разных версий php.
Пользоваться докером гораздо проще, чем может показаться с первого взгляда. Для этого достаточно погрузиться ненадолго в изучение основ. И дальше всё будет само собой. Поэтому давайте приступим.
Термины
Два основных термина, которые будут использоваться нами сейчас — это контейнер и образ:
Контейнер — это основная единица докера — условно говоря это нужный нам сервис с минимально настроенной оболочкой. Например если у нас есть контейнер php-8.2 — это значит, что в данном контейнере установлен php версии 8.2 и всё это функционирует на максимально облегченной операционной системе (чаще всего это linux: debian, но могут быть и другие дистрибутивы линукса, а также windows).
Образ — это фактически упакованный и подготовленный к установке контейнер. Мы скачиваем образ из репозитория докера и создаём из него контейнер, внутри которого функционирует тот или иной сервис, будь то php, веб-сервер, nodejs или что-либо ещё.
Подготовка
WSL
Я бы настоятельно советовала использовать докер в комплексе с wsl2, если вы работаете на windows. Wsl2 — это подсистема Linux для Windows, которая позволяет использовать инструменты среды Linux в Windows. На официальном сайте microsoft есть неплохая инструкция по установке. На самом деле установка элементарная, достаточно ввести в PowerShell команду
wsl --install
И дальше следовать инструкциям установщика. Но на всякий случай перед этим пробегитесь глазами по инструкции, чтобы понимать в процессе установки всё ли в порядке, а также, если сомневаетесь — по рекомендациям по настройке wsl. Настоятельно НЕ советую сильно погружаться сразу в рекомендации и т.д., для начала работы вполне хватит установленной wsl по дефолту.
После установки, у вас в списке приложений в меню пуск появится иконка Ubuntu (если вы не использовали другой дистрибутив). При клике на неё откроется терминал внутри которого можно использовать команды линукс.
Hyper-V
Также крайне желательно заранее включить виртуализацию на своей машине. Для этого нужно перейти в Панель управления → Программы и компоненты → Включение или отключение компонентов Windows (находится слева в сайдбаре). В открывшемся окне активируем пункт Hyper-V, жмём ок и перезагружаем пк.
Другие варианты попасть в программы и компоненты:
Пуск → Параметры → Приложения → Справа в окне (может быть снизу, если разрешение не очень большое, например, на ноутбуках) Сопутствующие параметры → Программы и компоненты → Включение или отключение компонентов Windows.
Регистрация и установка Docker
Следующим этапом нам надо зарегистрироваться на сайте докера и скачать Docker Desktop. Крайне рекомендую регистрироваться, т.к. регистрация даёт возможность не просто пользоваться докер-хабом (репозиторием с кучей разнообразных образов), но также загружать туда свои образы, чтобы хранить или делиться своими наработками.
После регистрации и скачивания приложения, нам надо установить его. Установка в целом достаточно проста. Сильно с предварительными настройками можно не заморачиваться. После установки система потребует перезагрузки. Обязательно перезагружаемся.
Настройка
В настройках для начала главное проверить пункт Use the WSL 2 based engine.

По умолчанию он должен быть включен, но если нет — включите и нажмите Apply & Restart. Изменения применятся и приложение докера перезагрузится. Далее нам надо настроить wsl. Для этого ждём запуска докера, а затем открываем PowerShell и там вводим следующие команды:
wsl.exe -l -v
Данная команда покажет нам режим wsl. Если ставили по умолчанию всё, то скорее всего там будет что-то в этом духе:
NAME STATE VERSION
* Ubuntu Running 2
docker-desktop-data Running 2
docker-desktop Running 2
Возможно будут другие версии и статусы. Далее, если у Ubuntu* — т.к. это наш дистрибутив линукса стоит версия 1, вводим следующую команду:
wsl.exe --set-version Ubuntu 2
Это позволит обновить дистрибутив до версии 2. Чтобы установить версию 2 по умолчанию, выполняем команду:
wsl.exe --set-default-version 2
Когда Docker Desktop запущен, перейдите в Settings → Resources → WSL integration. Там должен быть отмечен чекбокс «Enable integration with my default WSL distro».

Если он отмечен, всё ок. Но на всякий пожарный проконтролируем, чтобы наш дистрибутив линукс был выбран в wsl по умолчанию. Для этого в PowerShell выполняем команду:
wsl.exe --set-default Ubuntu
В Docker Desktop жмём Apply & Restart. Ждём перезапуска докера.
*Обязательно, если вы решили использовать отличный от Ubuntu дистрибутив линукса в wsl — в каждой команде, которую я указываю выше нужно заменить Ubuntu на соответствующее имя вашего дистрибутива
Использование Docker
Лично я стала почти все проекты вести внутри wsl. Для меня это удобно. Я создала в корневой директории пользователя новую директорию projects и внутри неё у меня находятся директории с проектами. Если планируете делать примерно также, то заходите в терминал линукса. Вы увидите курсор ввода, а перед ним будет указано username@PC-NAME: ~$ — username — это имя пользователя в линукс-системе, которое вы указывали во время установки. PC-NAME — это имя машины, которое у вас задано в системе, в том числе в windows. ~ означает, что вы находитесь в корневой директории пользователя.
Создайте общую директорию под рабочее пространство, введя команду:
mkdir projects
Вместо projects можете использовать любое другое имя директории, которое вам удобно. Чтобы убедиться что директория создалась, введите команду
ls -la
она отобразит вам список директорий и файлов, которые есть на данный момент и права на них в виде таблицы. Для перехода в созданную директорию используйте команду cd:
cd projects
В терминале вы увидите, что вместо ~ у вас теперь отображается ~/projects$ — таким образом мы сразу видим где находимся. Внутри projects создайте директорию docker-lesson:
mkdir docker-lesson
А затем перейдите в неё:
cd docker-lesson
Здесь мы будем пробовать запускать контейнеры докера. Итак, если вы используете в качестве редактора VS Code, то у меня для вас хорошая новость. Введите команду:
code .
И система откроет вам VS Code в которой будет открыта директория из которой вы вызвали данную команду, в нашем случае projects/docker-lesson.
Если вы не используете VS Code, а пользуетесь другим редактором — введите команду:
explorer.exe .
И в проводнике windows вам откроется директория projects/docker-lesson. Далее вы сможете либо отсюда открыть свой редактор кода, например PHPStorm, или отследить как в windows выглядит полный путь до директории и использовать его для создания проекта в своём редакторе.
Я буду использовать VS Code, потому что мне лично так удобнее.
Настройка VS Code
Для комфортной работы с wsl и Docker в VS Code нам потребуются несколько расширений. Перейдите в панель Extensions. В поиске введите wsl и установите пакет расширений Remote Development от Microsoft. В него входят 4 расширения: WSL, DevContainers, Remote — SSH и Remote — Tunnels. Напрямую мы их не будем использовать, они просто будут выполнять свои задачи в фоне.
Затем в поиске введите docker и установите расширение Docker от Microsoft.
Всё, для начала нам хватит )
Ставим php и apache
Итак, у нас есть директория проекта. Давайте начинать наконец-то. В первую очередь нам нужен терминал. Идём в верхнее меню, жмём Terminal → New Terminal или используем клавиши Ctrl+Shift+` . У нас по умолчанию открывается bash терминал нашего линукса. Для начала проверим всё ли работает, введём команду
docker version
Если в терминале появился текст со списком сервисов и версий — всё работает. Итак, нам нужен php с apache. Как это найти? Для этого идём на докер-хаб. В поиске вводим php и жмём Enter. В результатах поиска видим php с пометкой docker official image — это значит что это официальный образ php для докера. Заходим внутрь и видим много страшной информации. Почти в самом низу мы видим варианты исполнения: php-cli, php-apache, php-fpm и php-alpine. Т.е. тут у нас уже есть вариант php вместе с апачем.
Возвращаемся в редактор, вводим в терминале следующую команду:
docker create --name php-apache -p 80:80 php:8.3-apache
После ввода команды придётся подождать немного, пока образ php 8.3 с апачем загрузится на нашу локальную машину. Пока что давайте разберёмся что значит каждая из частей команды.
docker — с этого начинается любая команда, которая обращается к докеру. create — команда для создания контейнера из какого-либо образа. Флаг —name говорит о том, что следующий текст будет использован в качестве названия контейнера (его можно и не задавать, но тогда будет чуть сложнее взаимодействовать с контейнером). php-apache — это собственно имя для нашего контейнера. Флаг -p вообще означает publish, но проще его запомнить как «порты». За флагом следуют порты первый 80 — это порт нашей локальной машины, второй — порт контейнера (об этом в следующей статье будет подробнее). Ну и php:8.3-apache — это имя образа на докер-хабе, который будет взят за основу для нашего контейнера.
Итак, наш контейнер создан, но ещё не запущен. Чтобы это увидеть используем команду:
docker ps -a
В результате вы увидите что-то в этом духе:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1b32375c98d8 php:8.3-apache "docker-php-entrypoi…" 26 seconds ago Created php-apache
Также можно наблюдать изменения в приложении Docker Desktop на вкладке Containers

а также на вкладке Images.

По сути всё что нам осталось — это запустить контейнер и проверить всё ли работает. Можно запустить из вкладки контейнеры. Можно через терминал. Я буду все примеры показывать через терминал, т.к. в целом полезно уметь с ним работать.
docker start php-apache
Выполняем эту команду и видим в Docker Desktop следующее

Контейнер запущен, доступен по порту 80. Можно перейти в браузер и ввести адрес http://localhost:80. При переходе на него увидим сообщение от апача Forbidden (либо приветственное сообщение от апача. Это зависит от версии php, которую мы используем, т.к. в них могут различаться настройки). Почему мы видим сообщение Forbidden? Потому что фактически в нашем контейнере нет файлов, которые он мог бы отобразить.
Давайте остановим контейнер:
docker stop php-apache
И удалим созданный контейнер:
docker rm php-apache
Теперь создадим в нашей рабочей директории 2 файла:
index.html:
<!DOCTYPE html>
<html>
<head>
<title>Apache Server</title>
</head>
<body>
<h1>Hello From Apache</h1>
</body>
</html>
и test.php:
<!DOCTYPE html>
<html>
<head>
<title>Apache Server</title>
</head>
<body>
<h1>
<?php echo "Hello from PHP!"; ?>
</h1>
</body>
</html>
Сохраним изменения в файлах. Теперь заново создадим контейнер, дополнив команду для связки файлов.
docker create --name php-apache -p 80:80 -v ".:/var/www/html" php:8.3-apache
У нас тут появился новый флаг -v, который производит связывание директорий между локальной машиной и контейнером. На локальной машине мы указываем . , т.е. это корневая директория нашего проекта. В контейнере мы указываем /var/www/html — это стандартная директория для файлов веб-сайта на сервере апач.
Теперь запустим контейнер
docker start php-apache
И перейдём на http://localhost:80. Теперь у нас отображается сообщение Hello From Apache. А если мы перейдём на http://localhost:80/test.php — то у нас отобразится сообщение Hello from PHP. Для полноты картины вы можете в файле test.php убрать весь код и вывести phpinfo() — чтобы убедиться, что у нас действительно установлен php версии 8.3. Причём никаких действий с докером делать не нужно, чтобы увидеть изменения. Просто поменяли код, обновили страницу и изменения тут же отобразились.
Заключение
Итак… Я понимаю, пока всё выглядит довольно сложно. Но обещаю, в следующей статье мы разберём очень подробно, как создавать целую композицию из контейнеров. Для облегчения работы с докером в нём существует два очень удобных инструмента — это Dockerfile и docker compose. Когда попробуете — сами поймёте, что это удобно использовать в работе.
А пока что спасибо, что прочли. Удачи в работе и обучении. 🐾
Добавить комментарий