Docker — это бесплатное решение с открытым исходным кодом для разработки, развертывания и управления приложениями в легковесной виртуализации на уровне ОС. В этом руководстве мы покажем, как создать приложение Python внутри контейнера Docker.
Предварительные требования
Для выполнения шагов, показанных в этом руководстве, вам понадобятся следующие компоненты:
-
Система Linux. Ознакомьтесь с материалом о настройке собственного Ubuntu VPS на CloudSigma.
-
Установлена и настроена последняя версия Docker. Узнайте больше об установке Docker на Ubuntu.
Контейнеры Docker
При запуске различных программ в одной и той же среде что-то может (и будет) ломаться. Чем больше программ вы добавляете, тем менее стабильной становится среда. Для обычных пользователей это может быть не так важно. Однако когда речь идет о критически важных приложениях, последствия могут быть серьезными.
Чем больше приложений появляется в системе, тем больше поверхность атаки. Одно скомпрометированное приложение может легко привести к падению всей системы.
Чтобы решить эти проблемы, мы можем использовать контейнеры Docker для изоляции на уровне ПО:
-
Приложения внутри контейнера будут иметь ограниченный доступ к файлам.
-
Контейнеризированные приложения не могут видеть другие процессы, запущенные в системе.
-
Контейнеру можно выделить определенный объем аппаратных ресурсов.
-
Сетевые порты контейнера не открыты наружу.
-
Единообразная упаковка практически чего угодно в локальной и production-средах.
Для демонстрации мы создадим простой Python-сервер внутри контейнера Docker, преобразуем контейнер в образ и развернем этот образ в условной production-среде.
Шаг 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
Удачных вычислений!

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