under water scene of the futuristic diver standing in a submerged town, digital art style, illustration painting
В своей прошлой статье на Highload я начал рассказывать об особенностях Docker и коснулся элементов Dockerfile и Docker Image. В этой статье мы продолжим разбирать этот инструмент и поговорим о Docker Hub, Docker Container и Docker Compose.
Это сервис, где собраны разные Docker Image. Компания Docker позиционирует его как некий аналог GitHub. Но если там мы можем загружать свой или вытаскивать чужой код, то здесь — делать то же самое с собственным или уже подготовленным другими специалистами Docker Image.
У Docker Hub есть полноценный репозиторий изображений. При этом сервис обозначает официальные Image, созданные известными компаниями (тем самым Python или Postgres). Сейчас почти у всех таких компаний есть свои Images. Есть здесь и кастомные Image, созданные другими пользователями. Вы также можете использовать их свободно.
Для коммерческих проектов все же рекомендуется брать только официальные версии. Обычно в таких продуктах все протестировано, регулярно появляются обновления, нет вирусов или других проблем.
В кастомных Image никто не застрахован от багов. К тому же вы будете зависеть в своей работе от других людей.
Также в Docker Hub доступна интеграция с GitHub. Загруженный с этого сервиса код сразу будет попадать в Dockerfile для билдинга Docker Image, а результат — отправляться в Docker Hub. Инструмент очень удобен для автоматизации подобных процессов.
У этого сервиса также есть несколько ключевых команд:
docker login / logout
— для входа на Docker Hub и выхода из аккаунта.docker (image) push [OPTIONS] NAME[:TAG]
. Эта команда нужна для загрузки Docker Image на Docker Hub. Предположим, вы ищете надежное место хранения для своего Image или хотите поделиться им с коллегой. Для этого пропишите команду с названием Docker Image и с тегом. После запуска вы получите конечную ссылку. Им можно поделиться с другими:docker (image) pull [OPTIONS] NAME[:TAG|@DIGEST]
. Поможет скачивать и пулить готовый Docker Image из Docker Hub. Принцип аналогичен прошлому: прописываете команду и добавляете название нужного Image. В примере я пулил тот самый Image, который раньше запушил:
Результат — репозиторий со страницами конкретного Docker Image. Ниже можно увидеть всю сопроводительную информацию по продукту, тегу и команде, с помощью которой можно пулить этот Docker Image:
Docker Container — это корабль, который уже на плаву, с инструкцией и прописанными зависимостями. Для полного понимания этого инструмента хочу заговорить несколько важных моментов:
Кроме того, технология контейнеризации позволяет запускать компактные аналоги виртуальных машин. К примеру, контейнер с образом Ubuntu занимает всего 70 МБ, хотя сама ОС тянет на несколько гигабайтов. Это экономит пространство и ускоряет работу.
При этом установка виртуальной машины — это длительный, сложный процесс, а старт Docker Container проходит очень быстро.
docker container --help
. Подобно Image, эта команда демонстрирует пул основных команд и их краткое описание:docker container ls
показывает контейнеры, работающие в данный момент. Благодаря добавлению аргументов функционал может быть расширен. Например, указав тег -a
, система отобразит все существующие на компьютере Docker-контейнеры.docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]
. Команда, запускающая контейнер. Вместе с ней обязательно следует указывать название Docker Image, по которому будете ранить контейнер. Можно добавлять и теги. Например, -d
запустит Docker Container в фоновом режиме, а --name
задаст название контейнера. В примере я запустил контейнер под именем test
, а затем командой docker container ls
проверил его старт:docker container stop [OPTIONS] CONTAINER [CONTAINER...]
. Эта команда останавливает запущенный контейнер. В примере я также проверил, чтобы убедиться: нужный Docker Container действительно отсутствует в списке. Если добавить при проверке тег -a
, то остановленный появится сверху.docker container start
запускает созданные, но не запущенные контейнеры. Это может понадобиться, чтобы поднять остановившийся Docker Container. Для корректной работы команды в нее нужно добавить название или ID нужного контейнера.docker container inspect [OPTIONS] CONTAINER [CONTAINER...]
. Эта команда похожа на docker image inspect
и показывает пул свойств контейнера. Это могут быть CMD, Volumes, Images, порты, аргументы, пути, версии Python и т.д.docker container logs [OPTIONS] CONTAINER
. Очень полезная команда, с помощью которой можно отслеживать логи контейнера. Например, я использовал Docker Container для тестов апликухи на PySpark, и мне действительно были нужны логи. С ними я мог убедиться, хорошо ли прошли все тесты:Это виртуальное окружение, которое создается с помощью Python или другого приложения. Предположим, нам нужно создать venv в Docker container. Представим себе такие ступеньки, как на иллюстрации. На самом высоком уровне расположена виртуальная машина — большая, сложная, обременительная. Далее следует Docker Container — более легкий и компактный при запуске и управлении. На низшем уровне расположен Virtualenv — еще более простое решение, которое может потребоваться в определенных ситуациях.
Например, вам нужно несколько приложений с одним Python, но с разными библиотеками. В таком случае вы можете создать три разделенных виртуальных окружения со своими наборами библиотек. Так удастся не засорять один Python со всеми возможными библиотеками:
Для запуска Virtualenv необходимо установить Python, создать нужное количество виртуальных окружений и установить соответствующие вашим потребностям библиотеки. Существует множество способов создания Virtualenv в контейнерах. Я рассмотрю три основных метода: с помощью Python Virtual Environment, Poetry и Conda.
Берем официальный Python и создаем ENV. Это переменная, которой можно присвоить виртуальный энвайромент, чтобы он всегда цеплялся к Python. Для этого с помощью pip
устанавливаем virtualenv
и создаем виртуальное окружение. А дальше остается активировать Python, установить реквайерментсы и скопировать проект, который уже можно запускать.
Фактически вы прописываете шаги, которые сами выполняли бы в контейнере:
Альтернативный вариант — с библиотекой Poetry. В этом случае через pip
устанавливаем Poetry, создаем рабочую директорию и копируем проект. В следующем примере я сначала скопировал все необходимые для построения виртуального окружения команды, а затем ранил это окружение с помощью Poetry. Как только все установилось, копируем проект и запускаем Poetry с необходимыми библиотеками:
Этот способ я лично часто использую в работе. Запускаем имеющийся контейнер, в котором можно увидеть разные команды. Устанавливаем Conda и прописываем conda activate environment
для активации этого инструмента. После этого у вас уже есть запущенный virtual environment от Conda (второй скриншот). Далее можно использовать Python-команды установленного виртуального окружения:
Благодаря одной специфической команде в Docker Container вы можете зайти в контейнер (именно в его CMD) и посмотреть, что там есть. Для этого нужно прописать docker exec -it
и название контейнера. А затем задать команду ls
, чтобы получить список всех файлов и убедиться, что ничего не потерялось.
Для создания виртуального энвайронмента в контейнере с помощью Conda вам понадобится официальный Image Conda из Docker Hub. Далее прописываете variables. В моем примере это Java и Path. Затем необходимо создать рабочую директорию, скопировать проект, обновить, установить Java и удалить все cache-файлы. После этого прописать команду conda create -n my_venv
с указанием нужной версии Python, активировать все с помощью команды echo bin/bash/ -c “source activate my_venv”
и установить ревайроментсы.
Последние могут быть какими угодно. Они устанавливаются при запуске контейнера именно для нашего виртуального окружения:
В заключение я бы хотел рассмотреть Docker Compose. Преимущество Docker над виртуальной машиной уже понятно: он надежно изолирует контейнеры друг от друга.
Если у вас одно приложение, которое выполняется без разных зависимостей и связи с базой данных, Docker Container — идеальный вариант.
Но ведь веб-разработчикам часто нужен не один Image. Например, нужно иметь Django и подключить базу данных PostgreSQL. Это невозможно, ведь контейнеры изолированы.
В этом случае на помощь приходит Docker Compose. Он позволяет управлять несколькими контейнерами одновременно и запускать одновременно много сервисов, которые должны работать друг с другом.
Docker Compose устанавливает связи между отдельными контейнерами и фактически складывает их в единое целое. С помощью нескольких команд вы можете прописать все зависимости для веб-приложения: и упомянутые Django из PostgreSQL, и nginx, и php, и phpMyAdmin и т.д.
Давайте посмотрим на примере, как это работает. Сначала вы устанавливаете проект Django с зависимостями и запускаете его. Далее нужно связать веб-приложение и базу данных. Для этого в Docker Compose обозначаете его версию и взаимодействующие сервисы. В нашем случае это web и db.
В веб-приложении я прописал билдинг, volumes, порты и зависимости. Само приложение будет зависеть от базы данных. В db я указал нужный Image (здесь это sqlite
), путь volumes и environment variables, который будет использоваться для запуска. Все это достаточно просто. Если возникнут вопросы, всегда можно обратиться к Docker Hub. Там ясно описано, как оформить Docker Compose.
Как видите, Docker может значительно упростить работу и повысить эффективность ваших приложений.
Этот инструмент действительно мощный с развитым функционалом и множеством дополнительных сервисов. В этих двух статьях я описал лишь небольшую часть того, что стоит знать о Docker. Но вы можете пойти дальше, изучать и использовать все его возможности для еще большей производительности.
Читайте также: Удобнее виртуальной машины: для чего нужен Docker и как он работает — разбираем основные команды
В благословенные офисные времена, когда не было большой войны и коронавируса, люди гораздо больше общались…
Вот две истории из собственного опыта, с тех пор, когда только начинал делать свою карьеру…
«Ты же программист». За свою жизнь я много раз слышал эту фразу. От всех. Кто…
Отличные новости! Если вы пропустили, GitHub Copilot — это уже не отдельный продукт, а набор…
Несколько месяцев назад мы с командой Promodo (агентство инвестировало в продукт более $100 000) запустили…
Пару дней назад прочитал сообщение о том, что хорошие курсы могут стать альтернативой классическому образованию.…