Основні команди Docker Compose: короткий гайд для швидкого старту
Docker Compose — це інструмент, який значно спрощує роботу з багатоконтейнерними додатками.
Замість запуску кожного контейнера вручну, ви описуєте все в одному файлі docker-compose.yml — і керуєте проєктом єдиною командою.
У цій статті розберемо основні команди, які допоможуть перевірити версію, запустити, зупинити або оновити контейнери.
Перевірка версії Docker Compose
|
1 2 3 4 5 6 |
# Перевірити версію docker compose version # Документація версій # https://docs.docker.com/compose/release-notes/ |
Список запущених контейнерів
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# Показати запущені контейнери docker ps # Показати ВСІ контейнери (включно зі зупиненими) docker ps -a # Показати тільки ID контейнерів (зручно для скриптів) docker ps -q # Показати всі ID docker ps -a -q # Альтернативний синтаксис docker container ls docker container ls -a |
Корисні фільтри:
|
1 2 3 4 5 6 7 8 9 10 |
# Контейнери з певного образу docker ps -a --filter ancestor=nginx # Контейнери зі статусом docker ps -a --filter status=exited docker ps -a --filter status=running # За назвою docker ps -a --filter name=mysql |
Робота з контейнерами
Запуск контейнера
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# Базовий запуск docker run nginx # Інтерактивний режим з bash docker run -it ubuntu bash # В фоновому режимі (detached) docker run -d nginx # З назвою docker run -d --name my-nginx nginx # З прокинутими портами docker run -d -p 8080:80 nginx # З змінними оточення docker run -d -e POSTGRES_PASSWORD=secret postgres # З volume docker run -d -v /host/path:/container/path nginx # Комбінований приклад docker run -d \ --name my-app \ -p 3000:3000 \ -e NODE_ENV=production \ -v /app/data:/data \ --network my-network \ --restart unless-stopped \ my-app:latest |
Приклад з Docker Hub:
|
1 2 3 |
# Запустити образ з Docker Hub docker run -d --name thin-comfy-server -p 80:80 deslancer/thin-comfy-server |
Зупинка і видалення
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# Зупинити контейнер (м'яка зупинка) docker stop container_name # "Вбити" контейнер (жорстка зупинка) docker kill container_name # Видалити контейнер docker rm container_name # Видалити примусово (навіть якщо запущений) docker rm -f container_name # Зупинити ВСІ контейнери docker stop $(docker ps -a -q) # "Вбити" ВСІ контейнери docker kill $(docker ps -a -q) # Видалити ВСІ зупинені контейнери docker rm $(docker ps -a -q) # Видалити всі контейнери (нативна команда) yes | docker container prune |
Виконання команд в контейнері
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# Виконати команду docker exec container_name ls -la # Інтерактивний bash docker exec -it container_name bash # Інтерактивний sh (для Alpine) docker exec -it container_name sh # Від імені конкретного користувача docker exec -u root -it container_name bash # З робочою директорією docker exec -w /app container_name pwd # З додатковими змінними оточення docker exec -e MYVAR=1 container_name printenv # Виконати скрипт docker exec container_name bash -c 'node --version > node.txt' # Вивести фразу docker exec -it container_name echo "My command run in container" |
Створення контейнера без запуску
|
1 2 3 4 5 6 7 8 9 10 11 12 |
# Створити контейнер docker create --name my_mongo_container mongo # Запустити створений контейнер docker start my_mongo_container # Зупинити docker stop my_mongo_container # Перезапустити docker restart my_mongo_container |
Копіювання файлів
|
1 2 3 4 5 6 7 8 9 10 11 12 |
# З хосту в контейнер docker cp /home/user/data container_name:/opt/app/data # З контейнера на хост docker cp container_name:/opt/app/data /home/user/data # Копіювати директорію docker cp ./config container_name:/etc/app/ # Приклад з архівом docker cp container_name:/var/log/app.log - | tar x |
Робота з образами
Завантаження образів
|
1 2 3 4 5 6 7 8 9 |
# Завантажити образ з Docker Hub docker pull nginx # Конкретна версія docker pull nginx:1.21-alpine # Всі теги docker pull -a nginx |
Побудова образів
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# Побудувати з поточної директорії docker build -t my-image . # З конкретного Dockerfile docker build -t my-image -f ./docker/Dockerfile.prod . # Без кешу docker build --no-cache -t my-image . # З build arguments docker build --build-arg VERSION=1.0 -t my-image . # Вказати платформу docker build --platform linux/amd64 -t my-image . |
Перегляд та аналіз образів
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# Список образів docker images # З фільтрами docker images -a # Всі образи, включно з проміжними docker images -q # Тільки ID # Фільтр за назвою docker images | grep nginx # Історія образу (як створювався) docker history image_id docker history nginx:latest # Детальна інформація docker inspect image_name # Переглянути розмір образу docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}" |
Експорт та імпорт образів
|
1 2 3 4 5 6 7 8 9 10 11 12 |
# Зберегти образ в tar docker save -o my-image.tar my-image:latest # Завантажити образ з tar docker load -i my-image.tar # Експортувати контейнер (filesystem) docker export container_name > container.tar # Імпортувати як образ docker import container.tar my-image:imported |
Видалення образів
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# Видалити конкретний образ docker rmi image_name # Примусове видалення docker rmi -f image_name # Видалити ВСІ образи docker rmi $(docker images -q) # Видалити образи без тегу (<none>) docker images -f 'dangling=true' # Переглянути docker rmi $(docker images -f 'dangling=true' -q) # Видалити docker image prune # Нативна команда # Видалити невикористані образи docker image prune -a |
Аналіз розміру образів
|
1 2 3 4 5 6 7 8 9 10 |
# Розмір шарів overlay sudo du -sh /var/lib/docker/overlay2 # Розмір контейнерів sudo du -sh /var/lib/docker/containers # Використання dive для детального аналізу # https://github.com/wagoodman/dive dive my-image:latest |
Порада: Використовуйте Alpine Linux базовий образ – розмір всього ~5 МБ!
Мережі (Networks)
Основні команди
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# Список мереж docker network ls # Детальна інформація docker network inspect network_name # Створити мережу docker network create my-network # Створити з параметрами docker network create \ --driver bridge \ --subnet 172.20.0.0/16 \ --gateway 172.20.0.1 \ my-custom-network # Видалити мережу docker network rm my-network # Видалити невикористані мережі docker network prune |
Підключення контейнерів
|
1 2 3 4 5 6 7 8 9 10 11 12 |
# Підключити існуючий контейнер до мережі docker network connect my-network container_name # Відключити docker network disconnect my-network container_name # Запустити контейнер в мережі docker run -d --name app --network my-network nginx # З додатковим алгоритмом DNS docker run -d --name app --dns 8.8.8.8 --dns 8.8.4.4 nginx |
Перевірка мережевої взаємодії
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# Перевірити що контейнери в одній мережі docker network inspect shared_network # Тест з'єднання з іншого контейнера docker exec -it php83 curl http://content-parser-dev:8080/api/v1/health # Ping між контейнерами docker exec container1 ping container2 # Перевірити DNS docker exec container_name nslookup other-container # Переглянути /etc/resolv.conf docker exec container_name cat /etc/resolv.conf # Перевірити відкриті порти docker exec container_name netstat -tulpn # Перевірити routing table docker exec container_name route -n |
Приклад з нашого проєкту
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# docker-compose.yml networks: parser-network: driver: bridge shared_network: external: true name: shared_network services: content-parser-dev: networks: - parser-network - shared_network |
Томи (Volumes)
Основні команди
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# Список томів docker volume ls # Створити том docker volume create my-volume # Детальна інформація (включно з шляхом) docker volume inspect my-volume # Видалити том docker volume rm my-volume # Видалити невикористані томи docker volume prune |
Використання томів
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# Іменований том docker run -d -v my-volume:/app/data nginx # Bind mount (прив'язка директорії хосту) docker run -d -v /host/path:/container/path nginx docker run -d -v $(pwd):/app node # Read-only том docker run -d -v my-volume:/app/data:ro nginx # Анонімний том docker run -d -v /app/data nginx |
Різниця між volume та bind mount:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# ✅ Volume (рекомендовано) # - Керується Docker # - Показується в `docker volume ls` # - Безпечніше для production docker volume create app-data docker run -v app-data:/data app # ⚠️ Bind mount # - НЕ показується в `docker volume ls` # - Може захаращувати систему # - Добре для розробки docker run -v /home/user/code:/app app |
Docker Compose приклад
|
1 2 3 4 5 6 7 8 9 10 |
services: app: volumes: - app-data:/data # Іменований volume - ./config:/etc/app:ro # Bind mount (read-only) - /var/run/docker.sock:/var/run/docker.sock # Socket volumes: app-data: # Оголошення volume |
Docker Compose
Основні команди
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# Запустити всі сервіси docker compose up # В фоновому режимі docker compose up -d # Перебудувати образи docker compose up --build # Примусово пересворити контейнери docker compose up --force-recreate # Конкретні сервіси docker compose up rabbitmq redis # Зупинити docker compose down # Зупинити з видаленням volumes docker compose down -v # Зупинити з видаленням orphans docker compose down --remove-orphans # Перезапустити сервіс docker compose restart service_name # Побудувати без запуску docker compose build # Переглянути логи docker compose logs # Логи конкретного сервісу docker compose logs service_name # Слідкувати за логами docker compose logs -f service_name # Останні N рядків docker compose logs --tail=100 service_name |
Profiles (обмеження запуску)
|
1 2 3 4 5 6 7 |
# docker-compose.yml services: frontend: profiles: ['frontend-1'] backend: profiles: ['backend-1'] |
|
1 2 3 4 5 6 |
# Запустити конкретні профілі docker compose --profile frontend-1 --profile backend-1 up # Тільки backend docker compose --profile backend-1 up |
Логи з фільтрацією
|
1 2 3 4 5 6 7 8 9 10 11 12 |
# Фільтр через grep docker compose logs malware-database | grep -E "(NOTICE|ERROR)" # Кілька ключових слів docker compose logs enhanced-c2-server | grep -E "(Database|BotHandlers)" # З часовими мітками docker compose logs -t service_name # З прокруткою docker compose logs -f --tail=50 service_name |
Масштабування сервісів
|
1 2 3 4 5 6 |
# Запустити 3 інстанси docker compose up --scale web=3 # З load balancer docker compose up --scale api=5 -d |
Debugging & Troubleshooting
Перевірка конфігурації
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# Перевірити наявність файлів docker exec -it container_name ls -la /app # Переглянути змінні оточення docker exec -it container_name printenv # Конкретна змінна docker exec container_name printenv | grep DATABASE # Перевірити часову зону docker exec container_name date docker exec container_name env | grep TZ |
Перевірка запущених процесів
|
1 2 3 4 5 6 7 8 9 |
# Процеси в контейнері docker exec -it container_name ps aux # Топ процесів docker top container_name # З хосту docker stats container_name |
Перевірка портів та з’єднань
|
1 2 3 4 5 6 7 8 9 10 11 12 |
# Відкриті порти docker exec -it container_name netstat -tulpn # Перевірити конкретний порт docker exec -it container_name netstat -tulpn | grep 3008 # Перевірити що слухає порт 5432 docker exec container_name netstat -an | grep 5432 # З хосту sudo lsof -i -P -n | grep 5432 |
Пошук файлів
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# Знайти CSV файли docker exec container_name find /var/lib/c2 -name "*.csv" 2>/dev/null docker exec container_name find /tmp -name "*.csv" 2>/dev/null # Загальний пошук docker exec container_name find / -name "*c2_commands*" 2>/dev/null # За типом файлу docker exec container_name find /app -type f -name "*.log" # За розміром docker exec container_name find /app -size +100M |
Логи та перевірки
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# Переглянути логи docker logs container_name # Останні 100 рядків docker logs --tail=100 container_name # Слідкувати за логами docker logs -f container_name # З часовими мітками docker logs -t container_name # За часовим проміжком docker logs --since 1h container_name docker logs --since 2024-10-01 container_name |
Робота з базами даних
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# PostgreSQL - перевірити timezone docker exec postgres psql -U user -d dbname -c "SHOW timezone;" # Перевірити поточний час docker exec postgres psql -U user -d dbname -c "SELECT NOW();" # Перевірити timestamp docker exec postgres psql -U user -d dbname -c "SELECT CURRENT_TIMESTAMP;" # Підключитись до PostgreSQL docker exec -it postgres psql -U user -d dbname # MySQL docker exec -it mysql mysql -u root -p # Redis docker exec -it redis redis-cli |
Перевірка GPU (для ML/AI)
|
1 2 3 4 5 6 7 8 9 10 |
# Запустити контейнер з GPU docker run -it --rm --gpus all tensorflow/tensorflow:2.16.1-gpu bash # Перевірити пакети python3 -m pip list | grep tensorflow python3 -m pip list | grep matplotlib # Перевірити GPU nvidia-smi |
Inspect контейнера
|
1 2 3 4 5 6 7 8 9 10 11 |
# Вся інформація docker inspect container_name # Конкретне поле docker inspect -f "{{.State.Status}}" container_name docker inspect -f "{{.NetworkSettings.IPAddress}}" container_name docker inspect -f "{{.Config.Env}}" container_name # JSON формат (з jq) docker inspect container_name | jq '.[0].NetworkSettings' |
Очищення системи
Комплексне очищення
|
1 2 3 4 5 6 7 8 9 10 11 12 |
# Видалити все невикористане docker system prune # Включно з образами docker system prune -a # Включно з volumes docker system prune -a --volumes # Без підтвердження docker system prune -a -f |
Вибіркове очищення
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# Тільки контейнери docker container prune # Тільки образи docker image prune docker image prune -a # Всі невикористані # Тільки мережі docker network prune # Тільки томи docker volume prune |
Видалення всього
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# Зупинити ВСЕ docker stop $(docker ps -a -q) # Видалити всі контейнери docker rm $(docker ps -a -q) # Видалити всі образи docker rmi $(docker images -q) # Видалити примусово docker rmi -f $(docker images -q) # Видалити образи <none> docker rmi $(docker images -f 'dangling=true' -q) |
Моніторинг простору
|
1 2 3 4 5 6 7 8 9 10 11 12 |
# Використання дискового простору docker system df # Детально docker system df -v # Конкретні компоненти du -sh /var/lib/docker/ du -sh /var/lib/docker/overlay2/ du -sh /var/lib/docker/containers/ du -sh /var/lib/docker/volumes/ |
Безпека та права доступу
Помилка: permission denied на docker.sock
Проблема:
|
1 2 |
Got permission denied while trying to connect to the Docker daemon socket |
Рішення 1: Додати користувача до групи docker
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# Створити групу docker (якщо немає) sudo groupadd docker # Додати користувача sudo usermod -aG docker $USER # Перевірити cat /etc/group | grep docker # Перезавантажити сесію або newgrp docker # Тепер docker працює без sudo docker ps |
Рішення 2: Змінити права (тимчасово)
|
1 2 3 4 5 6 |
# Змінити власника sudo chown root:docker /var/run/docker.sock # Або дати повні права (НЕ рекомендовано для production!) sudo chmod 777 /var/run/docker.sock |
Проблема: неможливо зупинити контейнер (AppArmor)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# Перевірити статус AppArmor sudo aa-status # Видалити невідомі профілі sudo aa-remove-unknown # Вимкнути AppArmor sudo systemctl disable apparmor.service --now # Вивантажити профілі sudo service apparmor teardown # Повне видалення (якщо не потрібен) sudo systemctl stop apparmor sudo systemctl disable apparmor sudo apt remove --assume-yes --purge apparmor |
Security Best Practices
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# Запуск від непривілейованого користувача docker run --user 1000:1000 nginx # Read-only root filesystem docker run --read-only nginx # Обмеження ресурсів docker run -m 512m --cpus=1 nginx # Без нових привілеїв docker run --security-opt=no-new-privileges nginx # Видалити capabilities docker run --cap-drop=ALL nginx |
Моніторинг та аналіз
Статистика ресурсів
|
1 2 3 4 5 6 7 8 9 10 11 12 |
# Real-time статистика docker stats # Для конкретних контейнерів docker stats container1 container2 # Без stream (один раз) docker stats --no-stream # Форматований вивід docker stats --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}" |
Health Checks
|
1 2 3 4 |
# У Dockerfile HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD curl -f http://localhost/health || exit 1 |
|
1 2 3 4 5 6 7 8 9 10 |
# У docker-compose.yml services: app: healthcheck: test: ["CMD", "curl", "-f", "http://localhost/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s |
|
1 2 3 4 5 6 |
# Перевірити health status docker inspect --format='{{.State.Health.Status}}' container_name # Детальна інформація docker inspect container_name | jq '.[0].State.Health' |
Events моніторинг
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# Всі події docker events # Фільтр за типом docker events --filter type=container # За конкретним контейнером docker events --filter container=my-app # За часом docker events --since 1h docker events --since '2024-10-01T12:00:00' |
Логування
|
1 2 3 4 5 6 7 8 9 10 |
# docker-compose.yml services: app: logging: driver: "json-file" options: max-size: "10m" max-file: "3" labels: "production" |
|
1 2 3 4 5 6 |
# Доступні драйвери логування docker info --format '{{.LoggingDriver}}' # Змінити драйвер для існуючого контейнера (через recreate) docker update --log-driver=json-file --log-opt max-size=10m container_name |
Додаткові поради
Raspberry Pi
Інструкція з встановлення Docker на Raspberry Pi: https://dev.to/elalemanyo/how-to-install-docker-and-docker-compose-on-raspberry-pi-1mo
Docker Compose атрибути
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# Чекати поки сервіс буде healthy services: flask: depends_on: postgres: condition: service_healthy postgres: healthcheck: test: ["CMD", "pg_isready", "-U", "user"] interval: 5s timeout: 5s retries: 5 |
Корисні aliases
Додайте в ~/.bashrc або ~/.zshrc:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# Docker aliases alias dps='docker ps' alias dpsa='docker ps -a' alias di='docker images' alias dex='docker exec -it' alias dlogs='docker logs -f' alias dstop='docker stop $(docker ps -q)' alias drm='docker rm $(docker ps -aq)' alias drmi='docker rmi $(docker images -q)' # Docker Compose aliases alias dc='docker compose' alias dcup='docker compose up -d' alias dcdown='docker compose down' alias dclogs='docker compose logs -f' alias dcps='docker compose ps' alias dcrestart='docker compose restart' |
Вбити процес на порту
|
1 2 3 4 5 6 7 8 9 |
# Знайти процес sudo lsof -t -i:3002 # Вбити sudo kill -9 $(sudo lsof -t -i:3002) # Або одразу sudo fuser -k 3002/tcp |
Quick Reference Table
| Команда | Опис |
|---|---|
docker ps |
Список запущених контейнерів |
docker ps -a |
Всі контейнери |
docker images |
Список образів |
docker pull IMAGE |
Завантажити образ |
docker build -t NAME . |
Побудувати образ |
docker run IMAGE |
Запустити контейнер |
docker exec -it CONTAINER bash |
Зайти в контейнер |
docker logs CONTAINER |
Переглянути логи |
docker stop CONTAINER |
Зупинити контейнер |
docker rm CONTAINER |
Видалити контейнер |
docker rmi IMAGE |
Видалити образ |
docker network ls |
Список мереж |
docker volume ls |
Список томів |
docker compose up |
Запустити compose |
docker system prune -a |
Очистити все |
Висновок
Цей довідник охоплює 99% повсякденних завдань при роботі з Docker. Збережіть його та використовуйте як швидку довідку!
Корисні ресурси:
- Офіційна документація Docker
- Docker Compose документація
- Docker Hub
- Play with Docker – онлайн playground