Что такое Docker, с чем его едят и почему он похож на консоли Dendy и PlayStation

Удобно, не спеша и проводя аналогии разбираемся в основах Docker.

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

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

Что за зверь этот Docker?

Чтобы понять, как работает Docker нужно провести аналогию. Представьте, что вы снова ребенок и вам родители купили на праздник Dendy, а вместе с ней и пару картриджей. Когда вам хочется поиграть - вы просто берете картридж и вставляете его в приставку. Тут то и начинается игра! А если хочется поделиться картриджем с друзьями - берете и даете им поиграть на пару дней.

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

Если вы раньше создавали приложение на PHP, вам приходилось локально устанавливать PHP, MySql, NodeJs, с охапкой нужных расширений. Если вам нужно было передать ваш скрипт кому-то другому, для запуска необходимо было создавать структуру, аналогичную той, в которой скрипт создавался. Нужно было иметь схожие версии ПО, схожие обновления и настройки.

Docker избавит вас от этой мороки. Программа сама установит все необходимое для запуска вашего кода.

Принцип работы Docker схож с работой виртуальной машины. Docker запускает виртуальную, мало весящую ОС. В этом его главное отличие от Vagrant, который создает настоящую виртуальную операционку. Docker же использует свои собственные образы ПО, которые запускаются в виртуальной среде, без нужды делать полноценную копию операционки. Таким образом, с помощью Docker, можно быстро запустить Linux в изолированной среде, буквально за пару минут.

Зачем пользоваться Docker?

Для того, чтобы ваше ПО хорошо работало, его нужно оптимизировать. Тут снова проведем аналогию с видеоиграми. С играми для ПК всегда сложнее, ведь в отличие от консольных проектов, нужно проектировать ваш код под целую кучу разного железа, вариантов комбинаций которого могут быть сотни или даже тысячи. Разные ПК имеют разные ОС, видеокарты, процессоры и даже драйвера. Из-за этого задача разработчика создать приложение, работающее на всех популярных системах и конфигурациях, сильно усложняется.

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

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

Как установить Docker?

Docker можно скачать для подходящей вам ОС: Windows, Linux, Mac. Установочник можно загрузить с официального сайта программы, выбрав версию - Community (бесплатная) или Enterprise (платная с кучей фишек которые сейчас вам совсем не нужны). После установки нужно будет перезагрузить вашу ОС. Для захвата примеров я использовал Windows 10.

Теперь нужно убедиться, запущен ли Docker. Откройте командную строку. Нажмите клавишу Windows, и напишите в образовавшейся строчке "командная строка".

Что такое Docker, с чем его едят и почему он похож на консоли Dendy и PlayStation

Там напишите команду docker. Если все было сделано правильно, вы увидите вот такое окно.

Что такое Docker, с чем его едят и почему он похож на консоли Dendy и PlayStation

Теперь сдует проверить запустился ли docker-compose. Нужно всего лишь выполнить команду docker-compose и дождаться отклика.

Docker Image и его смысл

Docker Image очень напоминает картридж для Dendy. Это стандартизированное ПО, которое запускается на любой приставке Dendy.

Картриджи бывают разными, образы Docker - тоже. Например, ubuntu, php (наследующийся от оригинального образа Ubuntu), nodejs, и д.р.

Чтобы скачать образ, достаточно просто использовать команду: docker pull <IMAGE_NAME>, где часть <IMAGE_NAME> - это имя образа, который нужно скачать.

Теперь загрузим образ Ubuntu 18.10 с помощью команды:

docker pull ubuntu:18.10

Что такое Docker, с чем его едят и почему он похож на консоли Dendy и PlayStation

Данная команда сообщит Docker о том, что нужно скачать образ Ubuntu 18.10 с Dockerhub.com - хранилища образов. Там вы можете посмотреть список всех доступных образов и выбрать нужный конкретно вам.

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

docker images

Что такое Docker, с чем его едят и почему он похож на консоли Dendy и PlayStation

Скачанная Ubuntu 18.10 будет весить всего 74 Мб. Все благодаря компрессии образов Docker.

Docker-контейнер и с чем его едят?

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

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

Для этого существует команда:

docker run <image> <опциональная команды, которая выполнится внутри контейнера>

Теперь стоит произвести запуск контейнера Ubuntu:

docker run ubuntu:18.10 echo 'hello from ubuntu'

Что такое Docker, с чем его едят и почему он похож на консоли Dendy и PlayStation

Команда 'hello from ubuntu' выполнится внутри среды Ubuntu, то есть в контейнере ubuntu:18.10.

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

docker ps

Что такое Docker, с чем его едят и почему он похож на консоли Dendy и PlayStation

Пока что здесь пусто. Все потому, что docker ps показывает лишь список контейнеров, запущенных в данный момент. Наш контейнер в это время выполнил одну команду echo 'hello from ubuntu' и завершил свою работу. Для того, чтобы посмотреть список вообще всех контейнеров, нужно добавить флаг -a, и выполнить такую команду:

docker ps –a

Что такое Docker, с чем его едят и почему он похож на консоли Dendy и PlayStation

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

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

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

docker run -it ubuntu:18.10 /bin/bash

Опция -it совместно с /bin/bash даст разрешение на выполнение команд внутри контейнера Ubuntu. Это своего рода миниатюрная виртуальная машина, к консоли которой мы подключились по ssh. Теперь мы знаем, как войти в контейнер, и как выполнять в нем команды.

Также можно узнать ID контейнера, с которым предстоит работать. При выполнении команды docker run -it <IMAGE> /bin/bash, нас переместит в терминал, где все команды будут выполняться от имени пользователя root@<containerid>.

В качестве примера попробуем выполнить команду ls, и посмотрим список директорий, внутри этого образа Ubuntu.

Что такое Docker, с чем его едят и почему он похож на консоли Dendy и PlayStation

Сам процесс похож на запуск очередной части Tomb Raider или Crash Bandicoot на PlayStation. Неважно, чем вы занимаетесь в игре, это никак не изменит само ее ядро. Повторю, что информацию на самом диске вы изменить не сможете.

Контейнер независим от основной системы, он изолирован, словно виртуальная ОС, а это значит, что в нее можно вносить любые изменения и они не смогут затронуть основную систему.

Теперь нужно открыть новое окно терминала, при этом не закрывая текущее.

Выполните команду docker ps

Что такое Docker, с чем его едят и почему он похож на консоли Dendy и PlayStation

Вы увидите, что контейнер с Ubuntu 18.10 сейчас запущен.Теперь вернитесь к первому окну терминала, что находится внутри контейнера, и выполните команду:

mkdir /truedir #создаст папку truedir

exit #выйдет из контейнера, и вернётся в основную ОС

С помощью команды exit, контейнер будет остановлен (чтобы убедиться в этом, можно проверить командой docker ps).

Сейчас нужно ещё раз просмотреть список всех контейнеров, и убедиться, что новый был создан docker ps -a.

Что такое Docker, с чем его едят и почему он похож на консоли Dendy и PlayStation

Для того, чтобы запустить созданный ранее контейнер, выполните команду docker start <CONTAINER_ID>. В этом случае CONTAINER_ID - id контейнера, который можно посмотреть, выполнив команду docker ps -a в отдельном столбце.

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

docker start 7579c85c8b7e #ваш CONTAINER_ID

docker ps

docker exec -it 7579c85c8b7e /bin/bash #ваш CONTAINER_ID

Если внутри контейнера выполнить команду ls, вы увидите, что ранее созданная папка truedir находится в этом контейнере.

Что такое Docker, с чем его едят и почему он похож на консоли Dendy и PlayStation

Команда exec позволит вам выполнить команду внутри запущенного контейнера. На примере, я выполнил /bin/bash, что позволило мне подключиться к терминалу внутри контейнера. Для выхода выполним exit.

Теперь остановим и удалим Docker контейнеры (командами docker stop <CONTAINER_ID> и docker rm <CONTAINER_ID> соответсвенно):

docker ps a # просмотрим список активных контейнеров

docker stop aa1463167766 # остановим активный контейнер

docker rm aa1463167766 # удалим контейнер

docker rm bb597feb7fbe # удалим второй контейнер

DockerFile – что это?

Docker создает удобные файлы для того, чтобы вы могли делиться своей программной средой с другими.

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

Например, вы разработали приложение на php7.2, используя ElasticSearch 9 и сохранили его в DockerFile. Теперь пользователи, запускающие ваше приложение и использующие ваш файл, получат ту же среду с php7.2 и ElasticSearch 9.

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

Теперь создайте файл cli.php в корне проекта:

$n = $i = 5;

while ($i--) {

echo str_repeat(' ', $i).str_repeat('* ', $n - $i)."\n";

}

И файл под названием DockerFile, с содержимым:

FROM php:7.2-cli

COPY cli.php /cli.php

RUN chmod +x /cli.php

CMD php /cli.php

Имена команд в DockerFile - это синтаксис разметки.

FROM – схожа с выбором движка видеоигры (Unreal Engine, LitTech, CryEngine). Можно написать движок с нуля, но целесообразнее использовать готовый.

docker build --tag - путь к файлу а . - текущая директория, - имя, под которым образ будет создан

COPY - Копирует файл с основной системы в контейнер.

RUN - Выполняет shell-команды из терминала.

CMD – При новом запуске контейнера выполняет команду каждый раз.

Для создания образа из DockerFile нужно выполнить:

docker build <DOCKERFILE_PATH> --tag <IMAGE_NAME>

<DOCKERFILE_PATH> - путь к файлу а . - текущая директория, <IMAGE_NAME> - имя, под которым образ будет создан.

Выполним:

docker build . --tag pyramid

При том, что имя файла DockerFile при указывании пути упускается, нужно указывать только директорию, в которой этот файл находится (а "." означает, что файл находится в той директории, из которой была запущена консоль).

Что такое Docker, с чем его едят и почему он похож на консоли Dendy и PlayStation

После выполнения команды, можно обращаться к образу по его имени, указанному в <IMAGE_NAME>. Теперь проверим список образов: docker images

Что такое Docker, с чем его едят и почему он похож на консоли Dendy и PlayStation

И запустим контейнер из нашего образа командой docker run pyramid

Что такое Docker, с чем его едят и почему он похож на консоли Dendy и PlayStation

Shell скрипт был скопирован, и выполнен благодаря указанному в DockerFile параметру CMD.

Сначала мы скопировали файл cli.php в Docker образ, который создался с помощью DockerFile. Для того, чтобы удостовериться в том, что файл действительно был проброшен внутрь контейнера, можно выполнить команду docker run pyramid ls, которая в списке файлов покажет и cli.php.

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

Для этого, отредактируем файл cli.php, и изменим его так, чтобы количество аргументов принималось из командной строки. Отредактируем вторую строку:

$n = $i = $argv[1] ?? 5; //а было $n = $i = 5 //это значит, что мы принимаем аргумент из консоли, а если он не получен, то используем по-умолчанию 5

После чего, заново соберем образ: docker build . --tag pyramid а также запустим контейнер: docker run pyramid php /cli.php 9, получив вывод пирамиды в 9 строк.

Что такое Docker, с чем его едят и почему он похож на консоли Dendy и PlayStation

Когда контейнер запускается, вы можете переопределить команду, записанную в DockerFile в поле CMD.

Наша оригинальная CMD , записанная в файле php /cli.php - будет переопределена новой php /cli.php 9. Было бы неплохо передавать этот аргумент самому контейнеру, вместо переписывания всей команды. Сделаем так, чтобы вместо команды php /cli.php 7 можно было передавать просто аргумент-число.

Для этого, дополним DockerFile:

FROM php:7.2-cli

COPY cli.php /cli.php

RUN chmod +x /cli.php

ENTRYPOINT ["php", "/cli.php"]

## аргумент, который передаётся в командную строку

CMD ["9"]

Формат записи изменился. В таком случае, CMD будет добавлена к тому, что выполнится в ENTRYPOINT.

["php", "/cli.php"] запускается как php /cli.php. Учитывая то, что CMD будет добавлена только после выполнения текущей, итоговая команда будет выглядеть так: php /cli.php 9. Пользователь сможет переопределить этот аргумент, передавая его в командную строку, во время запуска контейнера.

Теперь, заново пересоберём образ:

docker build . --tag pyramid

И запустим контейнер с нужным аргументом:

docker run pyramid 3

Что такое Docker, с чем его едят и почему он похож на консоли Dendy и PlayStation

Docker Volumes и зачем он нужен?

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

По образу этой карты памяти Docker Volume прикрепляется к любому контейнеру. Он хранит данные на ПК.

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

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

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

Например так:

version '3'

services:

app:

image: nginx:alpine

ports:

- 80:80

volumes:

- /var/opt/my_website/dist:/usr/share/nginx/html:ro

***

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

В качестве дополнения можно посмотреть вот это весьма полезное видео.

#selectel_инструкция

1313
6 комментариев

У вас хэштег не поставился

Docker хорошо начал, но сейчас что-то затормозился в развитии. Ещё у него проблемы с безопасностью. Я бы порекомендовал смотреть в сторону podman. Имеет совместимый api и cli, не требует рута и работает без демона.

Хорошая статья, спасибо

Docker это дофига глубже, чем тут описано, автору +, за то, что это типа кто вообще не знаком, насчет безопасности это все к дядям девопса, а так инструмент крутой.

Спасибо отличная статья и очень удачное сравнение с приставками!