Контейнеризация. Часть 3: UNLIMITED POWER!!!

Дисклеймер

А ты похоже упорен и жаждешь знаний, раз дошел уже до третьей статьи про Docker. Ты, похоже, свыкся со специфичной подачей, странными отсылками и шакалистыми изображениями. Тем самым ты показал свое упорство, стремление к знаниям и целеустремленность. Поэтому у меня для тебя хорошие новости: сегодня я дам тебе ВЛАСТЬ, МОГУЩЕСТВО И БЕЗГРАНИЧНЫЙ КОНТРОЛЬ!!!

И тут ты уже такой «Ууу-уу, да»

Но только над Docker — контейнерами. Алсо, если ты что-то забыл или сильно хитрый и прыгнул сразу на третью часть:

Напоминалка

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

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

Никакого равноправия

Разбирать я буду сегодня команды служащие для:

  • Получение информации о докере,изображениях, контейнерах и закешированных модулях
  • Сборки, запуска, остановки, изменения и уничтожения контейнера
  • Проверки состояния и вывода логов контейнера

Подопытное Docker — image

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

# Создаем невероятной сложности страницу и в той же папке Dockefile
mkdir http_server
cd http_server/
echo '<HTML><H1>My first http server in docker</H1></HTML>' > index.html
touch Dockerfile
очень сложная структура
FROM centos:7

LABEL master="ME"

# Грузим репозиторий nginx
RUN yum install -y epel-release

# Грузим nginx
RUN yum install -y nginx

# Закинули страницу nginx-у
ADD index.html /usr/share/nginx/html/index.html

# Открываем TCP на 80-м порту
EXPOSE 80

# Запускаем процесс nginx и выключаем его демонизацию (иначе контейнер сразу помрет)
CMD ["/usr/sbin/nginx", "-g daemon off;"]

Информационные команды

Docker — это информация. Много — много информации. О версиях изображения, о состоянии контейнеров, о логах процессов, о размерах изображений и тд. и тп. И иногда ее нужно мониторить. В этом тебе помогут следующие команды:

  • docker ps — выводит список всех запущенных в настоящее время контейнеров. Выдает информацию об ID, базовом изображении контейнера, команде,поданной для запуска, времени создания, статусе, открытых портах и имени. Для ps существуют опции, изменяющие выдаваемый список изображений. Я не буду их все перечислять,для этого есть справка, напомню только о самых часто используемых
# docker ps options
-a выводит вообще все контейнеры, а не только запущенные
-f фильтрация по определенному свойству
--format просто красивое форматирование
-s добавляет колонку с инфой о размере контейнера
-q отображает только ID. Нужна для подачи в цепочку docker - команд

# Выдает все контейнеры,содержащие подстроку "partname"
docker ps --filter "name=partname"

# Просмотр размеров контейнеров
docker ps -s

# Получение всех контейнеров
# Нужно для команд типа docker rmi $(docker ps -a -q)
docker ps -a
  • docker image ls — выводит список всех скачанных с репозиториев изображений вместе с их тегами, ID и размерами. Полезно для очистки места на компьютере,потому что при удалении репозитория изображения,использованные в нем, по умолчанию не удаляются.
# docker image ls options
-a выводит вообще все изображения,включая промежуточные. Так можно смотреть состав изображений
-f фильтрация по определенному свойству
-q отображает только ID. Нужна для подачи в цепочку docker - команд

# Выдает все изображения,выкачанные из "java" репозитория
docker image ls java
  • docker stats — выводит в реальном времени статистику использования ресурсов локальной машины контейнерами. Выдает ID и имя контейнера, процент CPU и MEM, нагрузку на сети Интернет, количество потоков в каждом контейнере. Полезная штука, чтобы понять,что в развернутом в Docker приложении течет память).
# Сделать снимок статистики. Значения будут получены 1 раз и меняться не будут
docker stats --no-stream

# Можно получать статистику для отдельных контейнеров, по ID или имени
docker stats http_server

Команды управления жизненным циклом контейнера

Вот, значит, есть страшная диаграмма жизненного цикла контейнера в докере, честно стыренная. По ней я и буду все рассказывать ( только вместо опции create я расскажу про build)

  • docker build — собирает контейнер из переданного контекста. Контекстом может быть: папка с Dockerfile, сам Dockerfile, tar-ник из интернета, URL. Но, в каком бы виде ты не передавал контекст в эту команду, там должен быть Dockerfile. Docker пока не настолько умный, чтобы читать твои хотелки прямо из головы.
# Сборка из текущей папки изображения с тегом. 
docker build -t http_server:custom_tag .

# Сборка из удаленного tar -f указывает на сборку из файла
docker build -f ctx/Dockerfile http://server/ctx.tar.gz
  • docker run — создает в контейнере слой для записи и запускает в нем переданную команду. В целом аналогична инструкции RUN в Dockerfile. Обычно используется для того, чтобы запустить приложение и задать ему порты для приема/передачи.
# Запустить контейнер в интерактивном режиме (попасть в его консоль)
docker run -it http_server

# Запустить контейнер с полным доступом к ОС. Можно монтировать файловые системы и заниматься прочими безобразиями
docker run -it --privileged http_server

# Задать размер хранилища при запуске контейнера. Меньше дефолтного сделать не получится
docker run --storage-opt size=50G http_server

# Задать открытый порт. Эта команда активирует настройку EXPOSE если она прописана.Здесь мы мапим 80-й порт локалки на 8080 порт контейнера и задаем ему TCP тип
docker run -p 127.0.0.1:80:8080/tcp http_server bash

# А здесь просто открываем 80-й порт контейнера для взаимодействий без маппинга к хостовой машине
docker run --expose 80 http_server bash

# В команду run можно передавать файл с env-переменными
# сам файл
 cat env.list
   VAR1=value1
   VAR2=value2
   USER
docker run --env-file env.list ubuntu env | grep VAR
output
----------
VAR1=value1
VAR2=value2
USER=you
  • docker start — просто стартует процесс остановленного контейнера, можно запустить в интерактивном режиме с помощью флага -i.
#Можно по имени
docker start http_server

#В интерактивном
docker start -i http_server

#И даже по ID, чудеса в решете да и только
docker start <container ID>
  • docker stop — угадай, что он делает? Правильно, посылает контейнеру SIGTERM, а после таймаута (по дефолту в 10 секунд) посылает SIGKILL, возьми с полки ничего.
# Остановили на 10 секунд и потом грохнули
docker stop http_server

# Остановили на 20 секунд и потом грохнули
docker stop -t 20 http_server
  • docker restart — перезапускает контейнер. Когда контейнер стартанет, то начнет снова исполнять изначально заданную команду.
# ОСТОРОЖНО: ЗАПРЕДЕЛЬНЫЙ УРОВЕНЬ КЭПСТВА!!!
# Рестартуем контейнер по его имени
docker restart http_server
  • docker pause — посылает SIGSTOP всем процессам внутри контейнера и процессу самого контейнера. Возобновить можно соответственно командой unpause. Пример на это я уже писать не буду, сам догадаешься, что нужно сделать, это не сложно, просто поверь в себя.
  • docker rm — удаляет контейнер по ID или имени. Можно подать ссылку на другую команду, чтобы удалить список контейнеров. По умолчанию НЕ УДАЛЯЕТ анонимные папки, связанные с контейнером
# Удаление контейнера по имени
docker rm http_server

#Удаление контейнера и анонимных папок. Если папке было задано имя - она не удалится. В общем, опция нужна, чтобы удалять весь мусор, который docker по-тихому создает
docker rm -v http_server

#Удаление списка остановленных контейнеров. Опция q нужна чтобы получить список ID. Да, не смотря на то, что мы получили список ВСЕХ контейнеров, удалятся только остановленные, смотри диаграмму состояний.
docker rm $(docker ps -a -q)

Команды логирования

Docker — контейнеры пишут логи. И много. И их надо смотреть. Да, это неприятно, но без просмотра логов твоя жизнь превратится в ад, и будешь ты в нем гореть где-то на пятом кругу.

  • docker logs — поможет тебе избежать вышеописанных перспектив, да еще и логи позволит отображать.
# Можно глядеть в реальном времени
docker logs -f http_server

# Показывать временные отметки
docker logs -t http_server

# Показать последние n строк
docker logs --tail <n> http_server

# Показать с определенной временной отметки (с 42-й минуты)
docker --since 42m http_server
  • docker inspect — выводит кучу инфы о контейнере в виде JSON. То, что он выводит, можешь посмотреть сам, запустив пример, написанный ниже. Ну серьезно, не хватало мне еще тут JSON-ы описывать.
#Настоятельно советую запустить этот пример

# Вот эта команда спулит убунту, напишет "test" и выдаст тебе длинную строку
docker run -t -i -d ubuntu echo "test"

#Помести эту строку в docker inspect (ну или можешь имя контейнера нового вбить)
docker inspect <длинная строка>

Вместо послесловия

Вот ты и прочел про то, как управлять контейнерами. Можешь создать сто штук, заставить их выводить «You are the best» в консоль и тешить свое эго. А можешь проработать полученный материал и стать капельку мудрее.

В следующий раз я поведаю тебе о best practices в мире Docker, расскажу почему Alpine — выбор мастеров и вообще буду онанировать на сэкономленные мегабайты, жди)

Возможно, Вам понравится:

guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x
()
x