Привет, цифровой архитектор!
У тебя нет времени искать тонкости настройки Docker?
Собрал для тебя 10 ключевых команд и приёмов из архитектурных гайдов, которые обязательно нужно сохранить для работы в production.
1. Безопасность: Непривилегированный пользователь
Никогда не запускай контейнеры от имени
root. Атакующий может получить права root на хосте.# В Dockerfile создаем группу и непривилегированного пользователя 'app'
RUN groupadd -r app_grp && useradd -r -g app_grp app
USER app # Всегда переключаемся на непривилегированного пользователя
2. Ограничение возможностей ядра (Capabilities)
Docker по умолчанию включает много возможностей, но лучше их отключить и добавить только необходимые.
# Сбрасываем все Capabilities (CAP_DROP ALL)
docker run -ti --cap-drop ALL debian /bin/bash
# Добавляем только возможность привязки к низким портам (<1024)
docker run --cap-drop all --cap-add CAP_NET_BIND_SERVICE alpine:latest sh
# Запрет на повышение привилегий (hardening)
docker run --security-opt=no-new-privileges ubuntu bash
3. Оптимизация Dockerfile: Слияние RUN
Каждая инструкция
RUN создает новый уровень (layer), увеличивая размер образа. Объединяйте команды с && для минимизации слоев.# Плохо: 3 отдельных слоя
RUN apk update
RUN apk add nodejs nodejs-npm
RUN mkdir -p /app/public
# Хорошо: одна инструкция, один слой
RUN apk update && \
apk add nodejs nodejs-npm && \
mkdir -p /app/public /app/server
4. Управление томами (Volumes)
Для сохранения постоянных данных используй тома (
VOLUME).# Создание тома на хосте (local driver по умолчанию)
docker volume create my_data_vol
# Просмотр информации о томе (включая путь на хосте)
docker volume inspect my_data_vol
# Удаление всех неиспользуемых томов (используй с осторожностью!)
docker volume prune
5. Очистка системы
Для избежания беспорядочного роста образов и контейнеров (
image sprawl).# Удаление остановленных контейнеров
docker rm $(docker ps -aq -f status=exited)
# Удаление неиспользуемых (висячих) образов
docker rmi $(docker images -q -f dangling=true)
# Полная очистка: контейнеры, образы, сети, тома
docker system prune -a
6. Режимы работы с сетью
Docker по умолчанию использует режим
bridge (мост), который изолирует контейнеры в частной сети.# Просмотр активных сетевых режимов (по умолчанию: bridge, none, host)
docker network ls
# Запуск контейнера в режиме хоста (убирает изоляцию, но дает скорость)
docker run --net=host -d my_app
# Создание изолированной сети, чтобы контейнеры видели друг друга по имени
docker network create my_custom_net
docker run --network my_custom_net --name redis_db redis
7. Работа с образами и тегами
Для контроля версий всегда используй конкретные теги, а не
latest.# Получение образа с конкретным тегом
docker pull debian:jessie
# Построение образа с явным указанием тега
docker build -t my_app:v1.2 .
# Использование дайджеста для абсолютной гарантии версии
FROM redis@sha256:3479bbcab384fa343b52743b933661335448f8166203688006...
8. Использование
docker exec вместо SSH-демоновНе запускай SSH-демон внутри контейнера. Для отладки используй
docker exec.# Запуск bash внутри активного контейнера (интерактивно)
docker exec -it <CONTAINER_ID> /bin/bash
# Запуск команды внутри контейнера без входа в оболочку
docker exec -it my_web_container ls -l /var/log
9. Настройка ресурсов (cgroups)
Ограничивай ресурсы (CPU, Memory), чтобы избежать DoS-атак или утечек памяти.
# Ограничение памяти (128 Мб)
docker run -it --rm -m 128m my_app
# Ограничение использования CPU (только ядра 0 и 1)
docker run -it --rm --cpuset=0,1 -c 2 my_app
10. Постоянный контроль состояния
Для избежания проблем, связанных с перезапуском и изменяемостью.
# Просмотр запущенных контейнеров
docker ps
# Просмотр всех контейнеров (включая остановленные)
docker ps -a
# Просмотр подробной конфигурации контейнера (JSON)
docker inspect <CONTAINER_ID>
# Получение журналов (STDOUT/STDERR)
docker logs <CONTAINER_ID>
#Docker #DevOps #Security #CLI #Hardening