Docker: работа с контейнерами

Ранее мы рассматривали процесс установки Docker в операционной системе Ubuntu 16.04 и для проверки работоспособности запускали тестовый контейнер hello-world — это был очень простой пример контейнера, который запускался, выводил сообщение на экран и завершал работу.

Как правило, контейнеры выполняют более полезные действия, ведь они очень похожи на виртуальные машины (но менее требовательны к ресурсам). Давайте разберемся с запуском контейнеров и рассмотрим полезные команды для работы с ними!

Проверить сколько места на жестком диске занимает Docker:

docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              22                  8                   2.73 GB             691.5 MB (25%)
Containers          14                  6                   41.55 kB            41.55 kB (100%)
Local Volumes       37                  10                  349.6 kB            230.5 kB (65%)

Очистить неиспользуемые данные (будьте внимательны с использованием данной команды):

docker system prune

Для поиска образов в реестрах используется команда search, например:

docker search debian

Загрузить образ можно с помощью команды pull:

docker pull itscaro/debian-ssh

Просмотреть список уже загруженных образов можно так:

docker images

или так:

docker image ls -a

Для удаления образа используется команда rmi с указанием имени и версии образа:

docker rmi itscaro/debian-ssh:latest

Для удаления всех неиспользуемых образов введите:

docker image prune

Для запуска контейнера и выполнения внутри него команды используется:

docker container run -it itscaro/debian-ssh /bin/bash

или

docker run -it itscaro/debian-ssh bash

Примечание. В данном примере для запуска контейнера используется образ itscaro/debian-ssh.

Подключиться к уже запущенному контейнеру и запустить shell:

docker container exec -it [CONTAINER ID] /bin/bash

или

docker exec -it [CONTAINER ID] bash

Список запущенных контейнеров можно увидеть так:

docker ps

или так:

docker container ls

Примечание. Следует обратить внимание на первую колонку (CONTAINER ID), в которой указаны идентификаторы контейнеров — они часто используются для управления Docker-контейнерами.

Список запущенных процессов внутри контейнера смотрим так:

docker top [CONTAINER ID]

или так:

docker container top [CONTAINER ID]

Просмотреть логи контейнера можно так:

docker logs [CONTAINER ID]

или так:

docker container logs [CONTAINER ID]

или использовать ключ -f (аналог tail -f в linux):

docker container logs -f [CONTAINER ID]

Для остановки контейнера используется команда stop, например:

docker stop [CONTAINER ID]

или

docker container stop [CONTAINER ID]

Для остановки всех запущенных контейнеров используйте такую команду:

docker container stop $(docker container ls -q)

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

docker rm [CONTAINER ID]

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

docker container prune

Просмотреть историю образа, который использует контейнер:

docker image history --no-trunc=true $(docker container inspect -f '{{.Image}}' [CONTAINER ID])

Просмотреть изменения файловой системы контейнера по сравнению с оригинальным образом:

docker container diff [CONTAINER ID]

Выполнить резервное копирование каталога с данными из контейнера в хост-машину:

docker container run --rm --volumes-from [SOURCE_CONTAINER]:ro -v $(pwd):/backup alpine \
 tar cvf /backup/backup_$(date +%Y-%m-%d_%H-%M).tar /data

Восстановить данные из резервной копии на хост-машине внутрь контейнера:

docker container run --rm --volumes-from [TARGET_CONTAINER]:ro -v $(pwd):/backup alpine \
 tar xvf /backup/backup.tar

Вывод имени хранилища (volume), которое использует контейнер:

docker container inspect -f '{{ range .Mounts }}{{ .Name }} {{ end }}' [CONTAINER ID]

Вывод имени хранилища (volume), которое использует контейнер и точек монтирования:

docker container inspect -f '{{ range .Mounts }}{{ .Name }}:{{ .Destination }} {{ end }}' [CONTAINER ID]

Получить IP-адрес контейнера:

docker container inspect -f '{{ .NetworkSettings.IPAddress }}' [CONTAINER ID]