Команды Docker по работе с контейнерами

Например, мы запускаем контейнер с Python с доступом к терминалу, команда будет такой: docker run -ti python:latest . Если не указать -ti , то выйти из терминала Python будет очень затруднительно.
Просмотреть список запущенных контейнеров можно командой docker ps . Однако в таком виде команда вернёт список только запущенных контейнеров, чтобы вывести список всех контейнеров, в том числе и остановленных, нужно указать ключ -a . Еще один полезный ключ для отображения списка контейнеров: -q . Он выводит только ID контейнеров.
Остановить контейнер можно командой docker stop имя/id контейнера , а перезагрузить — docker restart имя/id контейнера .
Для удаления контейнера применяется команда docker rm имя/id контейнера . Если нужно удалить все контейнеры можно применить связку команд: docker rm $(docker ps -qa) .
Удалить все не связанные с контейнерами ресурсы (образы, контейнеры, тома и сети) можно командой docker system prune . Если требуется удалить все остановленные контейнеры и неиспользуемые образы можно воспользоваться командой docker system prune -a .
Если вы интересуетесь Docker и контейнеризацией в целом, вам могут быть интересны следующие материалы:

История контейнеризации
Краткая история контейнеризации и разбор конкретных технологий: chroot, jail, namespaces и cgroups.

Введение в Docker
Разбираемся в том, что такое Docker, из каких компонентов состоит и какие технологии контейнеризации использует.
Поделиться в соцсетях:
Средняя оценка: 5,0, всего оценок: 2 Спасибо за Вашу оценку! К сожалению, проголосовать не получилось. Попробуйте позже
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
К докер контейнерам можно подключать внешние папки. Рассматриваем основные способы.
Время чтения: больше 15 мин
Открыть/закрыть навигацию по статье
- Связанные папки (bind mounts)
- Как пользоваться
- Как пользоваться
- Использование драйверов
- Резервные копии
- Как пользоваться
- Игорь Коровченко советует
- Опишите жизненный цикл контейнера Docker
Обновлено 17 мая 2022
В этой статье мы поговорим про управление данными приложений в Docker. Узнать, что такое Docker, вы сможете из статьи «Что такое Docker». Также вы можете почитать о мультиконтейнерных приложениях и Docker Compose и о том, как устроен Dockerfile.
Итак, по умолчанию все данные приложения хранятся в контейнере Docker и после остановки контейнера теряются. Но это не единственный способ работать с данными. Можно использовать оперативную память и файловую систему компьютера, на котором установлен Docker Engine. Существует несколько типов хранилищ данных:
- связанные папки, примонтированные к контейнеру как внешние диски (bind mounts);
- тома (volumes);
- часть оперативной памяти для работы с данными (tmpfs mounts или npipe mounts).
Вне зависимости от того, какой тип хранилища вы выберете, данные для приложения будут храниться в заданной вами папке внутри контейнера. Технология работает бесшовно, но имеет свои накладные расходы для каждого конкретного типа.
Наглядная схема типов управления данными в Docker:

Рассмотрим каждый тип по отдельности.
Связанные папки (bind mounts)
Скопировать ссылку «Связанные папки (bind mounts)» Скопировано
Связанные папки появились в Docker с самых первых релизов. Это удобный инструмент, но у него есть ограничения. Этот тип управления данными позволяет связать папку на компьютере пользователя (то есть хосте, на котором установлен Docker Engine) и папку в контейнере. Работать в контейнере и на хосте с такой папкой можно одновременно, все изменения будут отображаться и там, и там. Механизм bind mounts подразумевает, что данные могут быть изменены в любое время как из подключённого контейнера, так и непосредственно на хосте.
При создании связанной папки указывается полный путь к ней на хосте и путь внутри контейнера. Если папка не существует на хосте, Docker может создать её сам.
Связанные папки используются:
Когда конфигурационные файлы на хосте и в контейнере одни и те же. Именно этот тип использует сам Docker для автоматического монтирования конфигурации DNS хоста.
Когда работаем с исходным кодом и артефактами сборок. Можно использовать системы сборки для исходного кода внутри контейнера. Вы меняете код, бандлер, который находится внутри контейнера, это видит, и код попадает в новую сборку. Другой вариант использования — работа с уже собранными бандлами, например, для тестирования или отладки приложений.
Когда необходимо обеспечить создание одной и той же файловой структуры на различных компьютерах. Если папки на компьютере пользователя не существует, она будет создана при сборке образа и запуске контейнера.
Как пользоваться
Скопировать ссылку «Как пользоваться» Скопировано
Чтобы связать папку на хосте с папкой внутри контейнера, можно воспользоваться флагами -v или — — mount . $ ( pwd ) в командах ниже означает, что примонтируется текущая папка на хосте.
Пример с флагом -v :
docker run -d \ -it \ --name devtest \ -v "$(pwd)"/target:/app \ node:ltsdocker run -d \ -it \ --name devtest \ -v "$(pwd)"/target:/app \ node:ltsМожно задать следующие опции: rprivate , private , rshared , shared , rslave , slave , ro , z и Z .
Первые шесть параметров позволяют управлять тем, как будут влиять изменения в одной точке монтирования тома на другие точки монтирования. По умолчанию используется rprivate , что означает — никак.
Последние три параметра могут быть указаны только для флага -v . Значение ro определяет режим только для чтения. Папка на хосте не может быть изменена внутри контейнера. Значение z обозначает, что папка на хосте может быть использована несколькими контейнерами. Значение Z обозначает, что папка используется только одним контейнером. Не указывайте значение Z для системных папок, например, /usr или /home. Это приведёт к тому, что работа операционной системы на хосте будет парализована. Будьте аккуратны!
Пример с флагом — — mount :
docker run -d \ -it \ --name devtest \ --mount type=bind,source="$(pwd)"/target,target=/app \ node:ltsdocker run -d \ -it \ --name devtest \ --mount type=bind,source="$(pwd)"/target,target=/app \ node:ltsКлюч bind-propagation
Для флага — — mount есть ключ bind — propagation , который работает только на Linux (операционные системы контейнера и хоста должны поддерживать этот режим работы).
Представьте, есть две точки монтирования /mnt1 и /mnt2 , к которым привязана одна и та же папка на хосте. Значения ключа bind — propagation определяют, что произойдёт, если в связанной папке появятся подпапки. Что произойдёт с /mnt2 / sub при монтировании /mnt1 / sub ? Возможны следующие варианты:
— shared указывает на то, что изменения для точки монтирования /mnt1 / sub будут в точности отражаться в /mnt2 / sub и наоборот;
— slave указывает на то же, что shared , но только в одном направлении (изменения в первой точке монтирования будут распространяться на вторую, но не наоборот);
— private указывает, что изменения в первой точке монтирования не будут отображаться во второй, и наоборот;
— rshared — то же, что shared , распространяет подобное поведение на все реплики точек монтирования;
— rslave — то же, что slave , распространяет подобное поведение на все реплики точек монтирования;
— rprivate (значение по умолчанию) — то же, что private , распространяет подобное поведение на все реплики точек монтирования.docker run -d \ -it \ --name devtest \ --mount type=bind,source="$(pwd)"/app/src,target=/app \ --mount type=bind,source="$(pwd)"/app/src,target=/app2,readonly,bind-propagation=rslave \ node:ltsdocker run -d \ -it \ --name devtest \ --mount type=bind,source="$(pwd)"/app/src,target=/app \ --mount type=bind,source="$(pwd)"/app/src,target=/app2,readonly,bind-propagation=rslave \ node:ltsПапка /app/src на хосте дважды монтируется к разным папкам в контейнере. Вторая точка монтирования имеет дополнительные настройки:
— приложение app2 может только читать данные из папки на хосте;
— изменения в первой точке монтирования сразу происходят и во второй, но не наоборот.Ключ bind — propagation служит для управления хранилищами на продвинутом уровне и, как правило, нужен в специальных задачах. Об этом механизме вы можете почитать подробнее в официальной документации Linux.
Флаг — — mount не поддерживает опции для управления метками selinux ( z и Z ).
Проверьте корректность работы хранилища с помощью команды:
docker inspect devtestdocker inspect devtestВ соответствующей секции Mounts вы сможете найти исчерпывающую информацию. Например, если вы находились в папке /tmp/source/target при запуске контейнера, то в этой секции будет указана примерно следующая информация:
"Mounts": [ "Type": "bind", "Source": "/tmp/source/target", "Destination": "/app", "Mode": "", "RW": true, "Propagation": "rprivate" >],"Mounts": [ "Type": "bind", "Source": "/tmp/source/target", "Destination": "/app", "Mode": "", "RW": true, "Propagation": "rprivate" > ],Для разрыва связи между папками на хосте и в контейнере выполните команды остановки и удаления контейнера:
docker container stop devtestdocker container rm devtestdocker container stop devtest docker container rm devtest- Связанными папками нельзя управлять из Docker CLI.
- Абсолютные пути на разных компьютерах могут быть разными.
- Если в контейнере в примонтированной папке есть содержимое, то оно «перекроет» содержимое связанной папки на все время работы контейнера.
- Использовать связанные папки для работы с конфигурационными файлами небезопасно.
- Файловая система и структура папок могут сильно отличаться на разных компьютерах.
- Правила описания путей к файлам могут отличаться при переходе от одной платформы к другой.
- Вы можете столкнуться с ситуацией, когда приложение в контейнере получит доступ к системным папкам или удалит критически важные файлы.
Тома (volumes)
Скопировать ссылку «Тома (volumes)» Скопировано
Тома — это лучший тип управления данных в Docker. Только объекты или службы Docker должны иметь права на изменение данных, расположенных в томах. На хосте данные хранятся в специальных папках, но без доступа администратора к ним не подобраться. В идеологии Docker тома — что-то вроде образа флэш-накопителя или CD/DVD.
Тома можно размещать не только на хосте. Можно, например, пользоваться облачными платформами для совместной работы с данными или для тестирования приложений. А ещё тома будут работать как с Linux-контейнерами, так и с Windows-контейнерами, поскольку файловая система томов одна и та же.
Когда том примонтирован к контейнеру, операционная система хоста не имеет к нему доступа. Docker управляет томами отдельно, позволяя подключаться одному или нескольким контейнерам одновременно. Плюсом является и то, что том существует самостоятельно и не зависит от жизненного цикла контейнеров.
Тома могут быть созданы при сборке контейнера (с помощью Dockerfile или Docker Compose) или вручную с помощью Docker Engine. Тома могут иметь имя, назначенное пользователем (именованные тома, named volumes), а могут быть анонимными с именем, которое Docker устанавливает автоматически (анонимные тома, anonymous volumes).
Концепция драйвера позволяет преобразовывать данные в томах или влиять на потоки данных между томами и контейнерами. Например, это можно использовать для шифрования. Но чаще с помощью драйверов к контейнеру подключают тома, которые расположены не локально на хосте, а в облаке или на сервере. Это позволяет, не меняя логику работы приложения внутри контейнера, обрабатывать данные, которых на хосте нет.
Итак, возможности томов:
— миграция данных и создание резервных копий;
— управление с помощью Docker CLI или Docker API;
— тома работают и с Linux-, и с Windows-контейнерами;
— данные легко и безопасно можно использовать в нескольких контейнерах;
— существует механизм драйверов, который позволяет хранить данные не только на хосте, но и на сервере или в облаке, шифровать данные в томе или добавлять дополнительную функциональность;
— новые тома могут создаваться с уже загруженными с помощью контейнера данными;
— если на хосте установлены Mac или Windows, тома будут быстрее работать с Docker Desktop, чем связанные папки;
— тома не увеличивают размер контейнера;
— тома находятся вне жизненного цикла контейнера.Когда нам нужно получить доступ к данным из разных контейнеров. Том создаётся в первый раз либо вручную, либо при сборке контейнера. Уничтожается том всегда только с помощью Docker вручную. После остановки контейнера том будет продолжать работать, пока не будет удалён пользователем.
Когда вы не уверены, что путь до папки будет одним и тем же на разных компьютерах. Тома позволяют повысить уровень абстракции.
Когда вы хотите хранить данные не только у себя на локальном компьютере, но и на сервере или в облаке.
Когда нужно создать резервную копию или перенести тома с одного компьютера на другой. Тома хранятся в определённой папке на компьютере. Вы можете просто скопировать её, заархивировать и перенести на другой хост. Примерно так же создаётся и резервная копия.
Если ваше приложение требует высокой скорости обмена данными на Mac и Windows. Тома сохраняются на виртуальной машине Linux VM, на которой работают и контейнеры, поэтому скорость чтения и записи высокая. Нет лишних накладных расходов на доступ к файловой системе хоста.
Когда важно, чтобы файловая система имела нативное поведение. Например, база данных должна контролировать кэширование на диске для гарантии выполнения транзакций. Файловые системы на Mac и Windows работают не так, как на Linux. Это может привести к ошибкам работы некоторых приложений.
Как пользоваться
Скопировать ссылку «Как пользоваться» Скопировано
Создать том можно с помощью флагов -v или — — mount при запуске контейнера. Для флага -v можно указать параметр ro , который будет означать использование режима только для чтения. Для флага — — mount есть ключ volume — opt , который устанавливает набор опций, разделённых запятыми. Не забывайте, что значения для этого ключа должны быть экранированы кавычками. Работа с томами такова, что изменения в одной точке монтирования в контейнере не будут отображаться в другой точке монтирования (параметр bind — propagation всегда выставлен в значение rprivate ).
Подключить том с именем my — vol можно следующим образом.
С флагом — — mount :
docker run -d \ --name devtest \ --mount source=my-vol,target=/app \ node:ltsdocker run -d \ --name devtest \ --mount source=my-vol,target=/app \ node:ltsdocker run -d \ --name devtest \ -v my-vol:/app \ node:ltsdocker run -d \ --name devtest \ -v my-vol:/app \ node:ltsПроверьте корректность результата выполнения команды:
docker inspect devtestdocker inspect devtestЧтобы удалить том, необходимо отключить связанный с ним контейнер и удалить сам контейнер:
docker container stop devtestdocker container rm devtestdocker volume rm my-voldocker container stop devtest docker container rm devtest docker volume rm my-volУправлять томами можно через Docker API с помощью Docker CLI и Docker Compose.
Чтобы создать новый том с помощью Docker CLI, используйте команду:
docker volume create my-voldocker volume create my-volПолучите список томов на хосте:
docker volume lsdocker volume lsПосмотрите информацию о томе:
docker volume inspect my-voldocker volume inspect my-volУдалите том командой:
docker volume rm my-voldocker volume rm my-volЕсли том был анонимным, то можно удалить его сразу после завершения работы контейнера. Для этого при запуске контейнера вы можете прописать флаг — — rm . Вместе с удалением контейнера в этом случае удалится и том:
docker run --rm -v /foo -v awesome:/bar container appdocker run --rm -v /foo -v awesome:/bar container appПосле завершения работы и последующего удаления контейнера анонимный том удалится, а именованный awesome продолжит работать.
Чтобы удалить все неиспользуемые тома, используйте команду:
docker volume prunedocker volume pruneДля того, чтобы подключить том с помощью Dockerfile, необходимо использовать инструкцию VOLUME :
FROM node:ltsRUN useradd userRUN mkdir /data && touch /data/xRUN chown -R user:user /dataVOLUME /dataFROM node:lts RUN useradd user RUN mkdir /data && touch /data/x RUN chown -R user:user /data VOLUME /dataИнтересно, что вы не сможете внести какие-либо изменения в данные на этапе сборки образа. Следующий Dockerfile правильно работать не будет:
FROM node:ltsRUN useradd userVOLUME /dataRUN touch /data/xRUN chown -R user:user /dataFROM node:lts RUN useradd user VOLUME /data RUN touch /data/x RUN chown -R user:user /dataТом будет подключён только после создания образа на этапе запуска контейнера. Возможно, придётся использовать инструкции CMD или ENTRYPOINT . Подробнее описано в статье «Как устроен Dockerfile».
Запустить том для отдельного контейнера с Docker Compose можно с помощью следующей конфигурации:
services: frontend: image: node:lts volumes: - myapp:/home/node/appvolumes: myapp:services: frontend: image: node:lts volumes: - myapp:/home/node/app volumes: myapp:Команда docker — compose up поднимет не только сам контейнер frontend , но и создаст том myapp . Если он уже был создан, Docker Compose подключит его к контейнеру, но надо указать это явно с помощью элемента external так:
services: frontend: image: node:lts volumes: - myapp:/home/node/appvolumes: myapp: external: trueservices: frontend: image: node:lts volumes: - myapp:/home/node/app volumes: myapp: external: trueПодробнее о формате конфигурации Docker Compose можно прочитать в статье о Docker Compose.
Использование драйверов
Скопировать ссылку «Использование драйверов» Скопировано
Когда приходит время масштабировать приложение, несколько сервисов должны работать с одним хранилищем данных. Для этого существует масса решений, и у Docker есть своё — драйверы для томов. Это лишь один пример использования драйверов. Можно организовать, например, пересылку данных между контейнерами с поддержкой шифрования или автоматическое шифрование и дешифровку всех данных в томе. Можно реализовать любой механизм обработки данных. Драйверы повышают уровень абстракции, позволяя отделить логику работы приложения от системы хранения данных.
Например, есть два компьютера — хост, на котором установлен Docker и запускаются контейнеры, и файловый сервер, который поставляет данные для них. Контейнеры ничего не знают про эту архитектуру: все запускалось изначально на локальном хосте. Драйвер vieux / sshfs позволяет использовать SSH-соединение для связи с файловым сервером, при этом данные будут представлены в виде тома Docker.
Для начала необходимо установить соответствующий плагин для Docker Engine:
docker plugin install --grant-all-permissions vieux/sshfsdocker plugin install --grant-all-permissions vieux/sshfsЗатем нужно создать том и прописать учётные данные:
docker volume create --driver vieux/sshfs \ -o sshcmd=test@node2:/home/test \ -o password=testpassword \ sshvolumedocker volume create --driver vieux/sshfs \ -o sshcmd=test@node2:/home/test \ -o password=testpassword \ sshvolumeЕсли для связи по SSH между клиентом и сервером уже работают ключи доступа, то пароль можно опустить. Флаг -o указывает на опции, которые могут быть переданы драйверу. Набор доступных опций у каждого драйвера свой.
Можно создать том и другим способом, при запуске контейнера:
docker run -d \ --name sshfs-container \ --volume-driver vieux/sshfs \ --mount src=sshvolume,target=/app,volume-opt=sshcmd=test@node2:/home/test,volume-opt=password=testpassword \ nginx:latestdocker run -d \ --name sshfs-container \ --volume-driver vieux/sshfs \ --mount src=sshvolume,target=/app,volume-opt=sshcmd=test@node2:/home/test,volume-opt=password=testpassword \ nginx:latestЕсли драйвер требует передачи опций, приходится использовать флаг — — mount .
Резервные копии
Скопировать ссылку «Резервные копии» Скопировано
Для того чтобы создать резервную копию тома, можно использовать механизм контейнеров Docker. Например, вы уже создали контейнер с именем dbstore на базе операционной системы Ubuntu и работаете с данными в томе dbdata . Для этого вы уже выполнили команду и получили доступ к терминалу контейнера:
docker run -v /dbdata --name dbstore node:lts /bin/bashdocker run -v /dbdata --name dbstore node:lts /bin/bashКак создать резервную копию данных в томе? Нужно:
— запустить новый контейнер и примонтировать том, который используется в контейнере dbstore ;
— примонтировать папку на хосте, чтобы потом в неё положить резервную копию;
— зайти внутри контейнера в том, заархивировать данные и положить их в связанную папку.docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdatadocker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdataПосле завершения архивации контейнер выключится и удалится, а резервная копия останется у вас в папке, из которой вы запускали команду.
Допустим, у вас возникла необходимость развернуть данные из сохранённой резервной копии внутри контейнера dbstore2 . Нужно запустить его:
docker run -v /dbdata --name dbstore2 node:lts /bin/bashdocker run -v /dbdata --name dbstore2 node:lts /bin/bashЗатем разархивировать данные в том:
docker run --rm --volumes-from dbstore2 -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1"docker run --rm --volumes-from dbstore2 -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1"Хранение в оперативной памяти
Скопировать ссылку «Хранение в оперативной памяти» Скопировано
Хранение в оперативной памяти бывает двух типов: tmpfs mounts и npipe mounts.
Механизм tmpfs mount в операционной системе Linux позволяет выделить часть оперативной памяти хоста для хранения данных. Данные не сохраняются в файловой системе, и получается быстрое хранилище. Примонтированная папка tmpfs работает, пока запущен контейнер, поэтому не стоит использовать этот способ для хранения настроек и результатов работы приложения.
Для пользователей операционной системы Windows существует ещё один тип управления данными — npipe mount. Этот тип позволяет получить доступ к хосту Docker из контейнера и в основном используется для управления данными с Docker Engine API.
Используем оперативную память:
Если вы не хотите оставлять данные после завершения работы приложения.
Как пользоваться
Скопировать ссылку «Как пользоваться» Скопировано
Этот раздел посвящён использованию только на Linux.
С помощью томов и связанных папок вы можете делиться файлами между хостом и контейнером. После остановки контейнера данные сохраняются. Но если на хосте используется операционная система Linux, то существует и третий тип работы с данными — tmpfs. Это временное файловое хранилище, которое располагается в оперативной памяти, присутствует во многих Unix-подобных системах. Когда вы создаёте контейнер, Docker может создать отдельный слой в оперативной памяти снаружи контейнера для хранения и обработки данных.
При использовании этого типа работы с данными в Docker есть два ограничения:
— операционной системой хоста может быть только Linux;
— данные в tmpfs доступны лишь из одного контейнера.tmpfs хорошо работает в случае хранения чувствительной информации: ключей шифрования, паролей, сертификатов доступа и тому подобного.
Чтобы запустить контейнер с tmpfs, используют команду:
docker run -d \ -it \ --name tmptest \ --mount type=tmpfs,destination=/app \ node:ltsdocker run -d \ -it \ --name tmptest \ --mount type=tmpfs,destination=/app \ node:ltsС помощью ключа tmpfs — size можно определить максимальный размер хранилища в байтах. По умолчанию он не ограничен. Ключ tmpfs — mode служит для определения уровня доступа в восьмеричном формате. Например, значение по умолчанию 1777 обозначает, что любой пользователь или программа в контейнере имеют неограниченный доступ к данным, которые будут доступны и вне контейнера. Этот параметр работает также, как и для tmpfs в Unix-подобных операционных системах.
Также есть альтернативная более короткая команда для управления tmpfs mounts:
docker run -d \ -it \ --name tmptest \ --tmpfs /app \ node:ltsdocker run -d \ -it \ --name tmptest \ --tmpfs /app \ node:ltsПроверьте состояние контейнера, чтобы убедиться, что файловое хранилище создано корректно:
docker container inspect tmptestdocker container inspect tmptestВ соответствующей секции будет доступна информация о примонтированной папке:
"Tmpfs": "/app": "">,"Tmpfs": "/app": "" >,Для удаления слоя с данными выполните команды остановки и удаления контейнера:
docker container stop tmptestdocker container rm tmptestdocker container stop tmptest docker container rm tmptestНа практике
Скопировать ссылку «На практике» Скопировано
Игорь Коровченко советует
Скопировать ссылку «Игорь Коровченко советует» Скопировано
✨ Вы можете получить данные из определённой папки контейнера, если примонтируете к ней пустую папку или пустой том на хосте. После монтирования данные автоматически окажутся доступны с хоста и останутся там после работы контейнера. Это удобный способ сделать бэкап или получить результаты работы приложения.
Если папка или том окажутся не пустыми, то при монтировании к контейнеру содержимое будет на время скрыто. Контейнер будет воспринимать эту папку как пустую, данные будут в неё сохраняться и будут доступны с хоста во время работы контейнера. После окончания работы контейнера или после того, как том или папка будут отмонтированы, данные из контейнера будут потеряны, поскольку снова будут доступны те файлы и подпапки, которые были скрыты при монтировании. Это тот же механизм, который Linux будет использовать, когда вы, например, примонтируете USB-накопитель к уже заполненной чем-то папке.
На собеседовании
Скопировать ссылку «На собеседовании» Скопировано
Docker — Полный курс Docker Для Начинающих [3 ЧАСА]
docker info — Информация обо всём в установленном Docker
docker history — История образа
docker tag — Дать тег образу локально или в registry
docker login — Залогиниться в registry
docker search — Поиск образа в registry
docker pull — Загрузить образ из Registry себе на хост
docker push — Отправить локальный образ в registryУправления контейнерами
docker ps -а — Посмотреть все контейнеры
docker start container-name — Запустить контейнер
docker run container-name — создает новый контейнер и сразу включает его. (подробнее отдельно)
docker kill/stop container-name — Убить (SIGKILL) /Остановить (SIGTERM) контейнер
docker logs —tail 100 container-name — Вывести логи контейнера, последние 100 строк
docker inspect container-name — Вся инфа о контейнере + IP
docker rm container-name — Удалить контейнер (поле каждой сборки Dockerfile)
docker rm -f $(docker ps -aq) — Удалить все запущенные и остановленные контейнеры
docker events container-name
docker port container-name — Показать публичный порт контейнера
docker top container-name — Отобразить процессы в контейнере
docker stats container-name — Статистика использования ресурсов в контейнере
docker diff container-name — Изменения в ФС контейнера
docker build -t my_app . — Билд контейнера в текущей папке, Скачивает все слои для запуска образа
docker images / docker image ls — Показать все образы в системе
docker image rm / docker rmi image — Удалить image
docker commit lepkov/debian11slim:version3- Создает образ из контейнера
docker insert URL — вставляет файл из URL в контейнер
docker save -o backup.tar — Сохранить образ в backup.tar в STDOUT с тегами, версиями, слоями
docker load — Загрузить образ в .tar в STDIN с тегами, версиями, слоями
docker import — Создать образ из .tar
docker image history —no-trunc — Посмотреть историю слоёв образа
docker system prune -f — Удалит все, кроме используемого (лучше не использовать на проде, ещё кстати из-за старого кеша может собираться cтарая версия контейнера)
Подробнее «docker run»
Синтаксис следующий: docker run [опции] название образа [команды][аргументы].
docker run -d -p 80:80 -p 22:22 debian:11.1-slim sleep infinity (—rm удалит после закрытия контейнера, —restart unless-stopped добавит автозапуск контейнера) — Запуск контейнера интерактивно или как демона/detached (-d), Порты: слева хостовая система, справа в контейнере, пробрасывается сразу 2 порта 80 и 22, используется легкий образ Debian 11 и команда бесконечный сон
docker update —restart unless-stopped redis — добавит к контейнеру правило перезапускаться при закрытии, за исключением команды стоп, автозапуск по-сути
docker exec -it container-name /bin/bash (ash для alpine) — Интерактивно подключиться к контейнеру для управления, exit чтобы выйти
docker attach container-name — Подключиться к контейнеру чтоб мониторить ошибки логи в реалтайме
Управления разделами (Volumes)
docker cp file :/ — Скопировать в корень контейнера file
docker cp :/file . — Скопировать file из корня контейнера в текущую директорию командной строки
docker volume create todo-db — Создать volume для постоянного хранения файлов
docker run -dp 3000:3000 —name=dev -v todo-db:/etc/todos container-name — Добавить named volumу todo-db к контейнеру (они ok когда мы не заморачиваемся где конкретно хранить данные)
docker run -dp 3000:3000 —name=dev —mount source=todo-db,target=/etc/todos container-name — тоже самое что команда сверху
docker volume ls — Отобразить список всех volume’ов
docker volume inspect — Инспекция volume’ов
docker volume rm — Удалить volume
Управления сетью (Network)
docker network create todo-app — Создать сеть
docker network rm — Удалить сеть
docker network ls — Отразить все сеть
docker network inspect — Вся информация о сети
docker network connect — Соединиться с сетью
docker network disconnect — Отсоединиться от сетиПример 1: Hello world
Настало время запустить ваш первый контейнер:
docker run ubuntu /bin/echo 'Hello world'Unable to find image 'ubuntu:latest' locally latest: Pulling from library/ubuntu d54efb8db41d: Pull complete f8b845f45a87: Pull complete e8db7bf7c39f: Pull complete 9654c40e9079: Pull complete 6d9ef359eaaa: Pull complete Digest: sha256:dd7808d8792c9841d0b460122f1acf0a2dd1f56404f8d1e56298048885e45535 Status: Downloaded newer image for ubuntu:latest Hello worlddocker run — команда, запускающая контейнер.
ubuntu — образ, который вы запускаете, например, образ ОС Ubuntu. Когда вы определяете его, Docker начинает поиск на Docker-хосте. Если образ не существует локально, тогда он будет вытянут из общественного реестра — Docker Hub.
/bin/echo ‘Hello world’ — команда, которая будет запущена внутри нового контейнера. Данный контейнер просто выведет «Hello world» и остановит выполнение.Давайте попробуем создать интерактивную оболочку внутри Docker-контейнера:
docker run -i -t –rm ubuntu /bin/bash— t — флаг, добавляющий псевдотерминал внутри нового контейнера.
-i — флаг, который позволяет установить интерактивное соединение, взяв стандартный ввод (STDIN) контейнера.
-rm — флаг, автоматически удаляющий контейнер после завершения процесса. По умолчанию контейнеры не удаляются. Этот контейнер существует, пока установлена текущая сессия оболочки, и уничтожается, когда мы покидаем сессию (например, SSH-сессию с удаленным сервером).Если вы хотите оставить контейнер работающим после завершения сессии, превратите его в демон-процесс:
docker run –name daemon ubuntu /bin/sh —c «while true; do echo hello world; sleep 1; done»
—name daemon — устанавливает имя демона для нового контейнера. Если вы не определите имя, то Docker сгенерирует и присвоит его автоматически.
-d — флаг запускает контейнер в фоновом режиме (демонизирует его).Давайте взглянем, какие контейнеры у нас есть на текущий момент:
docker ps -aВывод консоли:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1fc8cee64ec2 ubuntu "/bin/sh -c 'while. " 32 seconds ago Up 30 seconds daemon c006f1a02edf ubuntu "/bin/echo 'Hello . " About a minute ago Exited (0) About a minute ago gifted_nobeldocker ps — команда для вывода списка контейнеров.
-a — флаг, который показывает все контейнеры (без этого флага ps выведет только работающие контейнеры).Команда ps показала, что у нас всего два контейнера:
gifted_nobel (имя для этого контейнера сгенерировано автоматически, оно будет другим на вашем компьютере) — это первый контейнер, который мы создали, выводит один раз «Hello world».
daemon — это третий контейнер, который мы создали, работает как фоновый процесс.Замечание : здесь нет второго контейнера (с интерактивной оболочкой), потому что мы установили флаг —rm . Как следствие, этот контейнер автоматически удалился сразу после выполнения.
Давайте проверим логи и посмотрим, что фоновый контейнер делает прямо сейчас:
docker logs -f daemonВывод консоли:
. . . hello world hello world hello worlddocker logs — объединяет логи контейнера.
-f — флаг для слежения за выводом логов (работает так же, как tail -f ).Теперь остановим фоновый контейнер:
docker stop daemonУдостоверимся, что контейнер остановился:
docker ps -aВывод консоли:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1fc8cee64ec2 ubuntu "/bin/sh -c 'while. " 5 minutes ago Exited (137) 5 seconds ago daemon c006f1a02edf ubuntu "/bin/echo 'Hello . " 6 minutes ago Exited (0) 6 minutes ago gifted_nobelКонтейнер остановился. Мы можем запустить его заново:
docker start daemonУдостоверимся, что он работает:
docker ps -aВывод консоли:
ONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1fc8cee64ec2 ubuntu "/bin/sh -c 'while. " 5 minutes ago Up 3 seconds daemon c006f1a02edf ubuntu "/bin/echo 'Hello . " 6 minutes ago Exited (0) 7 minutes ago gifted_nobelТеперь остановим его опять и удалим все контейнеры вручную:
docker stop daemon docker rm your first container name> docker rm daemonЧтобы удалить все контейнеры, мы можем использовать следующую команду:
docker rm -f $(docker ps -aq)docker rm — команда для удаления контейнера.
-f — флаг для rm , который останавливает контейнер, если он работает (принудительное удаление).
-q — флаг для ps , который выводит только ID контейнеров.Пример 2: Nginx
Настало время создать и запустить более полезный контейнер типа Nginx.
Сменим директорию на examples/nginx :
docker run -d --name test-nginx -p 80:80 -v $(pwd):/usr/share/nginx/html:ro nginx:latestUnable to find image 'nginx:latest' locally latest: Pulling from library/nginx 693502eb7dfb: Pull complete 6decb850d2bc: Pull complete c3e19f087ed6: Pull complete Digest: sha256:52a189e49c0c797cfc5cbfe578c68c225d160fb13a42954144b29af3fe4fe335 Status: Downloaded newer image for nginx:latest 436a602273b0ca687c61cc843ab28163c720a1810b09005a36ea06f005b0c971-p — преобразование портов HOST PORT:CONTAINER PORT .
-v — монтирование тома HOST DIRECTORY:CONTAINER DIRECTORY .Важно : команда run принимает только абсолютные пути. В нашем примере мы использовали $(pwd) , чтобы установить абсолютный путь текущей директории.
Теперь вы можете открыть localhost в вашем браузере.
Или можно изменить /example/nginx/index.html (который смонтирован как том в /usr/share/nginx/html внутри контейнера) и обновить страницу.
Получим информацию о контейнере test-nginx :
docker inspect test-nginxЭта команда показывает широкую системную информацию об установке Docker. Эта информация включает в себя версию ядра, количество контейнеров и образов, открытые порты, смонтированные тома и так далее.
Пример 3: написание Dockerfile
Чтобы создать Docker-образ, вам необходимо создать Dockerfile. Это просто текстовый файл с инструкциями и аргументами. Вот описание инструкций, которые мы будем использовать в нашем следующем примере:
FROM — устанавливает базовый образ.
RUN — выполняет команду в контейнере.
ENV — устанавливает переменную окружения.
WORKDIR — устанавливает рабочую директорию.
VOLUME — создает точку монтирования для тома.
CMD — устанавливает исполняемый файл для контейнера.Вы можете просмотреть справку по Dockerfile , чтобы узнать больше подробностей.
Теперь создадим образ, который будет получать содержимое сайта с помощью curl и записывать его в текстовый файл. Нам надо передать URL сайта через переменную окружения SITE_URL . Результирующий файл будет помещен в директорию, смонтированную в качестве тома:
FROM ubuntu:latest RUN apt-get update RUN apt-get install --no-install-recommends --no-install-suggests -y curl ENV SITE_URL https://google.com/ WORKDIR /data VOLUME /data CMD sh -c "curl -L $SITE_URL > /data/results"Dockerfile готов. Теперь настало время создать сам образ.
Перейдем в examples/curl и выполним следующую команду для создания образа:
docker build . -t test-curlВ ывод консоли:
Sending build context to Docker daemon 3.584 kB Step 1/7 : FROM ubuntu:latest ---> 0ef2e08ed3fa Step 2/7 : RUN apt-get update ---> Running in 4aa839bb46ec Get:1 http://archive.ubuntu.com/ubuntu xenial InRelease [247 kB] Get:2 http://archive.ubuntu.com/ubuntu xenial-updates InRelease [102 kB] ... Fetched 24.9 MB in 4s (5208 kB/s) Reading package lists... ---> 35ac5017c794 Removing intermediate container 4aa839bb46ec Step 3/7 : RUN apt-get install --no-install-recommends --no-install-suggests -y curl ---> Running in 3ca9384ecf8d Reading package lists... Building dependency tree... Reading state information... The following additional packages will be installed... ---> f3c6d26b95e6 Removing intermediate container 3ca9384ecf8d Step 4/7 : ENV SITE_URL https://google.com/ ---> Running in 21b0022b260f ---> 9a733ee39a46 Removing intermediate container 21b0022b260f Step 5/7 : WORKDIR /data ---> c024301ddfb8 Removing intermediate container 3bc973e5584c Step 6/7 : VOLUME /data ---> Running in a9594a8958fe ---> 6802707a7114 Removing intermediate container a9594a8958fe Step 7/7 : CMD sh -c "curl -L $SITE_URL > /data/results" ---> Running in 37503bc4e386 ---> 5ebb2a65d771 Removing intermediate container 37503bc4e386 Successfully built 5ebb2a65d771docker bulid — создает новый локальный образ.
-t — устанавливает именную метку для образа.Теперь у нас есть новый образ, и мы можем посмотреть список существующих:
docker imagesВывод консоли:
REPOSITORY TAG IMAGE ID CREATED SIZE test-curl latest 5ebb2a65d771 37 minutes ago 180 MB nginx latest 6b914bbcb89e 7 days ago 182 MB ubuntu latest 0ef2e08ed3fa 8 days ago 130 MBМы можем создать и запустить контейнер из образа. Попробуем сделать это со стандартными параметрами:
docker run --rm -v $(pwd)/vol:/data/:rw test-curlЧтобы увидеть результаты, сохраненные в файле, выполним команду:
cat ./vol/resultsПопробуем с facebook.com:
docker run --rm -e SITE_URL=https://facebook.com/ -v $(pwd)/vol:/data/:rw test-curlИ снова посмотрим результаты:
cat ./vol/resultsПример 4: Разворачиваем PROXY / ZABBIX / AGENT в docker контейнере
Docker Compose — это инструмент, который позволяет определить и запустить несколько связанных контейнеров Docker как одно приложение. Он основан на файле конфигурации в формате YAML, который описывает различные сервисы, сети и объемы данных, необходимые для запуска и настройки контейнеров.
С помощью Docker Compose вы можете определить множество контейнеров, которые взаимодействуют друг с другом, и описать их конфигурацию в файле `docker-compose.yml`. В этом файле вы указываете образы Docker, сети, порты, переменные окружения, объемы и другие параметры для каждого сервиса, который хотите запустить.Docker Compose позволяет вам определить зависимости между сервисами, настроить сетевое взаимодействие между контейнерами и упростить процесс развертывания и управления многоконтейнерными приложениями. Он также предоставляет команды для создания, запуска и остановки всех контейнеров, описанных в файле `docker-compose.yml`.
При использовании Docker Compose вы можете создавать и развертывать комплексные приложения, состоящие из нескольких сервисов, таких как веб-серверы, базы данных, кэш-серверы и другие. Это упрощает разработку, тестирование и развертывание приложений в среде Docker.
Данный пример представляет файл конфигурации Docker Compose (docker-compose-zabbix-proxy.yml) для развертывания двух сервисов: zabbix-proxy и zabbix-agent :
Создадим фаил docker-compose.yml: