Шпаргалка с командами docker

Что такое Docker

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

Разработка Docker была начата в 2008 году, а в 2013 году он был опубликован как свободно распространяемое ПО под лицензией Apache 2.0. В качестве тестового приложения Docker был включен в дистрибутив Red Hat Enterprise Linux 6.5. В 2017 году была выпущена коммерческая версия Docker с расширенными возможностями.

Docker работает в Linux, ядро которых поддерживает cgroups, а также изоляцию пространства имен. Для инсталляции и использования на платформах, отличных от Linux, существуют специальные утилиты Kitematic или Docker Machine.

Основной принцип работы Docker — контейнеризация приложений. Этот тип виртуализации позволяет упаковывать программное обеспечение по изолированным средам — контейнерам. Каждый из этих виртуальных блоков содержит все нужные элементы для работы приложения. Это дает возможность одновременного запуска большого количества контейнеров на одном хосте.

Docker-контейнеры работают в разных средах: локальном центре обработки информации, облаке, персональных компьютерах и т. д.

Прочие команды

Это общие операции, не привязанные к работе с конкретными сущностями типа образов и контейнеров. Но они тоже пригодятся при использовании Docker.

  • docker version — показывает техническую информацию о самом Docker. Как о клиенте, так и о сервере.
  • docker login — авторизует пользователя в реестре Docker.
  • docker system prune — выполняет некую чистку, удалив из системы контейнеры, которые уже не используются, ненужные сети и образы без имен и меток.

version

К этой команде можно обратиться за подробной информацией о самом Docker. Она отобразит версию клиента и сервера Docker. 

login

Об этой команде уже говорили. Она позволяет авторизоваться в реестре образов Docker Hub. Загружать туда образы и выгружать уже готовые к себе.

system prune

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

Допустим, чтобы стереть из Docker все образы и сверху зацепить еще тома, то надо ввести в терминал:

docker system prune –all –volumes

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

Устанавливаем соединение с сервером по SSH

SSH – сетевой протокол, осуществляющий защищенное соединение с удаленными устройствами через консольное окно. Благодаря ему пользователь может безопасно обмениваться данными (фото, видео, текстовые файлы), работать в командной строке, удаленно запускать программы и многое другое.

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

Для подключения используется специальная программа – PuTTY. В нее нам потребуется ввести IP-адрес сервера и данные для авторизации. Все это нужно для того, чтобы подключиться к серверу, на котором есть Docker. Об этом мы еще поговорим, а пока давайте рассмотрим, как воспользоваться PuTTY:

Первым шагом загружаем утилиту с официальной страницы и устанавливаем ее к себе на компьютер.
Для подключения к серверу нам потребуется узнать IP-адрес. Если вы пользуетесь услугами хостинг-провайдера, то его можно найти в личном кабинете. Например, на Timeweb адрес VDS находится в разделе «Дашборд серверов».
Переходим в PuTTY и в разделе «Session» вставляем скопированный адрес. Также убеждаемся, что указан порт 22 и установлено соединение по SSH. В завершение кликаем по кнопке «Open».
В отобразившемся окне вводим логин и пароль для авторизации на сервере

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

Доступ к серверу по защищенному протоколу SSH мы получили. Теперь нам осталось подключиться к докер-контейнеру, о чем поговорим далее.

Краткая справка

Docker — это система управления контейнерами. Контейнеры же представляют собой логическое эволюционное продолжение виртуальных машин. Это изолированная среда для разработки и тестирования программного обеспечения. 

Контейнер Docker потребляет мало ресурсов и быстро запускается, а еще его легко переносить с одного устройство на другое. Из-за этих преимуществ Docker постепенно наращивает аудиторию и превращается в некий индустриальный стандарт, которым пользуются даже крупные корпорации вроде Microsoft. 

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

Работа с образами

Docker — больше, чем просто программа. Это целая экосистема со множеством проектов и сервисов. Главный сервис, с которым вам придется иметь дело — Registry. Хранилище образов.

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

Разберемся с тем, как формируется имя образа, и что оно в себя включает.

Вторая колонка в выводе выше называется TAG. Когда мы выполняли команду , то на самом деле выполнялась команда . То есть мы не просто скачиваем образ nginx, а скачиваем его конкретную версию. Latest — тег по умолчанию. Несложно догадаться, что он означает последнюю версию образа.

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

Впрочем, популярные образы следуют соглашению. Как понятно из контекста, теги в Докере изменяемы, другими словами, вам никто не гарантирует, что скачав образ с одним и тем же тегом на разных компьютерах в разное время вы получите одно и то же. Такой подход может показаться странным и ненадежным, ведь нет гарантий, но на практике есть определенные соглашения, которым следуют все популярные образы. Тег latest действительно всегда содержит последнюю версию и постоянно обновляется, но кроме этого тега активно используется семантическое версионирование. Рассмотрим https://hub.docker.com/_/nginx

Теги, в которых присутствует полная семантическая версия (x.x.x) всегда неизменяемы, даже если в них встречается что-то еще, например, 1.12.2-alphine. Такую версию смело нужно брать для продакшен-окружения. Теги, подобные такому 1.12, обновляются при изменении path версии. То есть внутри образа может оказаться и версия 1.12.2, и в будущем 1.12.8. Точно такая же схема и с версиями, в которых указана только мажорная версия, например, 1. Только в данном случае обновление идет не только по патчу, но и по минорной версии.

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

Кроме тегов имя образа может содержать префикс: например, . Этот префикс является именем аккаунта на сайте, через который создаются образы, попадающие в Registry. Большинство образов как раз такие, с префиксом. И есть небольшой набор, буквально сотня образов, которые не имеют префикса. Их особенность в том, что эти образы поддерживает сам Docker. Поэтому если вы видите, что в имени образа нет префикса, значит это официальный образ. Список таких образов можно увидеть здесь: https://github.com/docker-library/official-images/tree/master/library

Удаляются образы командой .

Если в Докере присутствует хоть один контейнер из удаляемого образа, то Докер не даст его удалить по понятным причинам. Если вы всё же хотите удалить и образ, и все контейнеры, связанные с ним, используйте флаг .

Как использовать ресурсы контейнера ¶

По умолчанию контейнер закрыт от любых контактов извне. Вы не можете ни скопировать в него файл, ни подключиться к сокету. Он закрыт. Но при запуске контейнера можно пробросить порт или папку. Тогда к нему можно будет подключиться, добавить файл или что-то скачать. Всё это делается при создании (запуске) контейнера через аргументы.

Проброс портов

Для примера запустим контейнер с Debian 9 и пробросим локальный порт 3132 на 80 порт контейнера:

Пояснения к команде:

  • — создаёт и запускает новый контейнер.
  • — подключает виртуальную консоль. Это нужно, чтобы команда не завершала работу, иначе контейнер остановится.
  • — запускает выполнение контейнера в фоне. Без этого аргумента консоль будет ждать, когда контейнер остановится (для остановки придётся использовать другую консоль).
  • — использовать в качестве процесса системную утилиту . Просто потому, что она не завершится пока не закроется stdin, а значит и контейнер будет работать.
  • — уникальное имя, которое используется для управления контейнером. Если его не указывать, то докер сам придумает какое-нибудь имя.
  • — проброс портов. Сначала надо указать порт машины (можно указать вместе с IP), потом порт в контейнере.

Общий принцип запуска контейнеров довольно простой:

Аргументы, параметры и тег необязательны, их можно опускать. Но нужно помнить, что без аргументов образ сам по себе не пробрасывает порты и папки. Это всегда делается через аргументы при создании контейнера.

Теперь давайте рассмотрим, как выполнять команды внутри контейнера. Для примера установим и запустим консольный сервер php 7:

Пояснения к команде:

  • — выполняет команду внутри запущенного контейнера.
  • — подключает виртуальную консоль. Без этого аргумента вывод будет неправильным.
  • — подключает ввод. Без него не будет работать клавиатура.
  • — имя контейнера, в котором выполняется команда.
  • — команда, которая будет выполнена внутри контейнера.

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

В этом примере я использовал две разные консоли. На одной я запускал сервер, а на другой curl. Ещё можно использовать браузер, если докер установлен у вас в системе.

Проброс папки

В предыдущем примере я создал index.php прямо в контейнере. Это не самый удобный способ разработки проектов в через докер. Во-первых, много файлов так не создашь, во-вторых ими сложно управлять, а, в-третьих, если удалить контейнер, они тоже удалятся. Чтобы решить эти проблемы, можно пробросить (примонтировать) папку из реальной машины в виртуальный контейнер. Делается это, как всегда, при создании контейнера, через аргумент .

Прежде, чем начать что-то менять, надо удалить старый контейнер:

Теперь подготовим наш «проект»:

А теперь запускаем контейнер с пробросом папки проекта:

Если вы помните, я удалил контейнер, в котором был установлен php, а это значит, что мне заново придётся установить пакет php7.0-cli:

Теперь в контейнере есть и проект, и php, можно запускать сервер:

Теперь проверяем, как работает наш проект:

Для наглядности давайте создадим ещё один файл в «проекте», чтобы удостовериться, что всё работает как надо:

Должно вывести что-то вроде этого:

Если у вас получилось, смело пишите в резюме, что владеете докером!

Другие Типы Монтирования

Есть два других типа томов Docker, которые мы еще не обсуждали: bind mount и tempfs mount.

Bind Mount

Bind mount используются для монтирования существующего пути на хосте в контейнер. Используя —mount совместно с <host path>:<container path>, вы можете указать существующие каталоги, которые будут монтироваться в контейнер. Это очень удобно при использовании информации о конфигурации, такой как каталоги внутри /etc. Это также полезно, когда у вас есть информация, которую вы хотите использовать в контейнере, например, существующие наборы данных или статические файлы веб-сайта.

Tempfs Mount

Задача tempfs монтирования состоит в том, чтобы обеспечить доступное для записи расположение, которое специально не сохраняет информацию после окончания срока службы контейнера. Возможно, вы думаете: «зачем это нужно?” В контейнере, который не имеет подключенного тома, все записи идут в тонкий слой R/W, вставленный во время выполнения. Любая запись, направленная на этот слой, влияет на файловую систему, поскольку эти записи выполняются на базовом хосте. Обычно это не является проблемой, если вы не пишете значительные объемы одноразовых данных (таких как журналы). В этом случае вы можете наблюдать снижение производительности, так как файловая система должна обрабатывать все эти вызовы write. tempfs монтирование было создано для предоставления контейнерам временного пути записи, который не влияет на операции файловой системы. В частности, tempfs это эфемерное монтирование, которое записывается непосредственно в память. Этот том можно создать с помощью —tempfs аргумента.

Драйвера Томов

По умолчанию тома хранят информацию о базовой хост-системе. Docker также имеет концепцию, называемую драйверами томов, которая позволяет указать, как и где хранить тома. Например, вы можете хранить том Docker внутри корзины Amazon S3. Это может быть удобно, если вы хотите, чтобы информация сохранялась не только за пределами срока службы контейнера, но и за пределами срока службы хоста.

Установка

Чтобы начать пользоваться Докером, необходимо установить движок — Docker Engine. На странице https://docs.docker.com/engine/install/ доступны ссылки для скачивания под все популярные платформы. Выберите вашу и установите Докер.

В работе Докера есть одна деталь, которую важно знать при установке на Mac и Linux. По умолчанию Докер работает через unix сокет

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

Проверить успешность установки можно командой :

Она выдаёт довольно много информации о конфигурации самого Докера и статистику работы.

Листинг контейнеров

При работе с контейнерами вам часто надо будет получить список, просмотреть и фильтровать свои контейнеры. Команда — делает все это, и у нее есть несколько интересных вариантов.

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

Самая основная команда —  без аргументов, которая показывает все текущие контейнеры.

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

Обратите внимание, что команда усечена (а также идентификатор контейнера). Чтобы показать полную команду, добавьте :

Теперь видна полная команда:

Все контейнеры

Как вы помните, Docker продолжает останавливать контейнеры (если вы не запустили их с помощью ). Добавление показывает все контейнеры:

Форматирование

Вывод команды  может быть слишком подробным и часто показывает слишком много полей, которые не интересны. Вы можете использовать форматирование Go-шаблона, чтобы отображать только интересующие вас поля. Здесь отображается только имя и команда:

Это работает, но чтобы представить его с именами полей, добавьте «table» в начало строки формата:

Имя формата для идентификатора контейнера (не выбранного здесь) — .

Фильтрация

Команда поддерживает множество фильтров. Они довольно просты в использовании. Синтаксис:. Поддерживаемые фильтры: id, label, name, exited, status, ancestor, before, since, isolation, network и health.

Здесь выполняется фильтрация по имени контейнера и отображается только контейнер busybox:

Флаг -q

Если все, что вам нужно, это идентификатор контейнера, используйте флаг (тихий флаг). Это проще, чем  . Это часто необходимо, когда вы хотите выполнять операции с несколькими контейнерами (вы увидите пример позже).

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Мой редактор ОС
Добавить комментарий

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