В тази статия ще се потопим в света на контейнеризацията и как тя може да подобри процеса на разработка и разгръщане на Python приложения. Ще се фокусираме върху Docker – една от най-популярните платформи за контейнеризация, която се използва широко в света на DevOps.

Какво представлява контейнеризацията?

Контейнеризацията е техника за опаковане на софтуерни приложения заедно с всичките им зависимости в стандартизирани единици, наречени контейнери. Контейнерите предоставят изолирана среда, която включва всичко необходимо за изпълнението на приложението – код, библиотеки, системни инструменти и настройки.

Основното предимство на контейнерите е тяхната преносимост – те могат да бъдат лесно прехвърляни и стартирани на всяка машина с инсталиран Docker, без значение от операционната система или хардуерната конфигурация. Това елиминира много от проблемите, свързани с разликите в средите за разработка, тестване и продукция.

Контейнерите са леки и ефективни, тъй като споделят ядрото на операционната система на хоста и не изискват виртуализация на хардуера като виртуалните машини. Това означава, че могат да бъдат стартирани бързо и да консумират минимално количество ресурси.

Въведение в Docker

Docker е open-source платформа, която опростява създаването, разгръщането и управлението на контейнери. Тя предоставя инструменти и API за опаковане на приложения в портативни контейнери, които могат да бъдат споделяни и изпълнявани навсякъде.

Основните понятия в Docker са:

  • Образ (Image): Шаблон, съдържащ всичко необходимо за създаване на контейнер, включително код, библиотеки, среда и конфигурация.
  • Контейнер (Container): Екземпляр на образ, който може да бъде стартиран и изпълняван изолирано от други контейнери.
  • Dockerfile: Текстов файл, съдържащ инструкции за изграждане на образ.
  • Регистър (Registry): Хранилище за съхранение и споделяне на Docker образи, като Docker Hub или частен регистър.

Създаване на Docker образ за Python приложение

Нека сега видим как да опаковаме Python приложение в Docker контейнер. За целта ще създадем просто Flask уеб приложение и ще го „докеризираме“.

Първо, нека инициализираме нова директория и създадем файл app.py със следното съдържание:

 


from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return "Hello from Python and Docker!"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

Сега ще създадем Dockerfile, който описва как да изградим Docker образа:


# We use the official Python image as a base
FROM python:3.9

# We set the working directory in the container
WORKDIR /app

# We copy the application files into the container
COPY . .

# Install the requirments
RUN pip install flask

# Make port 5000 accessible
EXPOSE 5000

# We launch the application when the container is launched
CMD ["python", "app.py"]

За да изградим Docker образа, изпълняваме следната команда в терминала:


# Build the image
docker build -t my-python-app .

Това ще създаде образ с име „my-python-app“, използвайки инструкциите от Dockerfile. Сега можем да стартираме контейнер от този образ:


# Start a container from the image we built
docker run -p 5000:5000 my-python-app

Флагът -p свързва порт 5000 на хоста с порт 5000 в контейнера, правейки приложението достъпно на http://localhost:5000.
Ето го – имаме работещо Python приложение в Docker контейнер! Сега можем лесно да споделим с колеги файловете или да го разгърнем на сървър, без да се притесняваме за разлики в средата.

Използване на Docker Compose за многоконтейнерни приложения

В реалния свят приложенията често се състоят от множество взаимосвързани услуги (напр. уеб сървър, база данни, кеш), които трябва да работят заедно. Тук на помощ идва Docker Compose – инструмент за дефиниране и управление на многоконтейнерни приложения.

С Docker Compose можем да опишем цялата архитектура на приложението в един YAML файл и да управляваме всички услуги с една команда. Например, ето как би изглеждал docker-compose.yml файл за приложение с Flask и PostgreSQL:


version: '3'
services:
  web:
    build: .
    ports:
      - "5000:5000"
    depends_on:
      - db
    environment:
      - DATABASE_URL=postgresql://postgres:password@db/myapp
  db:
    image: postgres:13
    environment:
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=myapp

С една единствена команда docker-compose up можем да стартираме цялото приложение с правилно конфигурирани и свързани контейнери.

Разбира се, това е само повърхността – Docker предлага много повече функционалности като volumes за персистентно съхранение, мрежи за комуникация между контейнери, интеграция с оркестрационни платформи като Kubernetes и т.н.

Но дори базовото използване на Docker може да донесе големи ползи на всеки Python проект.

Приятно „докеризиране“ и до нови срещи!

Categorized in:

DevOps,

Last Update: май 3, 2024