← Назад к вопросам

Как работает Docker?

2.3 Middle🔥 251 комментариев
#DevOps и инфраструктура

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как работает Docker

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

Основные концепции

Контейнер — изолированный процесс на одной машине, который имеет свою файловую систему, сеть и окружение.

Образ (Image) — шаблон для создания контейнеров. Это read-only слои, которые содержат весь необходимый код и зависимости.

Вот простая аналогия:

  • Образ — как класс в ООП
  • Контейнер — как экземпляр класса

Docker архитектура

Компьютер хоста содержит Docker Daemon, который управляет контейнерами. Каждый контейнер — изолированный процесс.

Слои образа (Image Layers)

Образ состоит из множества слоёв (layers). Каждый слой — это результат команды в Dockerfile:

FROM python:3.9
WORKDIR /app
COPY . /app
RUN pip install -r requirements.txt
EXPOSE 8000
CMD ["python", "app.py"]

Каждый слой read-only. Когда контейнер запускается, Docker добавляет сверху тонкий read-write слой для изменений.

Как работает изоляция

Docker использует технологии Linux для изоляции:

1. Namespaces — изоляция ресурсов:

  • PID namespace — контейнер видит только свои процессы
  • Network namespace — контейнер имеет свою сетевую стек
  • Mount namespace — контейнер имеет свою файловую систему
  • IPC namespace — изолированная inter-process communication
  • UTS namespace — изолированное имя хоста

2. cgroups (Control Groups) — ограничение ресурсов:

docker run --memory=512m --cpus=0.5 ubuntu

Контейнер может использовать только 512MB памяти и 0.5 CPU.

Жизненный цикл контейнера

# Шаг 1: Создание образа из Dockerfile
docker build -t myapp:1.0 .

# Шаг 2: Запуск контейнера
docker run -d --name myapp myapp:1.0

# Шаг 3: Проверка статуса
docker ps

# Шаг 4: Остановка
docker stop myapp

# Шаг 5: Удаление
docker rm myapp

Docker Compose для многоконтейнерных приложений

version: '3.8'
services:
  web:
    build: .
    ports:
      - "8000:8000"
    environment:
      - DATABASE_URL=postgres://db:5432/mydb
    depends_on:
      - db
    volumes:
      - ./app:/app

  db:
    image: postgres:13
    environment:
      - POSTGRES_DB=mydb
      - POSTGRES_PASSWORD=secret
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:
docker compose up

web может обращаться к db через имя хоста "db". Docker автоматически создаёт сеть между контейнерами.

Том (Volumes) для сохранения данных

По умолчанию, когда контейнер удаляется, все данные теряются. Для сохранения данных используются тома:

docker volume create mydata
docker run -v mydata:/app/data -d myapp

Типы монтирования:

  • Volume: управляется Docker
  • Bind mount: файл/папка хоста подключается к контейнеру
docker run -v /home/user/app:/app myapp

Сеть в Docker

docker network create mynet
docker run -d --name web --network mynet myapp
docker run -d --name db --network mynet postgres

web может обращаться к db через имя хоста.

Пример: Python приложение в Docker

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)

Dockerfile:

FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY app.py .
EXPOSE 5000
CMD ["python", "app.py"]

requirements.txt:

Flask==2.0.0

Запуск:

docker build -t myflask:1.0 .
docker run -d -p 5000:5000 myflask:1.0
curl http://localhost:5000
# Hello from Docker!

Преимущества Docker

  1. Изоляция — приложение не конфликтует с другими
  2. Портативность — работает везде одинаково
  3. Лёгкость — контейнеры быстрее виртуальных машин
  4. Масштабируемость — легко запустить много контейнеров
  5. Версионирование — тэги образов (v1.0, v2.0)
  6. Кэширование — слои образа кэшируются

Выводы

  • Docker контейнер — это изолированный процесс с собственной ФС и окружением
  • Образ — read-only шаблон, контейнер — запущенный экземпляр
  • Слои — образ состоит из слоёв, контейнер добавляет сверху read-write слой
  • Namespaces + cgroups — механизмы изоляции и ограничения ресурсов
  • Docker Compose — для управления многоконтейнерными приложениями
  • Тома — для сохранения данных между запусками контейнеров
Как работает Docker? | PrepBro