Что такое Docker-контейнер?

Ответ

Docker-контейнер — это стандартизированная, легковесная и изолированная среда для запуска приложений. Он инкапсулирует приложение со всеми его зависимостями (код, библиотеки, системные инструменты, настройки) в один пакет. Контейнеры создаются на основе Docker-образов (images) и используют механизмы изоляции ядра операционной системы (такие как namespaces и cgroups), но, в отличие от виртуальных машин, не виртуализируют аппаратное обеспечение, что делает их значительно более эффективными.

Почему Docker-контейнеры важны? Они решают проблему "работает у меня на машине", обеспечивая консистентность среды выполнения от разработки до продакшена. Это упрощает развертывание, масштабирование и управление приложениями, а также способствует микросервисной архитектуре.

Ключевые особенности и преимущества:

  • Портативность: Контейнер работает одинаково на любой системе, где установлен Docker, независимо от базовой ОС хоста.
  • Изоляция: Каждый контейнер изолирован от других контейнеров и от хост-системы. Это предотвращает конфликты зависимостей и повышает безопасность.
  • Эффективность: Контейнеры используют ресурсы хост-системы напрямую, без накладных расходов на полную виртуализацию ОС, что делает их быстрыми и легковесными по сравнению с виртуальными машинами.
  • Воспроизводимость: Dockerfile позволяет точно описать процесс сборки образа, гарантируя, что среда всегда будет одинаковой.

Пример Dockerfile и запуск:

Предположим, у нас есть простое Python-приложение app.py и файл requirements.txt.

# Dockerfile
FROM python:3.9-slim-buster # Используем легковесный образ Python
WORKDIR /app                # Устанавливаем рабочую директорию внутри контейнера
COPY requirements.txt .     # Копируем файл зависимостей
RUN pip install -r requirements.txt # Устанавливаем зависимости
COPY . .                    # Копируем остальной код приложения
CMD ["python", "app.py"]    # Команда, которая будет выполняться при запуске контейнера

Пример app.py:

# app.py
from flask import Flask
app = Flask(__name__)

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

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

Сборка образа и запуск контейнера:

# Сборка Docker-образа с тегом 'my-python-app'
docker build -t my-python-app .

# Запуск контейнера в фоновом режиме (-d) и маппинг порта 5000 контейнера на порт 8080 хоста (-p)
docker run -d -p 8080:5000 my-python-app

Теперь приложение доступно по адресу http://localhost:8080.