В последнее время сталкиваюсь с такими двумя фразами, относительно docker, первая - "Зачем мне нужен docker, у меня монолитное приложение, менять ничего не нужно, все уже отлажено", и вторая - "Я видел пару статей про docker, интересно будет разобраться, но потом как-то выделю время на это". Постараюсь дать свои комментарии на обе фразы.
Чем же docker будет лучше всеми привычных виртуальных машин? На этот вопрос уже отвечали множество спикеров, книг и статей, не буду много расписывать. Docker, по своей сути, создает изолированное пространство с наименьшими затратами ресурсов. Вам не нужно иметь поверх основной операционной системы приложение виртуализации, виртуальные операционные системы. Поверх основной операционной системы вы можете создавать множество изолированных контейнеров.
Docker закрывает множество проблем инфраструктурного характера. Вы можете решить проблемы с ограничением ресурсов для своего приложения, создать без особых проблем кластер и многое другое. Ко всему этому, вы получаете возможность "портативного" использования своих контейнеров вне зависимости от вашей операционной системы. Так, к примеру, у разработчика есть виртуальная машина, где уже все настроено как ему удобно и нужно, где провел немало часов. И вдруг нужно перенести виртуалку на другой компьютер, и хорошо, если операционные системы совпадают, можно решить проблему копированием огромных образов и установкой нужного софта, а если вы работали на windows под Hyper-V, а теперь вам нужно получить тоже самое для Mac OS или Linux, то обычным копированием влоб не удастся решить эту проблему. В свою очередь, docker позволил бы решить эту проблему обычным копированием скрипта запуска контейнера и переносом данных. Многие .NET разработчики использовали MS SQL Server на своих компьютерах и знают, что сам процесс установки его вручную - боль еще та, и к тому же, по итогу получаем кучу фоновых сервисов, которые работают всегда, а если это компьютер личного пользования, то сервисы работают даже тогда, когда в них нет нужды. Подобную проблему очень легко решить с помощью docker, ведь мы получаем полностью изолированную “песочницу”, в которой можем делать все, что захотим. Когда вам нужно, можно просто остановить контейнер с приложением и расхода ресурсов нет, ваша основная операционная система чиста. Для SQL Server Microsoft предоставили официальный docker образ, который можно использовать в своих нуждах. Что же такое контейнер и образ? Образ приложения - готовый пакет софта и данных, который вы можете запустить, а вот когда вы его запустите, то получите контейнер. По сути контейнер - рабочий экземпляр (instance) вашего софта. Для нетерпеливых новичков приведу примеры готовых скриптов для запуска популярных приложений.
Установка docker под разные платформы описана здесь: EN + Windows RU + Ubuntu
Запустим MS SQL Server в контейнере. Для этого нам нужно будет выполнить следующую команду:
docker run --name mssql -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=givemedata' -p 1433:1433 -d --restart unless-stopped -v mssql-data:/var/opt/mssql/data -v C://docker//backups:/var/backups microsoft/mssql-server-linux:latest
Отмечу, что "C://docker//backups" - путь директории, которая будет общей с вашим контейнером, куда вы можете забросить нужные вам резервные копии баз данных для восстановления или откуда вы можете забрать созданные копии баз.
Запустим RabbitMQ:
docker run --name rabbit -d --restart unless-stopped -p 8004:15672 -p 8001:5672 -v rabbitmq:/var/lib/rabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=pass rabbitmq:3-management
"-p 8004:15672" - это указание связи порта, который будет в вашей операционной системе и на который будет направляться запрос внутрь контейнера. Порт можно изменить с 8004 на любой свободный\желаемый.
Для запуска "пар" контейнеров можно использовать команду "docker-compose up -d". Отличие в том, что нам необходимо описать docker compose файл с указанием необходимых сервисов и их параметров. Приведу docker compose файл для запуска postgresql + pgAdmin. Отмечу, что разработчики pgAdmin в последней версии (4 v3.0) добавили официальный образ docker. Для запуска рекомендую создать отдельную директорию и в нее поместить файл docker-compose.yml со следующим содержанием.
Docker compose для Postgres SQL + pgAdmin 4:
version: '3.1'
services:
db:
image: postgres
volumes:
- db-data:/var/lib/postgresql/data
- C://docker//backups:/var/lib/postgresql/backups
ports:
- 8002:5432
environment:
- POSTGRES_PASSWORD=givemedata
restart: unless-stopped
networks:
- net
admin:
image: dpage/pgadmin4
volumes:
- admin-data:/var/lib/pgadmin
- C://docker//backups:/var/lib/pgadmin/storage/admin/backups
ports:
- 8003:80
environment:
- PGADMIN_DEFAULT_EMAIL=admin
- PGADMIN_DEFAULT_PASSWORD=admin
restart: unless-stopped
networks:
- net
volumes:
db-data:
admin-data:
networks:
net:
Все что остается, выполнить команду docker-compose up -d в доступном CLI инструменте (powershell/shell/bash).
Приведу репозиторий docker-infrastructure, где можно будет забрать остальные docker compose файлы, файл с общими командами для запуска инструментов.
Для более наглядного управления и понимания состояния всего, что связано с docker, рекомендую использовать Portainer. Он имеет очень большой функционал и позволяет уйти от командной строки + отобразить все, что происходит и хранится в вашем docker. Особенно полезно, если места на диске мало, а неиспользуемых образов скопилось много. C Portainer можно быстро выбрать и удалить не нужные образы, сохранить место на диске.
Запуск Portainer:
docker run --name portainer -d --restart unless-stopped -p 8000:9000 -v portainer:/data -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer
В целом, это лишь трейлер к данному инструменту, популярность которого растет очень большими темпами. Docker позволяет решить множество потребностей в разработке приложений, поэтому считаю, что изучать его более глубоко необходимо, а данная статья пусть будет затравочкой и быстрыми рецептами для старта изучения.