Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Как работает 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
- Изоляция — приложение не конфликтует с другими
- Портативность — работает везде одинаково
- Лёгкость — контейнеры быстрее виртуальных машин
- Масштабируемость — легко запустить много контейнеров
- Версионирование — тэги образов (v1.0, v2.0)
- Кэширование — слои образа кэшируются
Выводы
- Docker контейнер — это изолированный процесс с собственной ФС и окружением
- Образ — read-only шаблон, контейнер — запущенный экземпляр
- Слои — образ состоит из слоёв, контейнер добавляет сверху read-write слой
- Namespaces + cgroups — механизмы изоляции и ограничения ресурсов
- Docker Compose — для управления многоконтейнерными приложениями
- Тома — для сохранения данных между запусками контейнеров