Урок 03

Образы и контейнеры

Образ (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:/containerVolume
--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 и сети.