Представьте что вы фермер, чтобы вырастить определеную культуру необходима теплица, и конкретная температура и влажность. При других условиях культура увянет.
К чему я это говорю, да все просто, в айтишке некоторые легаси приложения могут не запускатся на новых версиях ПО (компиляторах/ интерпритаторах). И Docker нам позволит воссоздать условия для нормальной работы приложения.
Перед тем как познакомится с докером, необходимо понять 2 абстракции.
Образ [Image] — это как раз и есть наша среда: теплица, температура, влажность. Для простоты буду называть его «Окружением».
Контейнер [Container] — это само приложение с окружением.
Как это работает
Допустим, нам необходимо запустить скрипт написаный для python3.9. Сделаем скрипт который будет требовать эту версию:
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 (О его содержимом подробно раскажу в другой статье):
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 это небуферизованный вывод чтобы выводилось в консоль все сразу, а не после завершения.
Начинаем сборку нашего окружения
docker build -t test-version .Данная команда позволяет собрать все нужное в окружение/ образ докер. Она скачает python определенной версии, она скопирует файлы и в данном случае добавит название к образу test-version [-t флаг это добавить название образу]. Точка в конце обязательна и обозначает что мы ищем файл Dockerfile в текущей директории и начинаем сборку.

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

И через команду ниже мы можем убедится что контейнер работает
docker ps
Что еще можно делать с контейнерами
Далее будет использоватся container id, который можно получить через docker ps.
Контейнеры можно стопать. Тоесть останавливать чтобы потом запустить позже:
docker stop [id]Можно запустить после остановки:
docker start [id]Можно удалить контейнер, если он уже не нужен:
docker rm [id]Можно вывести логи контейнера, и узнать что же произошло с приложением. А добавив флаг -f можно следить за логами в реальном времени
docker logs [id]

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