🕒 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_limitcpus
Получиться должно вот так (это часть файла):
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.