🐳 3 довольно неизвестных команды Docker, которые помогут вам в самых различных ситуациях

Мануал

Если вы какое-то время используете Docker, у вас, вероятно, уже есть адаптированный для вас простой и эффективный рабочий процесс, который включает в себя некоторые из ваших любимых команд Docker (если это технически правильные подкоманды).

Например, я использовал для удаления неработающих контейнеров длинную команду, которая выглядит так, как этот docker container rm $ (docker container ps -qf status = exited), она работала, очевидно, выдавая ошибку всякий раз, когда не было застрявших контейнеров.

Я прекратил ее использование когда я узнал, что у нас также есть подкоманда prune для контейнеров!

Итак, теперь эта длинная команда свелась к простой.

Дело в том, что даже несмотря на то, что многие из нас уже некоторое время используют Docker, есть вероятность, что некоторые вещи могли быть упущены из виду или, возможно, даже забыты с течением времени.

В этой статье я собираюсь показать вам три подкоманды Docker, которые могут быть для вас новыми, или вы их мало используете, но я думаю, вам стоит их изучить.

Эти подкоманды могут также включать свои собственные подкоманды.

1. Подкоманда system

В Docker есть команда system, которая дает вам некоторую информацию на системном уровне, связанную с Docker.

На самом деле вы уже некоторое время используете одну из его подкоманд.

Помните Docker info?

Эта команда на самом деле является docker system info

Чтобы узнать больше об этой подкоманде и о том, что она предлагает, запустите для нее параметр –help.

➟ docker system --help

Usage:  docker system COMMAND

Manage Docker

Commands:
  df          Show docker disk usage
  events      Get real time events from the server
  info        Display system-wide information
  prune       Remove unused data

Run 'docker system COMMAND --help' for more information on a command.

Давайте рассмотрим каждую из этих подкоманд, так как я думаю, что все они очень важны.

Docker system df

Вы когда-нибудь были в ситуации, когда дисковое пространство вашего сервера казалось почти заполненным?

Чтобы проверить, действительно ли это контейнеры (запущенные/тома), вы, вероятно, использовали команду du непосредственно в данных root.

Data-root – это место системе, где Docker хранит все данные, связанные с его состоянием.

Это включает, помимо прочего, образа (слои), тома, информацию, связанную с сетью, плагины.

Использование du в в этой области требует доступа sudo.

✗ du -h --max-depth=1 /var/lib/docker
du: cannot read directory '/var/lib/docker': Permission denied
4.0K    /var/lib/docker

Мало того, чтобы точно узнать, сколько выделяется под тома или образы, вам придется выполнить команду несколько раз.

➟ sudo du -h --max-depth=0 /var/lib/docker/volumes && \
    sudo du -h --max-depth=0 /var/lib/docker/image && \
    sudo du -h --max-depth=0 /var/lib/docker/

Гораздо лучшая альтернатива – вызвать команду docker system df.

Система автоматически обнаружит data-root, и соответственно, выведет всю информацию о выделенных данных.

Вот что показывает моя текущая система (это новая установка)

➟ docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          10        1         84.17MB   84.17MB (100%)
Containers      1         1         8.219MB   0B (0%)
Local Volumes   0         0         0B        0B
Build Cache     0         0         0B        0B

Docker system prune

Если вы когда-либо хотели удалить (1) все неиспользуемые сети, (2) висящие образа, (3) остановленные контейнеры, (4) все неиспользуемые тома, есть большая вероятность, что вы использовали или привыкли использовать четыре отдельные команды для достижения этих целей.

docker network prune && \
    docker image prune && \
    docker volume prune && \
    docker container prune

К счастью для нас, все это можно сделать с помощью простой команды, а именно docker system prune –volumes.

По умолчанию docker system prune не удаляет тома, для этого вам нужно использовать параметр –volumes.

Эта команда дополнительно очищает кеш сборки.

Вы можете использовать параметр -f, чтобы не выводить (иногда) раздражающий запрос.

См. Пример ниже:

➟ docker system prune --volumes -f
Deleted Containers:
672d39c1a78969887f411ce9139e74e5b21c31fccf2bcf8c1190a9e166089ede

Deleted Networks:
Example
SSHnet
Dummy

Deleted Volumes:
dummy

Total reclaimed space: 0B

Docker system events

Эта команда может быть полезна далеко не всегда, но я думаю, что каждый должен знать о ней.

docker system events иили docker events предоставляют вам события в реальном времени непосредственно от демона docker (dockerd).

Это может помочь отслеживать определенные события, например, когда образ было удален.

См. Снимок экрана, показанный ниже, чтобы лучше понять это.

2. Подкоманда context

Это еще одна красивая подкоманда, о которой, насколько мне известно, мало кто знает.

Context при выполнении любой команды Docker – это пара пар ключ-значение, которые включают, но не ограничиваются конечной точкой, хостом, возможно, некоторым файлом конфигурации и т.д.

После того, как вы создали контекст, его можно будет повторно использовать позже.

Один из самых больших практических вариантов использования, особенно для меня, – это создание отдельных контекстов для отдельных серверов, на которых работает Docker.

Поскольку большая часть моей работы вращается вокруг этого, вместо того, чтобы каждый раз входить на сервер, я использую свой локальный клиент до сервера для удаления Docker через SSH.

У меня развернут сервер, на котором запущен Docker.

Если бы мне нужно было получить доступ к удаленному демону Docker без контекстов, я бы использовал такую команду, как следующая:

➟ docker --host ssh://debdut@194.195.116.210:7770 ps
CONTAINER ID   IMAGE                                    COMMAND                  CREATED       STATUS       PORTS                                                                      NAMES
bb4fa8390ab7   jrcs/letsencrypt-nginx-proxy-companion   "/bin/bash /app/entr…"   2 hours ago   Up 2 hours                                                                              reverse-proxy_letsencrypt_1
ccdda507facb   jwilder/nginx-proxy                      "/app/docker-entrypo…"   2 hours ago   Up 2 hours   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   reverse-proxy_reverse_proxy_1

Итак, чтобы получить доступ к удаленному демону, мне пришлось бы либо указать docker –host ssh://debdut@194.195.116.210:7770, либо использовать переменную среды DOCKER_HOST.

Но это очень затрудняет переключение на другие хосты.

Более простая альтернатива – просто создать контекст.

Следующая команда создает контекст с именем remote для конечной точки Docker

docker context create remote --description "Remote docker server" --docker "host=ssh://debdut@194.195.116.210:7770"

Результат выглядит так:

➟ docker context create remote --description "Remote docker server" --docker "host=ssh://debdut@194.195.116.210:7770"
remote
Successfully created context "remote"

Теперь вы можете использовать опцию -c в команде Docker, если вы хотите что-то быстро проверить, или для повторяющихся операций изменить контекст на этот новый.

С параметром -c:

➟ docker -c remote ps
CONTAINER ID   IMAGE                                    COMMAND                  CREATED       STATUS       PORTS                                                                      NAMES
bb4fa8390ab7   jrcs/letsencrypt-nginx-proxy-companion   "/bin/bash /app/entr…"   2 hours ago   Up 2 hours                                                                              reverse-proxy_letsencrypt_1
ccdda507facb   jwilder/nginx-proxy                      "/app/docker-entrypo…"   2 hours ago   Up 2 hours   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   reverse-proxy_reverse_proxy_1

В команде Docker context используйте [CONTEXT_NAME]:

➟ docker context use default
default
Current context is now "default"
~ 
➟ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

3. Подкоманда pause и unpause

Большое развертывание (приложения) теперь разделено на несколько компонентов, более известных как микросервисы.

Когда вы развертываете их с помощью чего-то вроде docker-compose, иногда случается, что один компонент запускается раньше, чем тот, от которого он зависит.

Это действительно проблема, потому что, поскольку его зависимость (или зависимости) еще не запущена, этот компонент не запустится.

Вы можете смягчить эту проблему, используя политики перезапуска в Docker, но они не предотвращают переполнение логов неудачными попытками.

Вначале я просто останавливал контейнер/службу до тех пор, пока зависимость не запустится полностью.

Лучше всего просто приостановить контейнер на некоторое время, и после того, как необходимые службы будут успешно запущены, вы можете возобновить работу контейнера.

Синтаксис команд довольно прост.

docker pause [CONTAINER_NAME|ID]

docker unpause [CONTAINER_NAME|ID]

Заключение

На этом мы заканчиваем эту статью.

Если я найду еще такие команды, полезные или интересные, я соответствующим образом обновлю эту статью.

У вас есть команда Docker, которая, по вашему мнению, должна была быть в этом списке?

Дайте мне знать в комментариях !

 

Добавить комментарий