Управление ресурсами Docker

🕒 3 мин.

В этой статье я разбираю две темы: ограничение ресурсов Docker контейнеров в docker-compose.yml, и очистка системы от docker мусора.

Подготовка окружения

В этой статье я использую окружение оставшееся от предыдущих уроков по docker:

А также, я для удобства выложил тестовый проект в репозиторий Git Hub. Теперь развернуть его можно с помощью следующих команд:

$ git clone https://github.com/alexsem88/docker-learning.git
$ cd docker-learning/
$ docker compose up --build -d

$ docker compose ps
SERVICE   CREATED          STATUS                    PORTS
db        30 seconds ago   Up 29 seconds (healthy)   5432/tcp
redis     30 seconds ago   Up 29 seconds (healthy)   6379/tcp
web       30 seconds ago   Up 24 seconds (healthy)   0.0.0.0:5000->5000/tcp, [::]:5000->5000/tcp

А с помощью следующей команды посмотрим сколько ресурсов занимает каждый контейнер проекта:

$ docker compose stats

CONTAINER ID   NAME     CPU %    MEM USAGE / LIMIT     MEM %   NET I/O        BLOCK I/O   PIDS 
fe7de63f2f39   web-1    0.01%    25.97MiB  / 15.54GiB  0.16%   12.5kB / 126B  0B / 147kb  1
de4927f806e9   db-1     0.00%    20.05MiB  / 15.54GiB  0.13%   18kB / 126B    0B / 1.05MB 6
acfe3fa8070b   redis-1  0.29%    4.652MiB  / 15.54GiB  0.03%   18.3kB / 126B  0B / 0B     6
  • Это что-то вроде top для Docker контейнеров.
  • Показывает контейнеры и сколько ресурсов они занимают (cpu, mem, net i/o, block i/o).
  • PIDS — это количество процессов в контейнере
    • web-1 — здесь работает 1 процесс нашего приложения написанного на Python
    • db-1 и redis-1 — базы данных и кэш-серверы часто создают несколько дочерних процессов или потоков для обработки соединений или фоновых задач.

Кстати, есть ещё команда:

$ docker stats
  • Она показывает информацию по всем запущенным контейнерам, а не только в пределах одного docker-compose.yml файла.

Очистка системы от docker мусора

Чтобы понять, сколько места занято образами, контейнерами, томами и кешем выполним:

$ docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          27        10        5.364GB   2.744GB (51%)
Containers      11        3         215.4kB   70.67kB (32%)
Local Volumes   12        6         651.1MB   555.2MB (85%)
Build Cache     298       0         711.8MB   562.9MB
  • RECLAIMABLE — это то что можно безопасно удалить.
    • Images — образы, которые не используются запущенными и остановленными контейнерами.
    • Containers — остановленные контейнеры.
    • Local Volumes — неиспользуемые тома.
    • Build Cache — неиспользуемый кеш.

Чтобы удалить остановленные контейнеры — выполним:

$ docker container prune

А чтобы удалить неиспользуемые тома — выполним:

$ docker volume prune

Чтобы удалить неиспользуемые образы — выполним:

$ docker image prune -a

После очистки ещё раз посмотрим на вывод команды:

$ docker system df 
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          3         3         499.7MB   499.7MB (100%)
Containers      3         3         144.7kB   0B (0%)
Local Volumes   11        2         651.1MB   603.2MB (92%)
Build Cache     298       0         711.8MB   686.3MB

Ограничение ресурсов в контейнере

Вначале остановим наш стек:

$ docker compose down

И ограничим один из контейнеров в ресурсах (например, сервис web). Чтобы это сделать отредактируем файл docker-compose.yml, в который добавим 2-е опции:

  • mem_limit
  • cpus

Получиться должно вот так (это часть файла):

services:
  web:
    build:
      context: .
      args:
        - PYTHON_VERSION=3.11
    mem_limit: 512m # <- ограничение по памяти
    cpus: 0.5       # <- ограничение по cpu (50% одного ядра)
    ports:
      - "${FLASK_PORT}:5000"

Пересоберём проект:

$ docker compose up --build -d

Посмотрим ещё раз на ресурсы, которые потребляют контейнеры:

$ docker compose stats 

CONTAINER ID   NAME     CPU %    MEM USAGE / LIMIT     MEM %   NET I/O        BLOCK I/O   PIDS 
6df5bc4b9b75   web-1    0.01%    25.98MiB  / 512MiB    0.16%   12.5kB / 126B  0B / 147kb  1
040c9c53bbdb   db-1     0.00%    18.84MiB  / 15.54GiB  0.13%   18kB / 126B    0B / 1.05MB 6
2b8d4cdffa08   redis-1  1.06%    4.652MiB  / 15.54GiB  0.03%   18.3kB / 126B  0B / 0B     6
  • Как видим, контейнер web имеет лимит по памяти 512MiB.

Если понравилась статья, подпишись на мой канал в VK или Telegram.

Мы используем cookie-файлы для наилучшего представления нашего сайта. Продолжая использовать этот сайт, вы соглашаетесь с использованием cookie-файлов.
Принять
Отказаться
Политика конфиденциальности