ITcompressor IT — сжато и по делу
← Назад к статьям

Docker и Docker Compose

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 создаёт сам.

← Назад к статьям