Перейти к содержимому

Как посмотреть содержимое docker контейнера

  • автор:

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

Консультация по продукту 1cloud

Например, мы запускаем контейнер с 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

Разбираемся в том, что такое Docker, из каких компонентов состоит и какие технологии контейнеризации использует.

Поделиться в соцсетях:

Средняя оценка: 5,0, всего оценок: 2 Спасибо за Вашу оценку! К сожалению, проголосовать не получилось. Попробуйте позже

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

К докер контейнерам можно подключать внешние папки. Рассматриваем основные способы.

Время чтения: больше 15 мин

Открыть/закрыть навигацию по статье

  1. Связанные папки (bind mounts)
    1. Как пользоваться
    1. Как пользоваться
    2. Использование драйверов
    3. Резервные копии
    1. Как пользоваться
    1. Игорь Коровченко советует
    1. Опишите жизненный цикл контейнера Docker

    Обновлено 17 мая 2022

    В этой статье мы поговорим про управление данными приложений в Docker. Узнать, что такое Docker, вы сможете из статьи «Что такое Docker». Также вы можете почитать о мультиконтейнерных приложениях и Docker Compose и о том, как устроен Dockerfile.

    Итак, по умолчанию все данные приложения хранятся в контейнере Docker и после остановки контейнера теряются. Но это не единственный способ работать с данными. Можно использовать оперативную память и файловую систему компьютера, на котором установлен Docker Engine. Существует несколько типов хранилищ данных:

    • связанные папки, примонтированные к контейнеру как внешние диски (bind mounts);
    • тома (volumes);
    • часть оперативной памяти для работы с данными (tmpfs mounts или npipe mounts).

    Вне зависимости от того, какой тип хранилища вы выберете, данные для приложения будут храниться в заданной вами папке внутри контейнера. Технология работает бесшовно, но имеет свои накладные расходы для каждого конкретного типа.

    Наглядная схема типов управления данными в Docker:

    Наглядная схема типов управления данными в 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:lts docker 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:lts docker 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:lts 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:lts     

    Папка /app/src на хосте дважды монтируется к разным папкам в контейнере. Вторая точка монтирования имеет дополнительные настройки:

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

    Ключ bind — propagation служит для управления хранилищами на продвинутом уровне и, как правило, нужен в специальных задачах. Об этом механизме вы можете почитать подробнее в официальной документации Linux.

    Флаг — — mount не поддерживает опции для управления метками selinux ( z и Z ).

    Проверьте корректность работы хранилища с помощью команды:

     docker inspect devtest docker 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 devtest docker container stop devtest docker container rm devtest     
    1. Связанными папками нельзя управлять из Docker CLI.
    2. Абсолютные пути на разных компьютерах могут быть разными.
    3. Если в контейнере в примонтированной папке есть содержимое, то оно «перекроет» содержимое связанной папки на все время работы контейнера.
    4. Использовать связанные папки для работы с конфигурационными файлами небезопасно.
    5. Файловая система и структура папок могут сильно отличаться на разных компьютерах.
    6. Правила описания путей к файлам могут отличаться при переходе от одной платформы к другой.
    7. Вы можете столкнуться с ситуацией, когда приложение в контейнере получит доступ к системным папкам или удалит критически важные файлы.

    Тома (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:lts docker run -d \ --name devtest \ --mount source=my-vol,target=/app \ node:lts     
     docker run -d \ --name devtest \ -v my-vol:/app \ node:lts docker run -d \ --name devtest \ -v my-vol:/app \ node:lts     

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

     docker inspect devtest docker inspect devtest     

    Чтобы удалить том, необходимо отключить связанный с ним контейнер и удалить сам контейнер:

     docker container stop devtestdocker container rm devtestdocker volume rm my-vol docker container stop devtest docker container rm devtest docker volume rm my-vol     

    Управлять томами можно через Docker API с помощью Docker CLI и Docker Compose.

    Чтобы создать новый том с помощью Docker CLI, используйте команду:

     docker volume create my-vol docker volume create my-vol     

    Получите список томов на хосте:

     docker volume ls docker volume ls      

    Посмотрите информацию о томе:

     docker volume inspect my-vol docker volume inspect my-vol     

    Удалите том командой:

     docker volume rm my-vol docker volume rm my-vol     

    Если том был анонимным, то можно удалить его сразу после завершения работы контейнера. Для этого при запуске контейнера вы можете прописать флаг — — rm . Вместе с удалением контейнера в этом случае удалится и том:

     docker run --rm -v /foo -v awesome:/bar container app docker run --rm -v /foo -v awesome:/bar container app     

    После завершения работы и последующего удаления контейнера анонимный том удалится, а именованный awesome продолжит работать.

    Чтобы удалить все неиспользуемые тома, используйте команду:

     docker volume prune docker volume prune     

    Для того, чтобы подключить том с помощью Dockerfile, необходимо использовать инструкцию VOLUME :

     FROM node:ltsRUN useradd userRUN mkdir /data && touch /data/xRUN chown -R user:user /dataVOLUME /data FROM 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 /data FROM 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: true services: 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/sshfs docker plugin install --grant-all-permissions vieux/sshfs     

    Затем нужно создать том и прописать учётные данные:

     docker volume create --driver vieux/sshfs \ -o sshcmd=test@node2:/home/test \ -o password=testpassword \ sshvolume docker 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:latest 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:latest     

    Если драйвер требует передачи опций, приходится использовать флаг — — mount .

    Резервные копии

    Скопировать ссылку «Резервные копии» Скопировано

    Для того чтобы создать резервную копию тома, можно использовать механизм контейнеров Docker. Например, вы уже создали контейнер с именем dbstore на базе операционной системы Ubuntu и работаете с данными в томе dbdata . Для этого вы уже выполнили команду и получили доступ к терминалу контейнера:

     docker run -v /dbdata --name dbstore node:lts /bin/bash docker 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 /dbdata docker 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/bash docker 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:lts docker 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:lts docker run -d \ -it \ --name tmptest \ --tmpfs /app \ node:lts     

    Проверьте состояние контейнера, чтобы убедиться, что файловое хранилище создано корректно:

     docker container inspect tmptest docker container inspect tmptest     

    В соответствующей секции будет доступна информация о примонтированной папке:

     "Tmpfs":  "/app": "">, "Tmpfs":  "/app": "" >,      

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

     docker container stop tmptestdocker container rm tmptest docker 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 world

    docker 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_nobel

    docker ps — команда для вывода списка контейнеров.
    -a — флаг, который показывает все контейнеры (без этого флага ps выведет только работающие контейнеры).

    Команда ps показала, что у нас всего два контейнера:

    gifted_nobel (имя для этого контейнера сгенерировано автоматически, оно будет другим на вашем компьютере) — это первый контейнер, который мы создали, выводит один раз «Hello world».
    daemon — это третий контейнер, который мы создали, работает как фоновый процесс.

    Замечание : здесь нет второго контейнера (с интерактивной оболочкой), потому что мы установили флаг —rm . Как следствие, этот контейнер автоматически удалился сразу после выполнения.

    Давайте проверим логи и посмотрим, что фоновый контейнер делает прямо сейчас:

    docker logs -f daemon

    Вывод консоли:

    . . . hello world hello world hello world

    docker 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:latest
    Unable 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 5ebb2a65d771

    docker 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:

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

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