Docker в быту разработчика

Docker в быту разработчика

В последнее время сталкиваюсь с такими двумя фразами, относительно docker, первая - "Зачем мне нужен 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 позволяет решить множество потребностей в разработке приложений, поэтому считаю, что изучать его более глубоко необходимо, а данная статья пусть будет затравочкой и быстрыми рецептами для старта изучения.

d2funlife | Даниил Павлов 2015-2020
Powered by ASP.NET Core 2.2, Entity Framework Core 2.2. Web + UI