10 команд для Docker, без которых вам не обойтись
Docker — полезный инструмент для создания микросервисов. Чтобы эффективнее работать с ним, вам пригодятся команды, 10 из которых мы сегодня обсудим.
Docker — отличный инструмент для создания микросервисов, который позволяет создавать облачные приложения и системы. Чтобы выжать из него максимум через терминал, вам пригодятся 10 команд, перечисленных ниже.
Контейнер запускается путём запуска образа. Образ — исполняемый пакет, который содержит всё необходимое для запуска приложения: код, среду выполнения, библиотеки, переменные среды и конфигурационные файлы.Контейнер создаётся из образа. Это то, чем становится образ во время исполнения (иными словами, образом с состоянием или пользовательским процессом). Вы можете просмотреть список запущенных контейнеров с помощью команды docker ps , прямо как в Linux.
Docker Concepts
- docker ps — показывает список запущенных контейнеров. Некоторые из полезных флагов:-a / —all — список всех контейнеров (по умолчанию показывает только запущенные);-q / —quiet — перечислить только id контейнеров (полезно, когда вам нужны все контейнеры).
- docker pull — большинство образов создаётся на основе базового образа из Docker Hub. Docker Hub содержит множество готовых образов, которые можно использовать вместо того, чтобы создавать и настраивать свой собственный. Чтобы скачать определённый образ или набор образов (репозиторий), используйте команду docker pull .
- docker build — эта команда собирает образ Docker из Dockerfile и «контекста». Контекст сборки — это набор файлов, расположенных по определённому пути или URL. Используйте флаг -t , чтобы задать имя образа. Например, команда docker build -t my_container . соберёт образ, используя текущую директорию, на что указывает точка в конце.
- docker run — запускает контейнер, на основе указанного образа. Эту команду можно дополнять другими, например, docker run my_image -it bash запустит контейнер, а затем запустит в нём bash.
- docker logs — эта команда используется для просмотра логов указанного контейнера. Можно использовать флаг —follow , чтобы следить за логами работающей программы: docker logs —follow my_container .
- docker volume ls — показывает список томов, которые являются предпочитаемым механизмом для сохранения данных, генерируемых и используемых контейнерами Docker.
- docker rm — удаляет один и более контейнеров, например, docker rm my_container .
- docker rmi — удаляет один и более образов, например, docker rmi my_image .
- docker stop — останавливает один и более контейнеров. Команда docker stop my_container остановит один контейнер, а docker stop $(docker ps -a -q) — все запущенные. Более грубый способ — использовать docker kill my_container , который не пытается сначала аккуратно завершить процесс.
- Можно комбинировать эти команды. Например, для очистки всех контейнеров и образов:Останавливаем все запущенные контейнеры docker kill $(docker ps -q).Удаляем все остановленные контейнеры docker rm $(docker ps -a -q).Удаляем все образы docker rmi $(docker images -q).
Существует гораздо больше команд для Docker, о которых можно почитать в документации. Пробуйте новые примеры, комбинируйте их, и скоро это войдёт в привычку.
Управление контейнерами — Docker: Основы
Картинка описывает жизненный цикл контейнера. Кружками на нем изображены состояния, жирным выделены консольные команды, а квадратиками показывается то, что в реальности выполняется.
Проследите путь команды docker run . Несмотря на то, что команда одна, с точки зрения работы Docker выполняется два действия: создание контейнера и запуск. Существуют и более сложные варианты исполнения, но в этом разделе мы рассмотрим только базовые команды.
docker run
Запустим nginx так, чтобы он работал в фоне. Для этого после слова run добавляется флаг -d . Дополнительно, зададим контейнеру имя —name=nginx , чтобы упростить обращение к нему.
-d --name=nginx -p 8080:80 nginx 431a3b3fc24bf8440efe2bca5bbb837944d5ae5c3b23b9b33a5575cb3566444e
Убедитесь в том, что nginx работает, открыв в браузере ссылку localhost:8080 . Там вы увидите надпись Welcome to Nginx!.
docker logs
После запуска в фоне, Docker выводит идентификатор контейнера и возвращает управление в терминал. С одной стороны это позволяет работать программе независимо от терминала, с другой, мы теперь потеряли возможность смотреть логи в том месте, где мы ее запустили. Посмотреть логи можно командой docker logs , которой нужно передать идентификатор контейнера или его имя
# docker logs 431a3b3fc24bf8440efe2bca5bbb837944d5ae5c3b23b9b33a5575cb3566444e docker logs nginx 172.17.0.1 - - [19/Jan/2018:07:38:55 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36" "-"
docker logs выводит текущий лог и завершает работу, что бывает неудобно, если логи нужно просматривать в реальном времени. Для этого можно держать их постоянно открытыми по принципу работы команды tail -f . Для этого запустите docker logs -f 431a3b3fc24bf8440efe2bca5bbb837944d5ae5c3b23b9b33a5575cb3566444e . Теперь лог будет обновляться каждый раз, когда вы обновляете страницу в браузере. Выйти из этого режима можно набрав Ctrl+C , при этом сам контейнер остановлен не будет.
docker ps
Теперь выведем информацию о запущенных контейнерах командой docker ps :
"nginx -g 'daemon of…" 2 minutes ago Up 2 minutes 80/tcp nginx
- CONTAINER_ID — идентификатор контейнера. Так же, как и в git, используется сокращенная запись хеша
- IMAGE — имя образа, из которого был поднят контейнер. Если не указан тег, то подразумевается latest
- COMMAND — команда, которая выполнилась на самом деле при старте контейнера
- CREATED — время создания контейнера
- STATUS — текущее состояние
- PORTS — проброс портов
- NAMES — алиас. Docker позволяет кроме идентификатора иметь имя. Так гораздо проще обращаться с контейнером. Если при создании контейнера имя не указано, то Docker самостоятельно его придумывает. В выводе выше как раз такое имя у nginx
Команда docker ps выводит только запущенные контейнеры. Но кроме них могут быть и остановленные. Причем остановка может происходить как по успешному завершению, так и в случае ошибок. Попробуйте набрать docker run ubuntu ls , а затем docker run ubuntu bash -c «unknown» . Эти команды не запускают долгоживущий процесс, они завершаются сразу после выполнения, причем вторая с ошибкой, так как такой команды не существует.
Теперь выведем все контейнеры командой docker ps -a . Первыми тремя строчками вывода окажутся:
-a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 85fb81250406 ubuntu "bash -c unkown" Less than a second ago Exited (127) 3 seconds ago loving_bose c379040bce42 ubuntu "ls" Less than a second ago Exited (0) 9 seconds ago determined_tereshkova
Здесь как раз два последних запуска. Если посмотреть на колонку STATUS , то видно, что оба контейнера находятся в состоянии Exited . То есть запущенная команда внутри них выполнилась, и они остановились. Разница лишь в том, что один завершился успешно (0), а второй с ошибкой (127).
docker stop
Теперь попробуем остановить контейнер. Выполним команду:
# docker stop 431a3b3fc24b docker stop nginx 431a3b3fc24b
Остановка контейнера не удаляет его. Он будет отображаться в списке контейнеров:
-a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 431a3b3fc24b nginx "/docker-entrypoint.…" 7 seconds ago Exited (0) 1 second ago nginx
docker start
После остановки контейнер можно даже перезапустить:
# docker start 31a3b3fc24b docker start nginx
Запуск контейнера всегда стартует его в фоновом режиме, поэтому вы не увидите лога. Чтобы его посмотреть, воспользуйтесь командой docker logs nginx .
docker kill
docker stop шлет сигнал SIGTERM , который должен обработать приложение внутри контейнера и остановиться. Если оно настроено неправильно, то этого не произойдет и команда docker stop не сможет остановить контейнер. В этом случае понадобится docker kill . Эта команда использует сигнал SIGKILL , который гарантировано останавливает контейнер. Ее вывод идентичен:
# docker kill 431a3b3fc24b docker kill nginx 431a3b3fc24b
Открыть доступ
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
- 130 курсов, 2000+ часов теории
- 1000 практических заданий в браузере
- 360 000 студентов
Наши выпускники работают в компаниях:
Пример работы с контейнерами Docker
Docker – это программное обеспечение, которое с помощью контейнеров-образов собирает все необходимые зависимости для запуска приложений. Использование Docker контейнеров, позволяет запускать проекты на любых других машинах, где установлен Docker.
В этой статье рассмотрим каким образом можно создавать, запускать, останавливать и удалять контейнеры.
- Создание контейнера
- Перезапуск контейнера
- Удаление контейнера
Каждый раз, когда используется команда docker run, из образа, который вы указываете, создается новый контейнер.
Создание контейнера
- Команда docker run создает новый контейнер, который в качестве основания будет использовать образ Centos. Ключ -t откроет терминал, а -i – позволит взаимодействовать с ним. Для входа в контейнер можно использовать стандартную команду bash:
docker run -i -t centos:8 /bin/bash
В терминале появится подтверждение того, что вы находитесь внутри контейнера в качестве root-пользователя. После символа @ можно увидеть ID контейнера, в котором находитесь:
[root@fe158d095b9f /]#
Для проверки работы можно создать файл с произвольным содержимым и вывести его:
echo «Hello Sweb!» > /tmp/sometext.txt
cat /tmp/sometext.txt
В результате вывода должны увидеть «Hello Sweb!»
- Команда exit позволяет выйти из контейнера, после выхода, контейнер автоматически останавливается.
Проверим, используя команду docker ps, существуют ли в настоящий момент запущенные контейнеры:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Как видно — больше запущенных нет.
- Команда docker ps -a позволяет увидеть увидеть все контейнеры, в том числе и остановленные:
fe158d095b9f centos:8 «/bin/bash» About an hour ago Exited (0) 3 minutes ago stupefied_pasteur
При создании контейнера ему присваивается ID и автоматически генерируется имя. В этом примере fe158d095b9f – это ID) контейнера, а stupefied_pasteur – имя.
Команда ps -a позволяет увидеть эту информацию, а также образ, из которого контейнер был создан (в данном случае centos 8), время контейнер был создан (около часа назад), какая команда была запущена в контейнере (/bin/bash). Также вы можете посмотреть статус контейнера (из него вышли 3 минуты назад).
- Пробуем снова запустить выполнить команду для создания контейнера:
docker run -i -t centos:8 /bin/bash
Стоит заметить, что каждый раз вызывая стандартную команду запуска, docker создает новый контейнер и он будет иметь другой id. Если попытаемся открыть содержимое в созданном ранее файле образа, то мы увидим ошибку: cat: /tmp/sometext.txt: No such file or directory
Может сложиться впечатление, что данные пропали, но дело, не в этом.
- Выйдем из второго контейнера используя exit.
- Теперь убедимся, что 2 созданных контейнера (в том числе и первый с созданным файлом ) существуют в системе используя ps -a:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
648cada43cef centos:8 «/bin/bash» 13 minutes ago Exited (127) 5 seconds ago inspiring_kare fe158d095b9f centos:8 «/bin/bash» About an hour ago Exited (0) 28 minutes ago stupefied_pasteur
Перезапуск контейнера
Для запуска ранее созданного контейнера, необходимо вызвать команду start с ключом –ai и далее указать ключ нужного контейнера или его имя. Команда будет выглядеть так:
docker start -ai fe158d095b9f
Мы снова попали в оболочку контейнера, где был создан файл sometext.txt, можно его открыть cat /tmp/sometext.txt и мы увидим нужное содержимое.
Все изменения внутри контейнера сохраняются, даже в том случае, если контейнер был остановлен. Информация внутри контейнера будет только, если был удален контейнер.
Удаление контейнера
Удалить контейнеры можно используя команду docker rm. Команда сработает только на остановленные контейнеры. После команды нужно указать id либо имя одного или нескольких контейнеров. Например, удалим 2 созданных нами контейнера:
docker rm 648cada43cef fe158d095b9f
Если контейнеры остановлены и существуют, на выходе мы увидим
648cada43cef fe158d095b9f
Контейнеры были удалены
Шпаргалка с командами Docker
Прим. перев.: Неделю назад Aymen El Amri, руководящий компанией eralabs и создавший обучающий курс «Безболезненный Docker», опубликовал свой Docker Cheat Sheet — шпаргалку по основным командам Docker. Git-репозиторий этого документа на GitHub уже набрал 1000+ stars и несколько сторонних контрибьюторов, что подтвердило его актуальность и пользу.

Представленные здесь команды описаны минимально (с акцентом на читаемость как есть) и включают в себя установку Docker, работу с реестрами и репозиториями, контейнерами, образами, сетью, Docker Swarm. Ниже представлен перевод шпаргалки в её состоянии на 2 сентября с дополнениями из комментариев ниже.
Установка
Linux
curl -sSL https://get.docker.com/ | sh
Mac
Скачайте dmg по этой ссылке:
https://download.docker.com/mac/stable/Docker.dmg
Windows
Используйте MSI-инсталлятор:
https://download.docker.com/win/stable/InstallDocker.msi
Реестры и репозитории Docker
Вход в реестр
docker login
docker login localhost:8080
Выход из реестра
docker logout
docker logout localhost:8080
Поиск образа
docker search nginx
docker search nginx -- filter stars=3 --no-trunc busybox
Pull (выгрузка из реестра) образа
docker pull nginx
docker pull eon01/nginx localhost:5000/myadmin/nginx
Push (загрузка в реестр) образа
docker push eon01/nginx
docker push eon01/nginx localhost:5000/myadmin/nginx
Первые действия с контейнерами
Создание контейнера
docker create -t -i eon01/infinite --name infinite
Первый запуск контейнера
docker run -it --name infinite -d eon01/infinite
Переименование контейнера
docker rename infinite infinity
Удаление контейнера
docker rm infinite
Обновление контейнера
docker update --cpu-shares 512 -m 300M infinite
Запуск и остановка контейнеров
Запуск остановленного контейнера
docker start nginx
Остановка
docker stop nginx
Перезагрузка
docker restart nginx
Пауза (приостановка всех процессов контейнера)
docker pause nginx
Снятие паузы
docker unpause nginx
Блокировка (до остановки контейнера)
docker wait nginx
Отправка SIGKILL (завершающего сигнала)
docker kill nginx
Отправка другого сигнала
docker kill -s HUP nginx
Подключение к существующему контейнеру
docker attach nginx
Получение информации о контейнерах
Работающие контейнеры
docker ps
docker ps -a
Логи контейнера
docker logs infinite
Информация о контейнере
docker inspect infinite
docker inspect --format '>' $(docker ps -q)
События контейнера
docker events infinite
Публичные порты
docker port infinite
Выполняющиеся процессы
docker top infinite
Использование ресурсов
docker stats infinite
Изменения в файлах или директориях файловой системы контейнера
docker diff infinite
Управление образами
Список образов
docker images
Создание образов
docker build .
docker build github.com/creack/docker-firefox
docker build - < Dockerfile
docker build - < context.tar.gz
docker build -t eon/infinite .
docker build -f myOtherDockerfile .
curl example.com/remote/Dockerfile | docker build -f - .
Удаление образа
docker rmi nginx
Загрузка репозитория в tar (из файла или стандартного ввода)
docker load < ubuntu.tar.gz
docker load --input ubuntu.tar
Сохранение образа в tar-архив
docker save busybox > ubuntu.tar
Просмотр истории образа
docker history
Создание образа из контейнера
docker commit nginx
Тегирование образа
docker tag nginx eon01/nginx
Push (загрузка в реестр) образа
docker push eon01/nginx
Сеть
Создание сети
docker network create -d overlay MyOverlayNetwork
docker network create -d bridge MyBridgeNetwork
docker network create -d overlay \ --subnet=192.168.0.0/16 \ --subnet=192.170.0.0/16 \ --gateway=192.168.0.100 \ --gateway=192.170.0.100 \ --ip-range=192.168.1.0/24 \ --aux-address="my-router=192.168.1.5" --aux-address="my-switch=192.168.1.6" \ --aux-address="my-printer=192.170.1.5" --aux-address="my-nas=192.170.1.6" \ MyOverlayNetwork
Удаление сети
docker network rm MyOverlayNetwork
Список сетей
docker network ls
Получение информации о сети
docker network inspect MyOverlayNetwork
Подключение работающего контейнера к сети
docker network connect MyOverlayNetwork nginx
Подключение контейнера к сети при его запуске
docker run -it -d --network=MyOverlayNetwork nginx
Отключение контейнера от сети
docker network disconnect MyOverlayNetwork nginx
Очистка Docker
Удаление работающего контейнера
docker rm nginx
Удаление контейнера и его тома (volume)
docker rm -v nginx
Удаление всех контейнеров со статусом exited
docker rm $(docker ps -a -f status=exited -q)
Удаление всех остановленных контейнеров
docker container prune
docker rm `docker ps -a -q`
Удаление контейнеров, остановленных более суток назад
docker container prune --filter "until=24h"
Удаление образа
docker rmi nginx
Удаление неиспользуемых (dangling) образов
docker image prune
docker rmi $(docker images -f dangling=true -q)
Удаление неиспользуемых (dangling) образов даже с тегами
docker image prune -a
Удаление всех образов
docker rmi $(docker images -a -q)
Удаление всех образов без тегов
docker rmi -f $(docker images | grep "^" | awk "")
Остановка и удаление всех контейнеров
docker stop $(docker ps -a -q) && docker rm $(docker ps -a -q)
Удаление неиспользуемых (dangling) томов
docker volume prune
docker volume rm $(docker volume ls -f dangling=true -q)
Удаление неиспользуемых (dangling) томов по фильтру
docker volume prune --filter "label!=keep"
Удаление неиспользуемых сетей
docker network prune
Удаление всех неиспользуемых объектов
docker system prune
По умолчанию для Docker 17.06.1+ тома не удаляются. Чтобы удалились и они тоже:
docker system prune --volumes
Docker Swarm
Установка Docker Swarm
curl -ssl https://get.docker.com | bash
Прим. перев.: в Docker версий 1.12.0+ ничего дополнительно устанавливать не требуется, т.к. Docker Swarm встроен в Docker Engine в виде специального режима (Swarm mode).
Инициализация Swarm
docker swarm init --advertise-addr 192.168.10.1
Подключение рабочего узла (worker) к Swarm
docker swarm join-token worker
Подключение управляющего узла (manager) к Swarm
docker swarm join-token manager
Список сервисов
docker service ls
Список узлов
docker node ls
Создание сервиса
docker service create --name vote -p 8080:80 instavote/vote
Список заданий Swarm
docker service ps
Масштабирование сервиса
docker service scale vote=3
Обновление сервиса
docker service update --image instavote/vote:movies vote
docker service update --force --update-parallelism 1 --update-delay 30s nginx
docker service update --update-parallelism 5--update-delay 2s --image instavote/vote:indent vote
docker service update --limit-cpu 2 nginx
docker service update --replicas=5 nginx
P.S.
Прим. перев.: Напомню, что оригинальная (англоязычная) версия Docker Cheat Sheet доступна и обновляется в Git-репозитории. Автор будет рад исправлениям/пополнениям от сообщества.
Читайте также в нашем блоге:
- «Play with Docker — онлайн-сервис для практического знакомства с Docker».
- «В чём суть проекта Moby и почему главным репозиторием Docker вдруг стал moby/moby?»
- «Собираем Docker-образы для CI/CD быстро и удобно вместе с dapp (обзор и видео)».
- Блог компании Флант
- Системное администрирование
- Серверное администрирование
- DevOps