Docker — платформа контейнеризации: приложение упаковывается вместе с окружением и зависимостями в образ, из которого поднимаются изолированные контейнеры. Один и тот же образ разворачивается одинаково на любой Linux-машине.
Сценарий статьи: контейнер web с nginx на 8080-м порту, плюс база в Compose.
Установка (Ubuntu)#
Официальный репозиторий Docker:
# Ключ подписи репозитория
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Репозиторий (формат deb822)
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
# Установка движка и плагинов (включая Compose)
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Пакет из дистрибутива Ubuntu (apt install docker.io) — допустимая, но
обычно отстающая альтернатива.
Права: работать без sudo#
Демон слушает unix-сокет, доступный группе docker:
sudo usermod -aG docker $USER
Перезагрузка не нужна — достаточно перелогина (или newgrp docker в текущей
сессии). Проверка:
docker run hello-world
Члены группы
dockerфактически имеют root-доступ к хосту (можно смонтировать корень хоста/в контейнер) — давайте её только тем, кому доверяете как root'у.
Контейнеры#
# Запустить web: nginx из 8080 хоста на 80 контейнера, имя web (-d — в фон)
docker run -d --name web -p 8080:80 nginx
# Что сейчас работает / всё, включая остановленные
docker ps
docker ps -a
# Логи (следить: -f)
docker logs web
# Остановка / запуск / перезапуск
docker stop web
docker start web
docker restart web
# Внутрь запущенного контейнера — шелл
docker exec -it web bash
# Одноразовый контейнер: убить после выхода (--rm)
docker run -it --rm ubuntu bash
# Удалить остановленный контейнер
docker rm web
Имя
webиспользуется во всех командах вместо длинного ID.--rm— для разовых задач; именованные контейнеры — для служб.
Образы#
# Скачать образ с Docker Hub
docker pull nginx
# Локальные образы
docker images
# Сборка из Dockerfile в текущем каталоге
docker build -t my-app .
# Удалить образ
docker rmi nginx
Сети#
# Пользовательская сеть
docker network create my-network
# Список сетей
docker network ls
# Запуск контейнера в этой сети
docker run -d --name web --network my-network nginx
# Удаление сети
docker network rm my-network
Внутри пользовательской сети контейнеры резолвятся по именам:
webдоступен соседям просто поhttp://web:80— без парентов IP. В дефолтной bridge-сети такого DNS нет.
Тома#
# Создать именованный том
docker volume create app-data
# Список томов
docker volume ls
# Бросить том в контейнер
docker run -d --name web -v app-data:/var/lib/nginx nginx
# Удалить
docker volume rm app-data
Том (
-v app-data:/путь) живёт отдельно от контейнера — данные переживают удаление контейнера. Привязка каталога хоста работает так же:-v ./html:/usr/share/nginx/html(bind mount).
Docker Compose#
Compose описывает многоконтейнерное приложение в одном YAML — состав,
сети, тома и переменные. compose.yaml (v2: секция version больше не нужна):
services:
web:
image: nginx
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
db:
image: postgres
environment:
POSTGRES_PASSWORD: example
Команды (современный CLI — docker compose одним словом, плагин из
установки выше; дефисный docker-compose — legacy v1):
# Поднять всё приложение фоном
docker compose up -d
# Что работает
docker compose ps
# Логи (следить: -f) по одному сервису или всем
docker compose logs -f web
# Пересобрать образы после правок Dockerfile
docker compose build
# Шелл внутри сервиса
docker compose exec web bash
# Остановить и убрать контейнеры/сети
docker compose down
# То же, но с wipe'ом данных томов
docker compose down --volumes
docker compose downне трогает тома — базы переживают перезапуск; чтобы потереть и данные, добавляют--volumes. Сервисы Compose резолвятся по имени внутри пользовательской сети, которую Compose создаёт сам.