Docker, часть 2 – работа с контейнерами

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

Команды для работы с контейнерами имеют следующий синтаксис:

docker container КОМАНДА

Рассмотрим некоторые из них более подробно.

Создание и запуск контейнеров

Запомните основные постулаты контейнеров в docker

  1. Контейнер живет, пока живет процесс, вокруг которого рождается контейнер.
  2. Внутри контейнера этот процесс имеет pid=1
  3. Рядом с процессом с pid=1 можно порождать сколько угодно других процессов (в пределах возможностей ОС, естественно), но убив (рестартовав) именно процесс с pid=1, контейнер выходит. (см п.1)
  4. Внутри контейнера вы увидите привычное согласно стандартам FHS расположение директорий. Расположение это идентично исходному дистрибутиву (с которого взят контейнер).
  5. Данные, создаваемые внутри контейнера остаются в контейнере и нигде более не сохраняются (ну, еще к этому слою есть доступ из хостовой ОС). удалив контейнер — потеряете все ваши изменения. Поэтому данные в контейнерах не хранят, а выносят наружу, на хостовую ОС.

Создание контейнера

# 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 (отсоединить). Контейнер будет работать в фоновом режиме, и вы сможете использовать терминал для других команд.

Присвоение имени

Чтобы не приходилось узнавать и запоминать идентификатор контейнера, при создании можно назначать каждому контейнеру уникальное имя, используя опцию командной строки —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

Я думаю если вы внимательно читали статью то сможете сами ответить почему возникает эта ошибка.

Запуск интерактивного сеанса

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

# docker container run -it ubuntu bash

Структура этой команды следующая:

-i задает запуск интерактивного сеанса.
-t выделяет TTY и подключает стандартные потоки ввода и вывода.
ubuntu – образ, используемый для создания контейнера.
bash (или /bin/bash) – запускаемая в контейнере Ubuntu команда.

После запуска контейнера с вышеуказанными ключами, мы как бы проваливаемся внутрь контейнера. Для выхода из запущенного сеанса и возвращения к терминалу вашего узла воспользуйтесь командой exit. Она прерывает все процессы контейнера и останавливает его:

# exit

Если вы интерактивно подключены к контейнеру, и вам требуется выйти из сеанса, не прерывая его, при помощи комбинаций клавиш Ctrl+p и Ctrl+q можно выйти из консоли и вернуться к терминалу вашего хоста.

Если вы хотите запустить контейнер в режиме демона используйте опцию ‘-d’.

#  docker run -td ubuntu bash

Для повторного подключения к запущенному контейнеру требуется знать его идентификатор или имя. Для этого запустите команду docker ps, а затем выполните docker attach, указав идентификатор или имя.

# docker attach КОНТЕЙНЕР

Проверка состояния контейнеров

Если у вас запущено несколько контейнеров Docker, и вы хотите выбрать, с каким именно работать, потребуется вывести их список. Для этого применяется команда ls. Помимо вывода списка контейнеров она выводит также полезную информацию о них. Команда без опций выдает список запущенных контейнеров:

# docker container ls

Опция ‘-a’ указывает команде выводить все контейнеры, а не только запущенные, опция -s выводит размер каждого контейнера:

# docker container ls -a

Команда inspect выдает множество полезной информации о контейнере:

# docker container inspect КОНТЕЙНЕР

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

# docker container logs КОНТЕЙНЕР

Остановка контейнера

Обычно контейнер завершается автоматически после завершения процесса, но иногда требуется собственноручно завершить запущенный контейнер. Команда stop осуществляет «мягкое» завершение контейнера, по умолчанию предоставляя 10 секунд для завершения всех процессов:

# docker container stop КОНТЕЙНЕР

Для немедленного завершения выполните команду kill. В большинстве ситуаций stop предпочтительнее.

# docker container kill КОНТЕЙНЕР

Немедленное завершение всех запущенных контейнеров:

# docker container kill $(docker ps -q)

Удаление контейнера

удаление заданного контейнера.

# docker container rm КОНТЕЙНЕР

удалить все не запущенные контейнеры.

# docker container rm $(docker ps -a -q)

Изменения в контейнере

Как уже отмечалось в начале, после остановки контейнера все изменения сделанные в нем удаляются. Это не совсем удобно, что же делать если нам нужно сохранить изменения? Для этого мы можем создать собственный контейнер взяв за основу уже готовый. Запустив интерактивный сеанс, мы можем работать в контейнере как на обычной Linux-машине и вносить любые необходимые изменения, например, устанавливать нужные пакеты. Допустим, нам требуется контейнер Ubuntu с сервером Nginx. Установим необходимые для этого программы:

apt-get install nano
apt-get install nginx
apt-get install build-essential
apt-get install php5

Теперь нужно сохранить эти изменения, чтобы в следующий раз у нас был контейнер, где уже есть все необходимое. Для этого сначала нужно выйти из контейнера, выполнив команду exit, а затем подтвердить сделанные изменения командой commit:

# docker commit идентификатор new-template

Где идентификатор – это тот идентификатор, который использовался для первоначального запуска, а new-template – назначенное нами имя нового образа. Теперь он будет виден, если выполнить команду docker images:

# docker images

Созданный нами новый образ готов к использованию со всеми сделанными изменениями. Кроме того, мы можем отправить его в Docker Hub, чтобы при необходимости загружать его в других местах. Для этого войдите в свою учетную запись и воспользуйтесь командой push:

docker login
docker push имя_пользователя/new-template

где имя_пользователя – имя, соответствующее вашему аккаунту.

Заключение

На этом мы завершаем часть нашего руководства, посвященную контейнерам. В следующей части мы рассмотрим создание образов. Более подробную информацию можно получить из встроенной справки или официальной документации.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

ИТ Проффи

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: