Краткая справка
Docker — это система управления контейнерами. Контейнеры же представляют собой логическое эволюционное продолжение виртуальных машин. Это изолированная среда для разработки и тестирования программного обеспечения.
Контейнер Docker потребляет мало ресурсов и быстро запускается, а еще его легко переносить с одного устройство на другое. Из-за этих преимуществ Docker постепенно наращивает аудиторию и превращается в некий индустриальный стандарт, которым пользуются даже крупные корпорации вроде Microsoft.
Поэтому стоит хотя бы на базовом уровне понимать, что есть Docker и как им управлять. В этом материале речь пойдет об основных командах для управления контейнерами. Будем их создавать, запускать, удалять и выполнять прочие полезные задачи, возникающие по ходу работы.
Работа с командой Docker без прав суперпользователя
В дефолтных настройках предусмотрено, что для запуска Docker необходимо иметь права root-пользователя или пользователя из группы docker, создаваемой автоматически во время установки сервиса.
Если попробовать запустить в терминале Docker без этих прав или, не являясь пользователем группы docker, появится ситуация, когда не запускается контейнер.
Поэтому если нет желания постоянно набирать sudo перед запуском команды, стоит добавить своего пользователя в указанную выше группу:
sudo usermod -aG docker ${USER}
Чтобы применить изменения, потребуется выйти с заново войти на сервер. Можно также воспользоваться этой командой:
su - ${USER}
Продолжить работу можно будет после ввода пароля пользователя. Проверить, что добавление пользователя прошло успешно, можно командой (пользователь sammy):
id -nG
При желании добавить выбранного пользователя в группу, можно указать его имя:
sudo usermod -aG docker username
Последующие шаги предполагают, что пользователь уже добавил себя в группу docker. Если нет желания это делать, перед командами необходимо набирать sudo.
Установка Docker Desktop
если серверная часть WSL 2 поддерживается в docker Desktop для Windows, вы можете работать в среде разработки на основе linux и создавать контейнеры на основе linux, используя Visual Studio Code для редактирования кода и отладки и запуска контейнера в Microsoft Edge браузере на Windows.
Чтобы установить DOCKER (после установки WSL), выполните следующие действия.
-
Скачайте и следуйте инструкциям по установке.
-
после установки запустите приложение docker Desktop из Windows меню, а затем выберите значок docker в меню «скрытые значки» панели задач. щелкните правой кнопкой мыши значок, чтобы открыть меню команд docker, и выберите «Параметры».
-
убедитесь, что в Параметрыобщие установлен флажок «использовать ядро на основе WSL 2» .
-
выберите из установленных дистрибутивов WSL 2, для которых вы хотите включить интеграцию с docker, перейдя по: ПараметрыресурсыWSL integration.
-
Чтобы убедиться, что DOCKER установлен, откройте дистрибутив WSL (например, Ubuntu) и отобразите версию и номер сборки, введя следующее:
-
Проверьте, правильно ли работает установка, выполнив простой встроенный образ DOCKER с помощью:
Совет
Вот несколько полезных команд DOCKER для получения сведений:
- Перечислить команды, доступные в интерфейсе командной строки Docker, можно, выполнив команду .
- Просмотреть сведения о конкретной команде можно, выполнив команду .
- Перечислить образы Docker на вашем компьютере (сейчас только образ Hello-World) можно, используя следующие команды .
- Перечислите контейнеры на компьютере с помощью: или (без флага Показать все, будут отображаться только выполняющиеся контейнеры).
- Перечислите системную информацию об установке DOCKER, включая статистику и ресурсы (память ЦП & ), доступные в контексте WSL 2, с помощью:
Запуск обораза
Вы запускаете контейнер Docker, запустив образ. Существует несколько способов запуска контейнера, которые влияют на то, как легко будет управлять всеми контейнерами. Когда контейнер запускается, он обычно выполняет команду, определенную в Dockerfile. Вот Dockerfile для контейнера hello-world:
Команда просто запускает двоичный файл «hello», который был скопирован в корень контейнера при создании образа.
Foreground vs. Detached
Контейнер может работать на переднем плане, где он блокируется, пока процесс не завершится, и контейнер перестанет работать. В режиме переднего плана контейнер выводит свой вывод на консоль и может читать стандартный ввод. В отключенном режиме (когда вы указываете флаг -d), управление возвращается немедленно, а контейнер
Запуск контейнера «Без названия»
Самый простой способ запуска контейнера:
Когда вы запускаете контейнер с помощью этой команды, Docker назначает ему имя, состоящее из двух случайных слов. Например: .
Если у вас уже есть образ hello-world, то Docker запустит его. Если такого образа нет, он вытащит его из официального Docker-хранилища DockerHub, а затем запустит его. Результат должен выглядеть так:
Программа приветствия выйдет после отображения сообщения, которое завершает процесс, выполняющийся внутри контейнера, и завершает работу самого контейнера. Контейнер все еще торчит, если вы хотите подключиться к нему, изучить журналы или что-то еще. Чтобы просмотреть контейнер, вы можете запустить следующую команду:
Ниже я расскажу, как получить все контейнеры и все соответствующие параметры. Теперь давайте сосредоточимся на разделе «Names». Docker автоматически генерирует имя «clever_liskov», и мне придется использовать его или идентификатор контейнера для обращения к этому контейнеру для любых целей, таких как перезагрузка, удаление или выполнение команды.
Запуск именованного контейнера
Использование идентификаторов контейнеров или автогенерированных имен иногда неудобно. Если вы часто взаимодействуете с контейнером, который вы часто повторно создаете, тогда он получит другой идентификатор и автогенерированное имя. Кроме того, имя будет случайным.
Docker позволяет вам называть свои контейнеры, когда вы запускаете их, предоставляя аргумент командной строки «—name <имя контейнера>». В простых случаях, когда у вас есть только один контейнер на образ, вы можете назвать контейнер по имени вашего образа: .
Теперь, если мы посмотрим на процесс (я удалил clever_liskov ранее), мы увидим, что контейнер называется hello-world:
Существует несколько преимуществ для именованного контейнера:
- У вас есть стабильное имя для ваших контейнеров, которые вы используете как в интерактивном режиме, так и в сценариях.
- Вы можете выбрать значащее имя.
- Вы можете выбрать краткое имя для удобства при работе в интерактивном режиме.
- Это предотвращает случайное наличие нескольких контейнеров одного и того же образа (при условии, что вы всегда указываете одно и то же имя).
Давайте посмотрим на последний вариант. Если я попытаюсь снова запустить ту же команду запуска с тем же именем «hello-world», я получаю сообщение об ошибке:
Запуск автоматического удаления образа
По умолчанию контейнеры придерживаются. Иногда они вам не нужны. Вместо того, чтобы вручную удалять выведенные контейнеры, вы можете это автоматизировать. Аргумент командной строки сделает что нужно: .
Запуск другой команды
По умолчанию Docker запускает команду, указанную в Dockerfile , который используется для сборки образа (или непосредственно в точке входа, если команда не найдена). Вы всегда можете переопределить ее, предоставив свою собственную команду в конце команды run. Давайте запустим на образе busybox (образ hello-world не имеет исполняемого файла ):
Вопросы
Я знаю, что Hyper-V на Windows не уживается со всеми остальными гипервизорами, типа VirtualBox. А как проявляет себя WSL2?
Действительно, Hyper-V и VirtualBox между собой конфликтуют. У Docker в Windows есть поддержка экспериментальных функций, которая позволяет не создавать виртуальную машину в гипервизоре, а использовать линуксовый движок ядра. Но как это работает, я сказать точно сказать не могу, потому что я очень редко использую Docker на Windows – он не работает на нем стабильно. Можно использовать Docker на Windows для тестов, можно поиграться, а на продуктив ставить пока что, к сожалению, не стоит.
UPD: Недавно узнал, что на последних версиях wsl2 уже не конфликтует с другими гипервизорами. Но не проверял.
Эталонная база очень большая – 250 Гб. Если я эту базу упакую в Docker, где будет сидеть еще и 1С и все остальное окружение, как такого монстра разворачивать?
База – это все-таки данные. Я знаю примеры, когда люди упаковывают базу именно в Docker и потом его поднимают. Но я не пробовал упаковывать такие огромные базы в сам контейнер. Мне кажется, лучше сделать так – данные базы будут храниться в каком-то именованном volume, а в контейнере понимается сервис – тот же postgres. И он подцепляет в качестве источника данных этот именованный volume вовнутрь. Таким вариантом можно сделать, но тут другой вопрос – Docker подразумевает, что нужно быстро создать новое окружение и что-то на нем потестить, а как быстро создать новую копию базы на 250 Гб я пока не знаю.
*************
Данная статья написана по итогам доклада (видео), прочитанного на онлайн-митапе «DevOps в 1С: Тестирование и контроль качества решений на 1С». Больше статей можно прочитать здесь.
5 ответов
Лучший ответ
Контейнер Docker распределяется по категориям следующим образом.
-
Задача: при запуске контейнера он начнет обработку и завершит процесс, а затем завершится.
-
Фоновый контейнер: он будет ждать некоторого запроса.
Поскольку вы не предоставили свой файл докера, я предполагаю, что у вас есть только одно заявление.
Ваше утверждение сборки создает изображение с именем pm.
-
Теперь ты бежишь докер запустить вечера Он запустит контейнер и остановится, так как вы не указали точку входа.
-
Теперь попробуй это Это одна командная строка или терминал.
Откройте другой терминал или командную строку.
-
Если вы хотите увидеть контейнер, который постоянно работает, используйте следующее изображение. (Это всего лишь пример)
Над строкой запустите один контейнер с изображением Nginx, и когда вы откроете браузер http: // localhost: 8099, вы увидите ответ ,
dotnetstep
24 Окт 2018 в 02:20
Каждая инструкция Dockerfile — это слой в контейнере, который выполняет какую-то задачу. В вашем файле Docker это просто загрузка Ubuntu, которая завершается, когда вы запускаете Docker в течение доли секунды и завершаете работу после завершения процесса. Так что если вы хотите, чтобы ваш контейнер работал постоянно, то в докере должен быть запущен процесс переднего плана. Для тестирования, если вы запускаете
вернет вывод, значит ваш контейнер в порядке.
1
Mahattam
24 Окт 2018 в 01:09
Контейнеры Docker тесно связаны с процессом, который они выполняют. Этот процесс определяется частью «CMD» в Dockerfile. Этот процесс имеет PID «1». Если вы убьете его, ваш контейнер будет убит. Если у вас его нет, ваш контейнер немедленно остановится. В вашем случае вы должны «переопределить» свой CMD. Вы можете сделать это с помощью простой команды: «Docker Run -it Ubuntu: 18.04 Bash». «-it» является обязательным, поскольку позволяет подключить stdin к вашему контейнеру.
Веселитесь с докером.
1
Jonathan Schoreels
23 Окт 2018 в 21:08
Ваше изображение Docker фактически ничего не делает, контейнер останавливается, когда завершает свою работу. Поскольку здесь не запущен процесс переднего плана, он будет запущен, а затем немедленно остановлен. Чтобы убедиться, что у вашего контейнера нет проблем, попробуйте поместить приведенный ниже код в (в той же папке, что и ) и запустите , теперь вы увидите, что ваш контейнер работает без выхода ,
Пожалуйста, посмотрите здесь , которое поможет вам понять, как работать с докером.
2
Ntwobike
23 Окт 2018 в 19:42
Пытаться запустить оболочку внутри контейнера.
Это мало что даст для вас, но это покажет вам, что происходит: как только вы выйдете из оболочки, она тоже выйдет из контейнера.
Ваш контейнер в основном ничего не делает: у него есть образ Ubuntu, но у него нет команды ENTRYPOINT или CMD для запуска чего-то. Контейнеры эфемерны при запуске: они запускают одну команду и выходят после ее завершения.
2
MrE
24 Окт 2018 в 00:41
Общие сведения о контейнерах Docker
Docker — это средство для создания, развертывания и запуска приложений с использованием контейнеров. Контейнеры позволяют разработчикам упаковывать приложения с использованием всех необходимых компонентов (библиотек, платформ, зависимостей и т. п.) и поставлять все это как один пакет. Использование контейнера дает возможность приложению работать одинаково, независимо от настроенных параметров или ранее установленных библиотек на компьютере, где оно запускается, так как он может отличаться от компьютера, который использовался для написания и тестирования кода приложения. Это позволяет разработчикам сосредоточиться на написании кода, не беспокоясь о том, в какой системе он будет выполняться.
Контейнеры Docker похожи на виртуальные машины, но не создают всю виртуальную операционную систему. Вместо этого контейнер Docker позволяет приложению использовать то же ядро Linux, что и система, в которой оно работает. Таким образом пакету приложения требуются только те части, которых еще нет на главном компьютере. В результате размер пакета уменьшается, а производительность увеличивается.
Постоянная доступность, которую обеспечивает использование контейнеров Docker с такими инструментами, как Kubernetes, — еще одна причина популярности контейнеров. Это позволяет создавать несколько версий контейнера приложения в разное время. Вместо того чтобы останавливать всю систему для обновления или обслуживания, каждый контейнер (и определенные микрослужбы) можно заменить на лету. Вы можете подготовить новый контейнер со всеми обновлениями, настроить его для рабочей среды и просто указать новый контейнер после его готовности. Можно также архивировать различные версии вашего приложения, используя контейнеры, и при необходимости поддерживать их работу в качестве резервного ресурса.
Дополнительные сведения см. в разделе Введение в контейнеры DOCKER на Microsoft Learn.
Загрузка образов Docker из удалённого реестра
Docker Hub
Docker Hub — это служба Docker для нахождения и совместного использования образов контейнеров.
Если вы хотите извлечь оттуда образы для локального реестра, то это так же просто, как выполнение команды , сопровождаемой путём образа. Нижеприведённая команда демонстрирует извлечение и запуск стабильной версии образа R Rocker.
Docker сперва проверит, доступен ли этот образ на вашей локальной машине. Если нет, он приступит к его загрузке с репозитория Docker Hub. Такое поведение предусмотрено изначально.
Если вы хотите просто извлечь образ и не запускать контейнер, тогда подойдёт команда .
Для входа на Docker Hub вы можете запустить вышеприведённую команду, которая предложит ввести пароль.
Пользовательский реестр Docker
Если вы извлекаете образ из обобщённого пользовательского реестра Docker, требующего авторизацию, то команда позволят произвести извлечение из любого реестра Docker, как показано выше. Имейте в виду, что при использовании приведённого подхода, будет создана запись в файле . Присоедините для изменения деталей авторизации.
Реестр Elastic-контейнеров Amazon
Реестр Elastic-контейнеров (ECS) — это полноценно поддерживаемый реестр контейнеров Docker, позволяющий разработчикам хранить, поддерживать и разворачивать образы контейнеров Docker. Amazon ECS отлично работает с Amazon ECR. Если вам вдруг понадобится извлечь образы из реестра ECR, следуйте следующим инструкциям.
Вам нужно настроить AWS CLI так, чтобы пользователь IAM имел доступ к AWS и секретный ключ.
Amazon ECR требует, чтобы ключи пользователя IAM имели разрешения () через политику IAM, только тогда вы сможете авторизоваться и извлечь образы. В качестве альтернативы вы можете использовать утилиту Amazon ECR Docker Credential Helper. Ниже представлен подход, предполагающий использование вами AWS CLI и корректную настройку всех разрешений.
Команда генерирует длинную команду входа Docker. Скопируйте её и выполните. Авторизация необходима, чтобы получить возможность извлекать образы из AWS ECR.
Экспорт и импорт физических образов Docker
Если вам понадобится экспортировать образ Docker на диск и загрузить обратно, вышеуказанная команда это осуществит.
Экспортирование в файл полезно для случаев, когда вам нужно переместить образы с одной машины на следующую через альтернативного посредника (не через реестр Docker). Существует несколько сред, имеющих запрет доступа в связи с их политикой безопасности. Это может помешать вам произвести миграцию между реестрами, поэтому приведённая команда весьма полезна, хотя зачастую несправедливо недооценена.
Всех вам благ и удачного кодинга!
Сканируем образы Docker на уязвимости
Docker для разработки Go с горячей перезагрузкой
Почему вы должны обратить внимание на Docker?
Перевод статьи Timothy Mugayi: The Ultimate Docker Command List.
Собираем образ (image) ¶
В предыдущих примерах я два раза установил один и тот же пакет в два разных контейнера. Это, мягко говоря, неудобно. Докер предлагает более гибкое и простое решения — собрать образ с уже установленными пакетами и некоторыми настройками.
Работа с образом не представляет ничего сложного. Нужно создать файл Dockerfile, указать в нём образ-источник, добавить свои команды и собрать.
Прежде, чем писать файл, я бы хотел определить проблемы, которые нужно решить:
- Установить пакет php7.0-cli.
- Сделать точку входа (чтобы не мучить cat)
Указать проброс портов или папки в Dockerfile файле нельзя (несмотря на директивы EXPOSE и VOLUME, проброс и монтирование можно делать только при запуске контейнера). Сделано это специально по причинам безопасности, иначе владелец образа в репозитории мог бы подключать любую системную папку в контейнер без ведома пользователя и красть данные.
Создаём Dockerfile в любой папке со следующим содержимым:
Несколько слов об установке пакетов. Изначально в сборках *-slim отсутствует дерево пакетов (для уменьшения размера образа), поэтому надо обязательно выполнять . После установки желательно удалить ненужные файлы и папки, поэтому выполняются команды очистки.
Небольшое отступление про точку входа. Как я уже говорил, основная специализация докера, это изолирование процесса. Поэтому в одном контейнере запускается всегда один процесс, и точка входа тоже всегда одна. Если нужно запустить вместе несколько процессов (например, php-frm и nginx), то пишется скрипт, который становится точкой входа и запускает нужные приложения. Но объявить несколько точек входа, на данный момент, нельзя.
Теперь нужно собрать образ командой:
Пояснения к команде:
- — запускает сборку образа.
- — задаёт имя и тэг образа. Если тэг не указан, используется значение .
- — явно указывает расположение Dockerfile. Можно опустить, если файл называется Dockerfile и находится в текущей директории.
- — рабочая директория для сборки образа. Относительные пути в Dockerfile будут строиться от этой папки.
Готово! Теперь можно запустить контейнер из нашего образа:
Если всё сделано правильно, то список запущенных контейнеров должен быть таким:
Ура! Теперь вы гуру Конечно, это далеко не все возможности докера, но это то, на чём строятся большие проекты. В основе каждого проекта стоят контейнеры, которые запускаются из образов. Комбинации контейнеров образуют кластеры, которые обеспечивают безотказную работу крупных приложений.
Присвоение имени
Чтобы не приходилось узнавать и запоминать идентификатор контейнера, при создании можно назначать каждому контейнеру уникальное имя, используя опцию командной строки —name, как в следующем примере:
# docker run --name myname ubuntu cat /etc/debian_version
После этого можно работать с контейнером (выполнять команды start, stop, remove, top, stats), обращаясь к нему по имени, например:
docker start myname – запуск контейнераdocker stats myname – отображение статистики использования ресурсовdocker top myname – отображение запущенных в контейнере процессов
Если вы попытаетесь выполнить например команду top, из выше указанного примера то получите ошибку
Error response from daemon: Container f0774dca8b06e356ae1807f33f74fd0f7d27643338f8fb1636c5b51c75893602 is not running
Я думаю если вы внимательно читали статью то сможете сами ответить почему возникает эта ошибка.
Создание и запуск контейнеров
Запомните основные постулаты контейнеров в docker
- Контейнер живет, пока живет процесс, вокруг которого рождается контейнер.
- Внутри контейнера этот процесс имеет pid=1
- Рядом с процессом с pid=1 можно порождать сколько угодно других процессов (в пределах возможностей ОС, естественно), но убив (рестартовав) именно процесс с pid=1, контейнер выходит. (см п.1)
- Внутри контейнера вы увидите привычное согласно стандартам FHS расположение директорий. Расположение это идентично исходному дистрибутиву (с которого взят контейнер).
- Данные, создаваемые внутри контейнера остаются в контейнере и нигде более не сохраняются (ну, еще к этому слою есть доступ из хостовой ОС). удалив контейнер — потеряете все ваши изменения. Поэтому данные в контейнерах не хранят, а выносят наружу, на хостовую ОС.
Создание контейнера
# docker container create ОБРАЗ
Или
# docker container create -a STDIN ОБРАЗ
-a – сокращение от –attach (прикрепить). Контейнер можно прикрепить к стандартным потокам STDIN, STDOUT или STDERR.
Запуск существующего контейнера (можно обращаться к контейнеру по идентификатору или имени):
docker container start КОНТЕЙНЕР
Определить идентификатор или имя можно при помощи команды ps. Опция «–l» означает последний запущенный контейнер:
# docker ps -l
Как уже было рассмотрено в предыдущей части, команда run объединяет создание и запуск контейнера. Для краткости с ней можно не указывать слово container.
# docker container run ОБРАЗ
Или
# docker run ОБРАЗ
Для запуска внутри контейнера команды:
# docker container run ОБРАЗ КОМАНДА
Запуск в фоновом режиме
# docker container run -d ОБРАЗ
-d – это сокращение от –detach (отсоединить). Контейнер будет работать в фоновом режиме, и вы сможете использовать терминал для других команд.
Возможности Docker Desktop
Существует множество преимуществ:
- Поддерживает широкий спектр инструментов разработки.
- Обеспечьте быстрый и оптимизированный способ создания и публикации контейнерного образа на любой облачной платформе.
- Простота установки и настройки полной среды Docker
- Повышение производительности благодаря встроенной виртуализации Hyper-V для Windows и HyperKit для MAC.
- Возможность работать в Linux через WSL 2 на компьютерах с Windows.
- Легкий доступ к работающим контейнерам в локальной сети.
- Возможность поделиться любым приложением на облачной платформе, на разных языках и в разных средах.
- Для обеспечения безопасности и актуальности выполняются автоматические обновления.
- Включены последние версии Kubernetes.
- Возможность переключения между Linux и Windows сервером на Windows.
Однако
Также рекомендуем прочитать:
- Docker для начинающих — технология контейнеров
- В чем разница между Docker и Kubernetes?
- Введение в Docker Hub и все, что вы должны знать о нем
- Как установить Docker на Ubuntu, Windows, Debian и CentOS?
- Kubernetes — Введение для начинающих
- Docker посмотреть запущенные контейнеры, запустить или остановить контейнеры
Docker на Windows
Есть два варианта Docker на Windows.
1. Использование Docker Toolbox
Docker Toolbox предоставляет набор легких инструментов.
- Oracle virtual box
- Docker Engine
- Docker Machine
- Docker compose
- Kitematic GUI
Вышеуказанные инструменты устраняют необходимость развертывания отдельной виртуальной машины для запуска Docker. Просто установите исполняемый файл панели инструментов Docker непосредственно в Windows и начните разработку приложений. Требуется 64-битная ОС и Windows 7 или выше с включенным режимом виртуализации.
Но опять же, панель инструментов Docker — это оригинальная поддержка, предоставляемая в Windows для запуска Docker и его устаревшего решения для всех ОС Windows, которые не соответствуют требуемой конфигурации.
2. Использование Docker Desktop
Docker Desktop — это новейшая технология, используемая для Docker в Windows. Он заменяет виртуальную машину Oracle собственной технологией виртуализации, доступной в Windows, то есть Microsoft Hyper-V.
Он по-прежнему будет запускать Docker на Linux-машине, созданной под ним. Но на этот раз вместо виртуальной машины Oracle мы использовали нативный Microsoft Hyper-V.
Выполнение контейнера Windows
В этом простом примере будет создан и развернут образ контейнера «Hello World». Для вашего удобства лучше выполнять эти команды в окне командной строки с повышенными привилегиями. Не используйте интегрированную среду сценариев Windows PowerShell, так как она не работает для интерактивных сеансов с контейнерами и в результате контейнеры перестают отвечать на запросы.
-
Запустите контейнер с интерактивным сеансом из образа . Для этого введите следующую команду в окне командной строки:
-
После запуска контейнера окно командной строки переходит в контекст контейнера. Внутри контейнера мы создадим простой текстовый файл «Hello World», а затем выйдем из контейнера с помощью следующих команд:
-
Получите идентификатор контейнера, из которого вы только что вышли, выполнив команду docker ps:
-
Создайте новый образ HelloWorld с учетом тех изменений, которые внесли в первом запущенном контейнере. Для этого выполните команду docker commit, заменив идентификатором реального контейнера:
После завершения вы получите пользовательский образ, содержащий скрипт «Привет мир». Это можно проверить с помощью команды docker images.
Ниже приведен пример выходных данных.
-
Наконец, запустите новый контейнер с помощью команды docker run с параметром , который позволяет автоматически удалить контейнер по завершении работы командной оболочки (cmd.exe).
В результате Docker создает контейнер на основе образа HelloWorld. В этом контейнере Docker запускает экземпляр командной строки cmd.exe, которая считывает указанный файл и выводит его содержимое в оболочку. В конце Docker приостанавливает работу контейнера и удаляет его.