Образы и контейнеры
Образ (image)
Образ — шаблон, из которого создаются контейнеры. Неизменяемый. Состоит из слоёв.
Слои — каждая инструкция в Dockerfile создаёт слой. Слои переиспользуются между образами.
Пример: если у двух образов общий базовый слой — он хранится один раз на диске.
Основные команды образов
Скачать образ
docker pull nginx
docker pull nginx:1.25
docker pull nginx:alpine
docker pull postgres:16-alpine
nginx = nginx:latest. alpine — минимальный образ ~5 МБ вместо ~140 МБ.
Посмотреть локальные образы
docker images
docker image ls
Вывод:
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 1234567890ab 2 weeks ago 187MB
postgres 16-alpine 0987654321ba 3 weeks ago 243MB
Удалить образ
docker rmi nginx
docker rmi nginx:latest
docker rmi 1234567890ab
Если используется контейнером — сначала удали контейнер.
Контейнер (container)
Контейнер — запущенный образ. Изолированный процесс.
Запуск
docker run nginx
docker run -d nginx # в фоне
docker run -d -p 8080:80 nginx # порт 8080 хоста → 80 контейнера
docker run -d --name my-nginx nginx # с именем
docker run -it ubuntu bash # интерактивно
Флаги:
-d— detached (в фоне)-p HOST:CONTAINER— проброс порта--name— имя контейнера-it— интерактивно + TTY--rm— удалить после остановки
Список контейнеров
docker ps # только запущенные
docker ps -a # все
docker ps -q # только ID
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
Остановка и запуск
docker stop my-nginx # остановить (SIGTERM, потом SIGKILL)
docker stop -t 30 my-nginx # подождать 30 секунд
docker start my-nginx # запустить остановленный
docker restart my-nginx # перезапустить
docker kill my-nginx # убить (SIGKILL)
Удаление
docker rm my-nginx # остановленный
docker rm -f my-nginx # принудительно (убить и удалить)
docker rm $(docker ps -aq) # все контейнеры
Логи
docker logs my-nginx
docker logs -f my-nginx # follow
docker logs --tail 100 my-nginx # последние 100
docker logs --since 10m my-nginx # за 10 минут
docker logs -t my-nginx # с timestamp
Выполнить команду в контейнере
docker exec my-nginx ls /etc/nginx
docker exec -it my-nginx bash
docker exec -it -u root my-nginx bash # от root
docker exec my-nginx nginx -t # проверить конфиг
exec — выполнить в работающем контейнере. run — создать новый.
Информация о контейнере
docker inspect my-nginx
docker inspect --format '{{.State.Status}}' my-nginx
docker stats # CPU/RAM в реальном времени
docker stats --no-stream # один раз
docker top my-nginx # процессы внутри
Практика: nginx
1. Запусти:
docker run -d --name web -p 8080:80 nginx
2. Проверь:
curl http://localhost:8080
# <!DOCTYPE html>...Welcome to nginx!
3. Логи:
docker logs web
4. Зайди внутрь:
docker exec -it web bash
# Внутри контейнера:
ls /usr/share/nginx/html/
cat /etc/nginx/nginx.conf
exit
5. Останови и удали:
docker stop web
docker rm web
Практика: PostgreSQL
1. Запусти:
docker run -d --name pg \
-e POSTGRES_PASSWORD=secret \
-e POSTGRES_DB=skills_db \
-p 5432:5432 \
postgres:16-alpine
Флаги:
-e— переменная окруженияPOSTGRES_PASSWORD— обязательнаPOSTGRES_DB— создать БД
2. Подключись:
docker exec -it pg psql -U postgres -d skills_db
3. Внутри:
SELECT version();
\l
\q
4. Удали:
docker rm -f pg
⚠️ Данные пропадут — без volume. Подробнее в уроке про volumes.
Флаги docker run
| Флаг | Что делает |
|---|---|
-d | В фоне |
-it | Интерактивно + TTY |
--name | Имя контейнера |
-p 8080:80 | Порт хоста:контейнера |
-e VAR=value | Переменная окружения |
-v /host:/container | Volume |
--network | Сеть |
--rm | Удалить после |
--restart=always | Автозапуск |
--memory=512m | Лимит RAM |
--cpus=1.5 | Лимит CPU |
Restart policies
Поведение при падении/перезагрузке:
docker run -d --restart=no nginx # не перезапускать
docker run -d --restart=on-failure nginx # при ошибке
docker run -d --restart=always nginx # всегда (кроме ручной остановки)
docker run -d --restart=unless-stopped nginx # всегда, кроме ручной остановки
Для прода: unless-stopped — надёжнее всего.
Environment variables
Способы:
# 1. -e
docker run -e DB_HOST=localhost -e DB_PORT=5432 postgres
# 2. --env-file
docker run --env-file .env postgres
# 3. Файл .env внутри образа (не рекомендуется)
Внутри контейнера:
docker exec my-app env
Полезные команды
# Показать все контейнеры и образы
docker system df
# Очистить всё неиспользуемое
docker system prune
docker system prune -a
# Только контейнеры
docker container prune
# Только образы
docker image prune -a
# Только volumes
docker volume prune
# Копировать файл в/из контейнера
docker cp file.txt my-nginx:/tmp/
docker cp my-nginx:/etc/nginx/nginx.conf ./nginx.conf
Формат вывода
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}"
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
Псевдонимы
В ~/.bashrc:
alias d='docker'
alias dc='docker compose'
alias dps='docker ps'
alias dpsa='docker ps -a'
alias di='docker images'
alias dex='docker exec -it'
alias dl='docker logs'
alias dlg='docker logs -f'
Применить:
source ~/.bashrc
Итог
Минимум:
docker pull— скачать образdocker run— запустить контейнерdocker ps— списокdocker logs— логиdocker exec— команды внутриdocker stop/rm— остановить/удалить
Дальше — volumes и сети.