Docker — это бесплатное решение с открытым исходным кодом для разработки, развертывания и управления приложениями в легковесной виртуализации на уровне ОС. В этом руководстве мы продемонстрируем создание Python приложения внутри контейнера Docker.
Prerequisites
Для выполнения шагов, описанных в этом руководстве, вам понадобятся следующие компоненты:
-
Система Linux. Ознакомьтесь с настройкой собственного VPS на Ubuntu на CloudSigma.
-
Установлена и настроена последняя версия Docker. Узнайте больше об установке Docker на Ubuntu.
Docker Containers
При запуске различных программ в одной и той же среде что-то может пойти (и пойдет) не так. Чем больше программ вы добавляете, тем более нестабильной становится система. Для обычных людей это может быть не так критично. Однако, когда речь идет о критически важных приложениях, последствия могут быть серьезными.
Чем больше приложений появляется в системе, тем больше поверхность атаки. Одно скомпрометированное приложение может легко привести к падению всей системы.
Для решения этих проблем мы можем использовать контейнеры Docker для изолирования на уровне программного обеспечения:
-
Приложения внутри контейнера будут иметь ограниченный доступ к файлам.
-
Контейнеризированные приложения не могут видеть другие процессы, запущенные в системе.
-
Контейнеру может быть выделено определенное количество аппаратных ресурсов.
-
Сетевые порты контейнера не открыты наружу.
-
Согласованная упаковка практически чего угодно для локальных сред и сред продакшена.
Для демонстрации мы создадим простой сервер Python внутри контейнера Docker, преобразуем контейнер в образ и развернем этот образ в тестовой рабочей среде.
Шаг 1 – Настройка файловой системы
Для размещения проекта сначала мы создадим выделенную директорию:
|
1 |
mkdir -pv python-server-container/ |
|
1 |
cd !$ |
Внутри этой директории создайте поддиректорию src для хранения нашего кода:
|
1 |
mkdir -pv src/ |
Шаг 2 – Создание сервера Python
На этом шаге мы создадим простой HTTP-сервер на Python. Создайте файл server.py:
|
1 |
touch server.py |
Откройте его в текстовом редакторе:
|
1 |
nano server.py |

Введите следующий код Python:
|
1 2 3 4 5 6 7 8 9 10 11 |
from http.server import HTTPServer, SimpleHTTPRequestHandler def run(server_class=HTTPServer, handler_class=SimpleHTTPRequestHandler): """server entrypoint""" server_address = ("0.0.0.0", 8080) httpd = server_class(server_address, handler_class) print("starting server...") httpd.serve_forever() if __name__ == "__main__": run() |

Здесь:
-
Мы используем класс HTTPServer и запрашиваем обработчик из стандартной библиотеки Python, сохраняя программу простой.
-
Функция run инициализирует экземпляр HTTPserver.
-
Как показывают аргументы server_address, сервер будет прослушивать любые входящие подключения на порту 8080.
Теперь проверим, работает ли сервер должным образом. Запустите сервер:
|
1 |
python3 server.py |
![]()
В новом окне терминала мы можем использовать curl для отправки запроса на сервер:
|
1 |
curl -iv localhost:8080 |

Кроме того, вы можете открыть ссылку в веб-браузере:
|
1 |
http://localhost:8080 |
Шаг 3 – Создание Dockerfile
Файл Dockerfile содержит необходимые инструкции для создания образа Docker. Инструкции в файле выполняются последовательно. Узнайте больше о Dockerfile.
Создайте новый Dockerfile для нашего проекта:
|
1 |
touch Dockerfile |
Теперь мы добавим в него необходимый код. Откройте его в текстовом редакторе:
|
1 |
nano Dockerfile |
Введите следующий код:
|
1 2 3 4 5 6 7 8 9 |
FROM python:latest ENV SRC_DIR /usr/bin/src/test_server/src COPY src/* ${SRC_DIR}/ WORKDIR ${SRC_DIR} ENV PYTHONUNBUFFERED=1 CMD ["python", "server.py"] |
Здесь,
-
Любой Dockerfile должен начинаться с FROM директивы. В нашем случае мы объявляем Python в качестве основы Docker-образа.
-
Директива ENV SRC_DIR задает расположение директории контейнера.
-
Директива COPY копирует файлы из директории src, в которой сейчас находится сервер Python.
-
Переменная PYTHONBUFFERED=1 указывает, что Python будет выводить и записывать логи напрямую в STDOUT. В противном случае логи не отправлялись бы ни в какой буфер.
-
Директива CMD задает команду по умолчанию для запуска при выполнении контейнера. В данном случае мы используем эту директиву для запуска нашего Python-сервера.
Шаг 4 – Генерация Docker-образа
Когда Dockerfile готов, мы можем собрать образ. Запустите следующую команду Docker, чтобы начать процесс:
|
1 |
docker build . -t python_server |

Здесь,
-
Флаг -t используется для присвоения тега нашему Docker-образу как python_server.
-
Docker загрузит все необходимые компоненты и объединит их в образ.
Шаг 5 – Запуск образа
Образ готов к развертыванию. Мы можем запустить его с помощью следующей команды:
|
1 |
docker run -p 8080:8080 python_server |

Здесь мы перенаправляем порт 8080 с локальной машины на Docker-образ с помощью флага -p .
Мы можем легко проверить, запущен ли и работает ли сервер, с помощью curl:
|
1 |
curl -iv localhost:8080 |
Шаг 6 – Остановка сервера
В терминале нажмите “Ctrl + C”, чтобы завершить процесс Docker:

Шаг 7 – Экспорт и импорт Docker-образа
Теперь у нас есть функциональный Docker-образ, содержащий наш Python-сервер. С помощью функций экспорта и импорта Docker мы можем перенести его на любую другую систему.
Сначала проверьте список Docker-образов в текущей системе:
|
1 |
docker images |

Наша цель — Docker-образ python_server, который мы только что создали. Следующая команда экспортирует его в виде TAR-архива:
|
1 |
docker save python_server:latest > python_server.tar |

После переноса файла python_server.tar на целевую машину используйте следующую команду для импорта Docker-образа:
|
1 |
docker load < python_server.tar |
Заключение
В этом руководстве мы продемонстрировали создание Docker-образа из приложения на Python. Мы создали простой веб-сервер на Python и собрали из него Docker-образ. Теперь этот Docker-образ можно развернуть в любой среде и ожидать стабильной работы.
Хотите узнать больше о Docker? Ознакомьтесь со следующими руководствами:
-
Сборка и развертывание приложения Flask с помощью Docker на Ubuntu 20.04
-
Как защитить и масштабировать приложение Django с помощью Docker, Nginx и Let’s Encrypt
-
Как развернуть WordPress с помощью контейнеров Docker на Ubuntu 20.04
Приятной работы!




Комментарии
Комментариев пока нет. Будьте первым.