Обложка статьи про docker

База Docker просто и быстро

Представьте что вы фермер, чтобы вырастить определеную культуру необходима теплица, и конкретная температура и влажность. При других условиях культура увянет.

К чему я это говорю, да все просто, в айтишке некоторые легаси приложения могут не запускатся на новых версиях ПО (компиляторах/ интерпритаторах). И Docker нам позволит воссоздать условия для нормальной работы приложения.

Перед тем как познакомится с докером, необходимо понять 2 абстракции.

Образ [Image] — это как раз и есть наша среда: теплица, температура, влажность. Для простоты буду называть его «Окружением».

Контейнер [Container] — это само приложение с окружением.

Как это работает

Допустим, нам необходимо запустить скрипт написаный для python3.9. Сделаем скрипт который будет требовать эту версию:

Python
import sys
import time

version = sys.version_info


class UnexpectedException(Exception):
    pass


if version.major == 3 and version.minor == 9:
    while True:
        print("work")
        time.sleep(1)
else:
    raise UnexpectedException("Произошла непредвиденная ошибка")

Данный скрипт проверяет версию Python, и «работает» только при 3.9, остальные версии вызывают UnexpectedException.

Но вот какая беда. На системе локально у нас python3.13 стоит.

Попытка запустить естественно вызывает исключение.

Переустанавливать его будет сложно, а о uv мы не знаем. Что же делать, вот тут и приходит Docker.

Написание файла сборки окружения

Создаем небольшой файл с названием Dockerfile (О его содержимом подробно раскажу в другой статье):

Dockerfile
FROM python:3.9-alpine
COPY . .
CMD ["python3","-u","main.py"]

Что тут происходит? Все предельно просто.

В первой строке мы берем окружение [образ python] с container registry по дефолту c dockerhub. И выбираем конкретную версию python 3.9 (по-нормальному это называется метка/label). Также берем в качестве начального дистрибутива alpine, в нашем случае это ни на что не влияет, просто alpine образы занимают меньше места на жестком диске.

Поскольку запуск у нас будет производится в виртуальной системе, нам нужно отдать ей запускаемый файл, [COPY . . ] копирует из текущей директории все файлы и папки с нашего компьютера в текущую директорию в окружение.

Далее, мы даем команду которая будет выполнятся уже в контейнере. CMD и вторым аргументом пишем команду для выполения, ка, в моем случае python3 -u main.py. Тоесть запускаем файл через python3 и -u это небуферизованный вывод чтобы выводилось в консоль все сразу, а не после завершения.

Начинаем сборку нашего окружения

Bash
docker build -t test-version .

Данная команда позволяет собрать все нужное в окружение/ образ докер. Она скачает python определенной версии, она скопирует файлы и в данном случае добавит название к образу test-version [-t флаг это добавить название образу]. Точка в конце обязательна и обозначает что мы ищем файл Dockerfile в текущей директории и начинаем сборку.

Все, окружение собрано, надо его запустить, для этого

Bash
docker run test-version

Все работает, программа запущена на компьютере с версией python3.13 в контейнере в котором python3.9. Только, контейнер запущен не в фоне, и привыходе из терминала он остановится. Переделаем чтобы он был в фоне, добавим флаг -d detach.

Bash
docker run -d test-version 

После этой команды мы получим хэш контейнера по которому к нему можно обращатся.

И через команду ниже мы можем убедится что контейнер работает

Bash
docker ps

Что еще можно делать с контейнерами

Далее будет использоватся container id, который можно получить через docker ps.

Контейнеры можно стопать. Тоесть останавливать чтобы потом запустить позже:

Bash
docker stop [id]

Можно запустить после остановки:

Bash
docker start [id]

Можно удалить контейнер, если он уже не нужен:

Bash
docker rm [id]

Можно вывести логи контейнера, и узнать что же произошло с приложением. А добавив флаг -f можно следить за логами в реальном времени

Bash
docker logs [id]

Мы в Telegram

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

More posts