Lines
Slide
Slide
Slide
Slide
Slide
Slide
Slide
Slide

INVENTED
WORLDS

Опубликовано: 11.02.2025

Docker

Docker — это платформа для контейнеризации, которая позволяет упаковывать приложения и их зависимости в единый, изолированный контейнер. Контейнер — это легковесная, автономная среда, которая содержит всё необходимое для работы приложения: код, runtime (среду выполнения), библиотеки, системные инструменты и конфигурации. Главная идея в том, чтобы обеспечить консистентность: приложение будет работать одинаково на любой системе, где установлен Docker, будь то локальный ноутбук, сервер или облачная инфраструктура. Docker использует технологии контейнеризации на уровне операционной системы (в основном, на Linux это cgroups и namespaces). В отличие от виртуальных машин, которые эмулируют целую ОС с ядром и всем остальным, контейнеры делят ядро хоста (той системы, где запущен Docker) и изолируют только процессы, файловую систему и сеть. Это делает их гораздо легче и быстрее — запуск занимает секунды, а не минуты, как у VM. Основные компоненты: 1. Docker Engine — это сердце Docker’а. Демон (фоновый процесс), который управляет контейнерами, образами и сетями. Есть клиентская часть (CLI), через которую ты отдаёшь команды вроде docker run. 2.Образ (Image) — это "чертеж" контейнера, readonly-шаблон, из которого создаются контейнеры. Образы строятся на основе Dockerfile — скрипта с инструкциями (например, "установи Python, скопируй код, запусти сервер"). Образы хранятся локально или в реестрах вроде Docker Hub. 3. Контейнер — это запущенный экземпляр образа. Ты можешь создавать сколько угодно контейнеров из одного образа, и каждый будет изолирован от других. 4. Dockerfile — файл с инструкциями для сборки образа. Зачем это нужно? - Портативность: один раз настроил — работает везде. Не надо мучиться с "на моём компе работает, а на сервере нет". - Изоляция: каждый контейнер независим. Если один упал, другие не затронуты. И зависимости не конфликтуют. - Масштабируемость: легко запускать много контейнеров, особенно с оркестраторами вроде Kubernetes или Docker Swarm. - Удобство разработки: можно локально воспроизвести production-среду (например, с базой данных, веб-сервером и кэшем в разных контейнерах).

Установка Docker

https://www.docker.com/get-started Скачайте и установите Docker Desktop. Docker Desktop включает в себя Docker Engine, Docker CLI, Docker Compose и Kubernetes для локальной разработки wsl --install Перезапустить комп Сборки пайтона https://hub.docker.com/_/python

Начало работы

Чтобы проверить что всё работает: docker --version docker run hello-world

Подготовка к контейнеризации

Создать requirements.txt из виртуального окружения: pip freeze > requirements.txt asgiref==3.8.1 beautifulsoup4==4.12.3 certifi==2024.12.14 charset-normalizer==3.4.1 Django==4.2.17 django-crontab==0.7.1 django-debug-toolbar==4.4.6 django-js-asset==3.0.1 gunicorn==22.0.0 html5lib==1.1 idna==3.10 packaging==24.2 pillow==11.0.0 psycopg2==2.9.10 python-dotenv==1.0.1 requests==2.32.3 six==1.17.0 soupsieve==2.6 sqlparse==0.5.2 tzdata==2024.2 Unidecode==1.3.8 urllib3==2.3.0 webencodings==0.5.1 whitenoise==6.9.0 (pip install --no-cache-dir -r requirements.txt) В settings.py прописать всё для статики:

STATIC_URL = '/static/'
STATICFILES_DIRS = [
    BASE_DIR / 'static',
]
STATIC_ROOT = BASE_DIR / 'staticfiles'
MEDIA_URL = 'media/'
MEDIA_ROOT = BASE_DIR / 'media'
STATICFILES_STORAGE = "whitenoise.storage.CompressedManifestStaticFilesStorage"
MIDDLEWARE = [
...
    "whitenoise.middleware.WhiteNoiseMiddleware",
...
	]

В settings.py прописать всё для секюритности окружения:

from dotenv import load_dotenv
load_dotenv()
SECRET_KEY = os.getenv('SECRET_KEY')
DEBUG = os.getenv('DEBUG', '0') == '1'
ALLOWED_HOSTS = os.getenv('ALLOWED_HOSTS', '').split()
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': os.getenv('DB_NAME'),
        'USER': os.getenv('DB_USER'),
        'PASSWORD': os.getenv('DB_PASSWORD'),
        'HOST': os.getenv('DB_HOST'),
        'PORT': os.getenv('DB_PORT'),
    }
}

Создать .env

SECRET_KEY='django-insecure-блаблабла'
DEBUG=1
ALLOWED_HOSTS=localhost 127.0.0.1 [::1]
DB_NAME=inventedworlds
DB_USER=andedali
DB_PASSWORD=Pass
# DB_HOST=localhost
DB_HOST=db
DB_PORT=5432

Создать .dockerignore

.git
.gitignore
.env
.venv
.vscode
__pycache__
*.pyc
*.pyo
*.pyd
.Python
env/
venv/
*.log
staticfiles/
media/

Создать Dockerfile и docker-compose.yml

Dockerfile

FROM python:3.12.9-bookworm

# Установка системных зависимостей
RUN apt-get update && apt-get install -y --no-install-recommends \
    gcc \
    libpq-dev \
    cron \
    postgresql-client \
    netcat-openbsd \
    && rm -rf /var/lib/apt/lists/*

# Обход ограничений PEP 668
ENV PIP_BREAK_SYSTEM_PACKAGES=1

# Рабочая директория
WORKDIR /app

# Копируем зависимости
COPY requirements.txt .

# Установка Python-зависимостей
RUN pip install --no-cache-dir -r requirements.txt

# Копируем весь проект
COPY . .

# Сборка статики Django
RUN python manage.py collectstatic --noinput --clear

# Настройка cron-логов
RUN ln -sf /dev/stdout /app/cron.log

# Команда запуска
CMD ["sh", "-c", "\
    python manage.py migrate && \
    python manage.py crontab add && \
    cron && \
    gunicorn inventedworlds.wsgi:application --bind 0.0.0.0:8000\
    "]

docker-compose.yml

services:
  web:
    build: .
    restart: unless-stopped
    ports:
      - "8000:8000"
    env_file:
      - .env
    environment:
      - DJANGO_SETTINGS_MODULE=inventedworlds.settings
      - PYTHONUNBUFFERED=1
    depends_on:
      db:
        condition: service_healthy
    volumes:
      - static_volume:/app/staticfiles
      - media_volume:/app/media
    command: >
      sh -c "while ! /usr/bin/pg_isready -h db -U $$DB_USER -d $$DB_NAME; do sleep 2; done;
             python manage.py migrate;
             python manage.py crontab add;
             cron;
             gunicorn inventedworlds.wsgi:application --bind 0.0.0.0:8000"

  db:
    image: postgres:15
    restart: unless-stopped
    env_file:
      - .env
    environment:
      - POSTGRES_DB=${DB_NAME}
      - POSTGRES_USER=${DB_USER}
      - POSTGRES_PASSWORD=${DB_PASSWORD}
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    healthcheck:
      test: ["CMD-SHELL", "/usr/bin/pg_isready -U ${DB_USER} -d ${DB_NAME}"]
      interval: 5s
      timeout: 5s
      retries: 10
    ports:
      - "5432:5432"

volumes:
  postgres_data:
  static_volume:
  media_volume:

Запуск контейнера

Остается кеш docker-compose up --build Полная пересборка docker-compose down -v; docker-compose build --no-cache; docker-compose up Проверить статику после запуска контейнера docker-compose exec web ls -la /app/staticfiles docker-compose exec web chmod -R 755 /app/staticfiles

Работа с БД

docker-compose exec web python manage.py makemigrations docker-compose exec web python manage.py migrate docker-compose exec web python manage.py createsuperuser docker-compose exec db psql -U andedali -d inventedworlds -c "SELECT * FROM auth_user;" фикстуры сохранить python -Xutf8 manage.py dumpdata lessons.Article --indent 4 --format json -o fixtures/lessons/arricle.json загрузить docker-compose exec web python manage.py loaddata fixtures/lessons/arricle.json docker-compose exec web python manage.py loaddata fixtures/lessons/content.json docker-compose exec web python manage.py loaddata fixtures/news/parsers.json После внесения изменений локально docker-compose restart web

Комментарии

Комментариев пока нет.