Как выйти из контейнера docker
Перейти к содержимому

Как выйти из контейнера docker

  • автор:

10 команд для Docker, без которых вам не обойтись

Docker — полезный инструмент для создания микросервисов. Чтобы эффективнее работать с ним, вам пригодятся команды, 10 из которых мы сегодня обсудим.

Обложка поста 10 команд для Docker, без которых вам не обойтись

Docker — отличный инструмент для создания микросервисов, который позволяет создавать облачные приложения и системы. Чтобы выжать из него максимум через терминал, вам пригодятся 10 команд, перечисленных ниже.

Контейнер запускается путём запуска образа. Образ — исполняемый пакет, который содержит всё необходимое для запуска приложения: код, среду выполнения, библиотеки, переменные среды и конфигурационные файлы.Контейнер создаётся из образа. Это то, чем становится образ во время исполнения (иными словами, образом с состоянием или пользовательским процессом). Вы можете просмотреть список запущенных контейнеров с помощью команды docker ps , прямо как в Linux.

Docker Concepts

  1. docker ps — показывает список запущенных контейнеров. Некоторые из полезных флагов:-a / —all — список всех контейнеров (по умолчанию показывает только запущенные);-q / —quiet — перечислить только id контейнеров (полезно, когда вам нужны все контейнеры).
  2. docker pull — большинство образов создаётся на основе базового образа из Docker Hub. Docker Hub содержит множество готовых образов, которые можно использовать вместо того, чтобы создавать и настраивать свой собственный. Чтобы скачать определённый образ или набор образов (репозиторий), используйте команду docker pull .
  3. docker build — эта команда собирает образ Docker из Dockerfile и «контекста». Контекст сборки — это набор файлов, расположенных по определённому пути или URL. Используйте флаг -t , чтобы задать имя образа. Например, команда docker build -t my_container . соберёт образ, используя текущую директорию, на что указывает точка в конце.
  4. docker run — запускает контейнер, на основе указанного образа. Эту команду можно дополнять другими, например, docker run my_image -it bash запустит контейнер, а затем запустит в нём bash.
  5. docker logs — эта команда используется для просмотра логов указанного контейнера. Можно использовать флаг —follow , чтобы следить за логами работающей программы: docker logs —follow my_container .
  6. docker volume ls — показывает список томов, которые являются предпочитаемым механизмом для сохранения данных, генерируемых и используемых контейнерами Docker.
  7. docker rm — удаляет один и более контейнеров, например, docker rm my_container .
  8. docker rmi — удаляет один и более образов, например, docker rmi my_image .
  9. docker stop — останавливает один и более контейнеров. Команда docker stop my_container остановит один контейнер, а docker stop $(docker ps -a -q) — все запущенные. Более грубый способ — использовать docker kill my_container , который не пытается сначала аккуратно завершить процесс.
  10. Можно комбинировать эти команды. Например, для очистки всех контейнеров и образов:Останавливаем все запущенные контейнеры 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

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *