Что такое вообще этот docker и зачем он нужен?
Он обеспечивает изоляцию выполняемых программ в нем от окружения (программного обеспечения и настроек) вашей операционной системы.
Например, вы работаете над проектом, который использует PHP версии 7. И вдруг к вам на техподдержку приходит проект, который работает максимум на PHP 5.3. Что делать? Если не использовать Docker (или подобное ПО), то вам придется иметь на вашей рабочей машине две версии PHP и разруливать их. Учитывая остальное необходимое для работы приложения ПО, система довольно быстро замусоривается и вполне могут начаться конфликты между ПО, который необходим для одного проекта и неприемлим для другого.
Вы можете рассматривать контейнер docker’а как легковесную виртуальную машину (аналог vmware, virtualbox и т.п.). Только без графического интерфейса и выполняющую определенную программу.
Некоторые термины
Проект - исходный код и конфигурации проекта, над которым вы работаете, обычно находится в одном git-репозитории.
Образ - операционная система и набор программ, которые можно использовать для создания контейнера (программистам проще представлять его как “Класс”). Примеры - Ubuntu 18.04 с установленным PHP 7.1; Debian с установленным nginx; CentOS с установленным MySQL 5.7.
Контейнер - созданный на основе образа экземпляр, может накапливать внутри себя изменения (программистам проще представлять его как “Объект, экземпляр класса”).
Какая разница между командами docker и docker-compose?
Команда docker
просто выполняет команду, которая следует в параметрах, например docker run hello-world
запустит образ hello-world
и покажет результат его выполнения.
Команда docker-compose
работет с конфигурациями (файлы формата *.yml
), которые содержат инструкции для сборки проекта. Также, он может запускать несколько контейнеров сразу, а не только один как команда docker
.
Для разработки обычно используется docker-compose
, т.к. он позволяет удобно передавать конфигурацию сборки между разработчиками.
Я только получил проект, что делать?
Для начала надо поднять проект локально. Для этого выполняется команда:
docker-compose up
Параметр up
создает необходимые для работы проекта контейнеры. Если контейнеры уже были созданы, то он запускает их.
В самом простом случае этого должно быть достаточно чтобы запустить проект и начать работу.
Что за параметр -f
?
Вам могла попадаться команда вида:
docker-compose -f docker-compose-dev.yml up
Параметр -f <путь_к_файлу_yml>
позволяет указать путь к файлу конфигурации для запуска проекта.
Дело в том, что когда мы не указываем этот параметр, то это равнозначно -f docker-compose.yml
- т.е. это стандартный путь к файлу конфигурации.
Т.е., две следующие команды - равнозначны (делают одно и то же):
docker-compose up
docker-compose -f docker-compose.yml up
Но, возможно есть несколько файлов конфигурации (например, один запускает только базу данных - docker-compose-db.yml
, другой целиком бекенд - docker-compose-backend.yml
, третий проект в продакшн режиме - docker-compose-production.yml
), тогда и пригождается эта команда. В ней можно указать полный путь, например, /home/user/myproject/myconfigs/my-docker-compose.yml
. Его можно применять для любого из параметров (up
, down
, start
, stop
, build
и т.п.). Ставится всегда перед параметром, т.е. docker-compose -f <путь> <параметр start|stop|down|up|build>
.
Что за параметр -d
?
Это запуск проекта в фоновом режиме.
Например:
docker-compose up -d
Поднимает проект в фоне, т.е. вы не увидите логов приложения без особых команд. Ставится всегда после параметра, т.е. docker-compose <параметр> -d
.
Я закончил работу с проектом, что делать?
Можно выполнить одну из двух команд.
Эта команда просто остановит контейнеры, то есть вы сможете быстро их запустить позже (командой docker-compose start
):
docker-compose stop
А эта команда остановит и удалит контейнеры проекта, то есть вы освободите место на жестком диске, но запуск контейнеров будет производится дольше:
docker-compose down
Помните, что если вы использовали особую конфигурацию для поднятия проекта (параметр -f
), то его же надо использовать и для этих команд, например, docker-compose -f docker-compose-db.yml stop
.
Как посмотреть, какие контейнеры сейчас запущены?
Эта команда покажет запущенные контейнеры:
docker ps
А эта все созданные контейнеры:
docker ps -a
По названию контейнеров можно понять, какой проект работает. Лучше всего, когда вы запускаете только тот проект, с которым работаете, а остальные выключаете, тогда количество проблем будет минимально.