Шпаргалка по Docker Engine

2022.02.22
Краткая заметка об основных командах и возможностях Docker Engine, которые иногда необходимо делать вручную

Работая с локальной средой или с кластером Docker Swarm очень часто приходится обращаться к базовым функциям Docker Engine, о них и поговорим.

Для локальной разработки я использую Docker Engine совместно с Docker Compose (о нем поговорим вдругой раз), так как последний позволяет минимизировать рутину. Поэтому в данном статье рассмотрю лишь необходимый функционал самого Docker Engine.

Страница будет изменяться по мере необходимости - как только какой-то функционал Docker Engine станет моей обыденностью.

Для более детального изучения необходимо обратиться к документации по Docker CLI.

Начало

Почитать о том что такое Docker Engine можно в официальной документации или по-русски здесь.

Инструкция по установке проста, ее можно найти в документации.

Docker Engine требует работы от юзера в группе docker (но можно и от sudo), добавим текущего (нужного) пользователя в группу docker и от него можно запускать без sudo:

$ sudo usermod -aG docker <USER>

У некоторых списочных команд Docker есть 2 интеерсных флага:

$ docker rmi $(docker images -q)

Образы

Образ Docker - это то что разворачивается в контейнере. Образы создаются из Dockerfile.

Список локальных образов:

$ docker images

REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
mdk_php       latest    c2aff72a5148   5 hours ago    487MB
php           7.3-cli   d29faad18647   2 weeks ago    467MB
mysql         5.7       c20987f18b13   2 weeks ago    448MB

Удалить образ(ы):

$ docker rmi ID

Собрать образ:

$ docker build -t name:tag -f path_to_dockerfile .

Реестр

Реестр Docker - это постоянное хранилище образов, может быть локальным или удаленным.

По умолчанию Docker Engine использует DockerHub, но можно использовать другие решения, например Gitlab Container Registry.

Авторизация в реестре:

$ docker login registry.example.com

Далее будет предложено ввести авторизационные данные.

Залить образ в реестр:

$ docker push registry.example.com/byurrer/name:tag

Контейнеры

Запуск контейнера (детали в доке):

$ docker run <container_name> <command>

command будет запущена в контейнере при его запуске.

Некоторые опции:

Список контейнеров (без аргументов/по умолчанию - запущенных)

$ docker ps
# или
# docker container ls

CONTAINER ID   IMAGE          COMMAND                  CREATED        STATUS                     PORTS     NAMES
7808a98abfc9   mysql:5.7      "docker-entrypoint.s…"   4 hours ago    Exited (0) 3 hours ago               mysql
e766de48ddbb   php:7.1-cli    "docker-php-entrypoi…"   3 days ago     Exited (0) 3 days ago                adoring_dhawan
5137e6cf2aca   hello-world    "/hello"                 3 days ago     Exited (0) 3 days ago                laughing_brattain

аргументы:

Зайти в запущенный контейнер:

$ docker exec -it <id_or_name> /bin/bash

В данном случае используется 2 опции, которые позволяют в интерактивном режиме войти в контейнер и предоставить средства для ввода команд:

Другие опции exec:

Также можно просто выполнить команду в контейнере:

$ docker exec <id_or_name> <command>

Подключиться к контейнеру:

$ docker attach -i <id_or_name>

Получить информацию о контейнере:

$ docker container inspect <id_or_name>
[
    {
        "Id": "7e586b8ba2ea0f2d14c71df87db428d3ce8e4dee40cb4b822f1850ee77803b36",
        "Created": "2022-07-21T10:19:21.651313648Z",
        "Path": "docker-php-entrypoint",
        "Args": [
            "/bin/sh",
            "-c",
            "/bin/bash -c \"su -l www-data -s /bin/bash -c 'cd /var/www/html/ && composer install' && php-fpm -F\""
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 7872,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2022-07-21T10:19:22.812952491Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        ...
    }
]

Получить вывод контейнера:

$ docker container logs <id_or_name>

Удалить контейнер(ы):

$ docker rm <id_or_name>

Сети

Общее описание в доке, а тут по swarm.

Список сетей:

$ docker network ls

NETWORK ID     NAME                      DRIVER    SCOPE
5ed3c66871b5   bridge                    bridge    local
92fa558c94fd   app-network               bridge    local
fc3a6f2c3c05   opencart30_app-network    bridge    local
722176324d31   shop-script_app-network   bridge    local

Информация по одной или нескольким сетям (где в качестве указания сети может быть ID или NAME):

$ docker network inspect <id_or_name>
[
    {
        "Name": "app-network",
        "Id": "92fa558c94fdd9aeaa9eef9942955d4185ef8ddf68c86c619d840ff197756918",
        "Created": "2022-02-06T13:16:38.612580291+03:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "192.168.0.1/24",
                    "Gateway": "192.168.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": true,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {
            "com.docker.compose.network": "app-network",
            "com.docker.compose.project": "mdk",
            "com.docker.compose.version": "1.25.0"
        }
    }
]

Создать сеть:

$ docker network create --driver overlay --subnet 172.22.1.1/24 <new_network_name>

Удалить сеть:

$ docker network rm <id_or_name>

Статистика

Занимаемое пространство ресурсами docker:

$ docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          3         2         433.8MB   216.5kB (0%)
Containers      2         2         2.733kB   0B (0%)
Local Volumes   1         1         478.7kB   0B (0%)
Build Cache     0         0         0B        0B

Просмотр статистики работы контейнеров (почти как top):

$ docker stats
CONTAINER ID   NAME                      CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O         PIDS
7e586b8ba2ea   interlayer-production     0.01%     33.22MiB / 976.8MiB   3.40%     8.19MB / 175kB    1.68MB / 7.05MB   4
69a4007af02c   interlayer-production     0.00%     2.551MiB / 976.8MiB   0.26%     40.6kB / 56.2kB   786kB / 4.1kB     2
7f6063809896   portainer_agent           0.10%     7.121MiB / 976.8MiB   0.73%     1.8kB / 0B        5.39MB / 0B       4

Очистка

Все что контейнеры выводят в stdout, docker хранит в -json.log лог файлах без ротации, файлы растут, занимая место на диске. Очистить все логи stdout контейнеров:

$ truncate -s 0 /var/lib/docker/containers/*/*-json.log

Удалить все ресурсы (образы, тома, сети) не связанные с контейнерами (висящие ресурсы):

$ docker system prune
В телеграм канале DevOps от первого лица можно оставить комментарий или почитать интересные истории из практики DevOps