Докер что это за работа
Docker. Зачем и как
Есть множество прекрасных публикаций для тех, кто уже пользуется docker-ом. Есть хорошие статьи для тех, кто хочет этому научиться. Я пишу для тех, кто не только не знает, что такое docker, но и не уверен стоит ли ему это знать.
Я сознательно опускаю некоторые технические подробности, а кое где допускаю упрощения. Если вы увидите, что docker – то, что вам нужно, вы легко найдете более полную и точную информацию в других статьях.
Начну я с описания нескольких типичных проблем.
Проблемы
Первая проблема — как передать продукт клиенту.
Предположим у вас есть серверный проект, который вы закончили и теперь его необходимо передать пользователю. Вы готовите много разных файликов, скриптов и пишите инструкцию по установке. А потом тратите уйму времени на решения проблем клиента вроде: «у меня ничего не работает», «ваш скрипт упал на середине — что теперь делать», «я перепутал порядок шагов в инструкции и теперь не могу идти дальше» и т. п.
Всё усугубляется если продукт тиражируемый и вместо одного клиента у вас сотни или тысячи покупателей. И становится еще сложнее, если вспомнить о необходимости установки новых версий продукта.
Вторая проблема — тиражируемость. Пусть вам нужно поднять 5 (или 50) почти одинаковых серверов. Делать это вручную долго, дорого и подвержено ошибкам.
Наконец, третья проблема — переиспользуемость. Предположим у вас есть отдел, который делает браузерные игры. Предположим, что их у вас уже несколько. И все они используют один и тот же технологический стэк (например — java-tomcat-nginx-postgre). Но при этом, чтобы поставить новую игру вы вынуждены заново подготавливать на новом сервере почти одинаковую конфигурацию. Вы не можете просто так взять и сказать — «хочу сервер, как в игре странники но только с другим веб архивом»
Обычные решения
Как обычно решаются эти проблемы.
Установочный скрипт
Первый подход я уже упомянул — вы можете написать скрипт, который установит всё, что вам нужно и запускать его на всех нужных серверах. ( Скрипт может быть как простым sh файлом, так и чем-то сложным, созданным с использованием специальных инструментов).
Недостатки этого подхода — хрупкость и неустойчивость к ошибкам. Как бы хорошо не был написан скрипт, рано или поздно на какой-то машине он упадёт. И после этого падения машина фактически окажется «испорченной» — просто так «откатить» те действия, которые скрипт успел выполнить, у вашего клиента не получится.
Облачные сервисы
Второй подход — использование облачных сервисов. Вы вручную устанавливаете на виртуальный сервер всё, что вам нужно. Затем делаете его image. И далее клонируете его столько раз, сколько вам надо.
Недостатка здесь два. Во-первых, vendor-lock-in. Вы не можете запускать свое решение вне выбранного облака, что не всегда удобно и может привести к потерям несогласных с этим выбором клиентов. Во-вторых, облака медленны. Виртуальные (и даже «bare-metal») сервера предоставляемые облаками на сегодняшний день сильно уступают по производительности dedicated серверам.
Виртуальные машины
Третий подход — использование виртуальных машин. Здесь тоже есть недостатки:
Размер — не всегда удобно качать образ виртуальной машины, который может быть довольно большим. При этом, любое изменение внутри образа виртуальной машины требует скачать весь образ заново.
Сложное управление совместным использованием серверных ресурсов — не все виртуальные машины вообще поддерживают совместное использование памяти или CPU. Те что поддерживают, требуют тонкой настройки.
Подход докера — контейнеризация
И вот тут появляется docker, в котором
Как работает docker
Создание образа
Сначала создается docker image (или образ). Он создается при помощи скрипта, который вы для этого пишете.
Образы наследуются и, обычно, для создания своего первого образа мы берём готовый образ и наследуемся от него.
Чаще всего мы берем образ в котором содержится та или иная версия linux. Скрипт тогда начинается как-то так:
Кроме этого, мы можем копировать в наш образ любые локальные файлы при помощи директивы COPY.
Докер поддерживает гораздо больше различных директив. Например, директива USER roman говорит докеру что все следующие директивы нужно выполнять из под пользователя roman. А директива ENTRYPOINT [“/opt/tomcat/catalina.sh”] задает исполняемый файл, который будет запускаться при старте.
Я не буду перечислять все остальные директивы — в этом нет смысла. Здесь главное — принцип: вы создаёте вот такой скрипт, называете его Dockerfile и запускаете команду docker build, docker выполняет скрипт и создает image.
Если в процессе возникают какие-то ошибки, докер о них сообщает и вы их исправляете. То есть исправление скрипта происходит на этапе создания image. На этапе установки скрипт уже не используется.
Создание контейнера
Когда у вас уже есть docker image вы можете создать из него контейнер на любом физическом сервере, где установлен докер. Если image – это тиражируемый образ некоторой «машины», то container это уже сама «машина», которую можно запускать и останавливать.
Важный момент — при создании контейнера из image, его можно параметризовать. Вы можете передавать докеру переменные окружения, которые он использует при создании контейнера из image. Так вы сможете создавать немного разные машины из одного образа. Например, передать образу web-сервера его доменное имя.
Хорошей практикой в докере считается «упаковка» в один контейнер ровно одного постоянно работающего серверного процесса. Как я уже упоминал, этот процесс работает на уровне физического сервера и честно регулируется установленной там операционной системой. Поэтому, в отличие от виртуальных машин, контейнеры докера не требуют специального управления памятью и процессорами. Использование ресурсов становится простым и эффективным.
Union filesystem
Ок — память и процессор используется эффективно. А как насчёт файловой системы? Ведь если у каждого контейнера докера своя собственная копия операционной системы, то мы получим ту же проблему, что и с виртуальными машинами — тяжеловесные образы, которые содержат одно и тоже.
На самом деле в докере это не так. Если вы используете 100500 контейнеров, основанных на одном и том же образе операционной системы, то файлы этой системы будут скачаны докером ровно один раз. Это достигается за счёт использования докером union file system.
Union file system состоит из слоёв (layers). Слои как бы наложены друг на друга. Некоторые слои защищены от записи. Например, все наши контейнеры используют общие защищенные от записи слои, в которых находятся неизменяемые файлы операционной системы.
Для изменяемых файлов каждый из контейнеров будет иметь собственный слой. Естественно, докер использует такой подход не только для операционной системы, но и для любых общих частей контейнеров, которые были созданы на основе общих «предков» их образов.
Container registry
Получается, что docker image состоит из слоёв. И хорошо было бы уметь скачивать на наш сервер только те слои, которых на нём пока нет. Иначе для установки 100 контейнеров, основанных на Ubuntu мы скачаем Ubuntu внутри их образов 100 раз. Зачем?
Хорошая новость в том, что докер решает эту проблему. Докер предоставляет специальный сервис, называемый docker registry. Docker registry предназначен для хранения и дистрибуции готовых образов. Собрав новый образ (или новую версию образа) вы можете закачать его в docker registry. Соответственно, потом его можно скачать оттуда на любой сервер. Главная фишка здесь в том, что физически качаться будут только те слои, которые нужны.
Например, если вы создали новую версию образа, в котором поменяли несколько файлов, то в registry будут отправлены только слои, содержащие эти файлы.
Аналогично, если сервер качает из registry какой-то образ, скачаны будут только слои, отсутствующие на сервере.
Docker registry существует и как общедоступный сервис и как open source проект, доступный для скачивания и установки на собственной инфрастуктуре.
Использование контейнеров
Созданные контейнеры можно запускать, останавливать, проверять их статус и т д. При создании контейнера можно дополнительно передать докеру некоторые параметры. Например, попросить докер автоматически рестартовать контейнер, если тот упадёт.
Взаимодействие между контейнерами
Если контейнеров на сервере несколько, управлять ими вручную становится проблематично. Для этого есть технология docker compose. Она существует поверх докера и просто позволяет управлять контейнерами на основе единого конфигурационного файла, в котором описаны контейнеры, их параметры и их взаимосвязи (например контейнер A имеет право соединяться с портом 5432 контейнера B)
Выводы
Таким образом докер очень хорошо подходит для решения перечисленных выше задач:
Профессия Механизатор (докер-механизатор) комплексной бригады на погрузочно-разгрузочных работах в России
О профессии Механизатора (докера-механизатор) комплексной бригады на погрузочно-разгрузочных работах
Зарплаты: сколько получает Механизатор (докер-механизатор) комплексной бригады на погрузочно-разгрузочных работах *
Начинающий: 25000 в месяц
Опытный: 40000 в месяц
Профессионал: 60000 в месяц
Востребованность профессии
Современная экономика характеризуется большим грузопотоком, который обрабатывается в различных логистических центрах – портах, на железнодорожных станциях, в складских комплексах и т.д. В связи с этим на транспорте и в складском хозяйстве необходимы специалисты, способные управлять современными погрузчиками, кранами и прочей техникой. Востребованность профессии значительная. На рынке труда постоянно открыто большое количество вакансий. Спрос на специалистов особенно высокий в портовых городах и на крупных железнодорожных узлах.
Для кого подходит профессия
Профессия механизатора не требует от соискателя каких то особенных качеств или психологических характеристик. Здесь важно умение управлять специальной техникой, внимательность и аккуратность.
Профессия подходит тем, кто:
Карьера
Механизатор (докер-механизатор) комплексной бригады на погрузочно-разгрузочных работах – это рабочая специальность. Специалист непосредственно выполняет погрузочные операции, способен управлять различной техникой и приспособлениями. Базовая подготовка не подразумевает построения какой-либо значимой карьеры. Профессионал может возглавить бригаду, управлять мощной и сложной техникой. Занятие руководящих административных должностей без получения высшего образования невозможно.
Обязанности
В процессе выполнения погрузочно-разгрузочных работ на механизатора возложены следующие обязанности:
Основы Docker за Х часов и Y дней
0. Вступление
Цель данной статьи собрать в небольшую кучку основную информацию, минимально достаточную для того, чтобы начать работать с докер на ежедневной основе и удалить с рабочей машины локально установленные apache, mysql, virtualenv, python3, mongodb, memchaced, redis, php5, php7 и весь остальной зоопарк, который мы используем при разработке, и который зачастую еще и конфликтует между собой от версии к версии.
А еще я в автобусе и ближайшие 7 часов мне все равно делать будет нечего. Ну и вдобавок я наконец-то соберу в одном месте ссылки и команды, за которыми мне самому периодически приходится лезть в документацию, например — как на маке добавить IP алиас к локалхосту: sudo ifconfig lo0 alias 10.200.10.1/24 (зачем это надо будет сказано позже)
Статья называется так, как называется, потому что я не смог более-менее точно подсчитать сколько нужно времени на поставленную задачу. У меня на это ушло примерно 6 часов в течение 3 дней. Во многом, потому что в тот момент я работал фулл тайм в офисе и осваивал докер, так сказать, без отрыва от производства.
У вас может уйти меньше дней или больше часов, зависит от того, как интенсивно вы будете вникать.
Но мое личное мнение – лучше все же не пытаться “ворваться” за один день. Просто потому что если Вы никогда не имели с этим дело, то в конце первого дня у вас будет где-то вот такая голова
И лучше в этот момент остановиться, переварить информацию, может даже поспать.
1. Теория
Если Вы ранее имели дело с виртуальными машинами и такими инструментами как virtualbox, vmware, vagrant и подобными штуками – лучше забудьте о них.
Лично моей ошибкой была попытка работать с докер как с виртуальной машиной. Докер – средство виртуализации процессов, а не систем. Важное правило – каждому процессу свой виртуальный контейнер.
Контейнер следует воспринимать как отдельный процесс и наоборот. Например не следует пихать в один контейнер mysql и redis. Или еще хуже всю связку apache+php+mysql.
Основные термины
Image (образ) – собранная подсистема, необходимая для работы процесса, сохраненная в образе.
Container (контейнер) – процесс, инициализированный на базе образа. То есть контейнер существует только когда запущен. Это как экземпляр класса, а образ это типа класс. Ну я думаю идея понятна.
Host (хост) – среда, в которой запускается докер. Проще говоря – ваша локальная машина.
Volume – это дисковое пространство между хостом и контейнером. Проще – это папка на вашей локальной машине примонтированная внутрь контейнера. Меняете тут меняется там, и наоборот, миракл.
Dockerfile – файл с набором инструкций для создания образа будущего контейнера
Service (сервис) – по сути это запущенный образ (один или несколько контейнеров), дополнительно сконфигурированный такими опциями как открытие портов, маппинг папок (volume) и прочее. Обычно это делается при помощи docker-compose.yml файла.
Docker-compose (докер-композ, чаще композер, но не путать с php composer) – тулза, облегчающая сборку и запуск системы состоящей из нескольких контейнеров, связанных между собой.
Build (билд, билдить) – процесс создания образа из набора инструкций в докерфайле, или нескольких докерфайлов, если билд делается с помощью композера
В данной статье позже (завтра) я опишу процесс сборки связки nginx+mysql+php7-fpm с примерами и описаниями dockerfile и docker-compose файлов.
Вкратце о том, как работает билдинг образов
Сначала есть docker hub, это такой репозиторий, куда все желающие самоутвердиться публикуют свои собственные сборки образов. За это некоторым большое спасибо, а некоторым нет, все как и в любой другой свалке пакетов.
Обычно докерфайл начинается с инструкции FROM, которая указывает с какого пакета/образа из хаба начать.
Далее обычно идет инструкция maintainer, задача которой увековечить имя создателя очередного гениального творения.
Затем наиболее часто встречающиеся команды:
RUN – выполняет команду внутри образа.
ADD – берет файлы с хоста и кладет внутрь образа.
А также COPY, EXPOSE, ENTRYPOINT, CMD — обо всем этом Вы узнаете в процессе.
Сейчас внимание. Докер выполняет инструкции из докерфайла последовательно поверх предыдущего результата. Таким образом организовано хранение кеша.
Не поняли? Сейчас покажу. Вот простейший докерфайл:
Как докер его билдит:
ID я тут написал условные, но важно помнить, что идентификаторы этих “промежуточных” образов напрямую связаны с самими инструкциями, с файлами которые добавляются инструкцией ADD и с ID родительского образа. То есть фактически перед выполнением каждого шага сначала вычисляется ID (хеш) образа, поиск такого ID в локальном кеше, и только если такого ID в кеше нет, тогда выполняется шаг и сохраняется в кеш, иначе – используется образ из кеша.
А также это значит, что если вы решите поменять команду например run apt-get install nginx на другую, то Хеш(ID) инструкции изменится и весь дальнейший кеш после этого использоваться не будет. Потому не удивляйтесь если после изменения одной буквы в имени maintainer’а у вас вся сборка будет пересобираться от самого начала.
Также исходя из описанного сценария выполнения команд становится понятно, почему не имеет смысла в инструкциях выполнять команды ничего не сохраняющие после своего выполнения – частый вопрос на stackoverflow — “я запустил что-то, а в следующей инструкции оно не запущено”. Например кто-то хочет активировать source env/bin/activate и в следующей инструкции выполнить pip install
или другой пример – запустить монгодб и в следующей инструкции создать юзера/базу или выполнить импорт базы из файла (есть причины почему лучше так не делать, но сейчас не об этом)
RUN source /app/env/bin/activate \
&& pip install something
Думаю для начала работы этой теории вполне достаточно.
2. Практика
Перед началом думаю следует пойти немного передохнуть и сделать себе чайку.
А когда вернетесь, сначала установите себе Docker и Docker Compose.
Небольшое отступление для тех, кто читает это под виндой.
Итак, на данном этапе у вас уже установлен докер, и в панели задач радостно побулькивает блоками #синийкит (извините, не удержался). Теперь сходите вот по этой ссылке и пройдите туториал Get Started.
Теперь давайте представим, что мы разрабатываем веб сайт на php и будем его публиковать связкой nginx+php7-fpm+mysql.
Вот очень примитивный dockerfile для php сервиса:
EXPOSE 9000
CMD [«php-fpm»]
Вкратце человеческим языком:
В случае с nginx и mysql нам даже не нужно писать свои dockerfile, так как никаких дополнительных расширений нам ставить не нужно. Вот как будет выглядеть docker-compose.yml нашего проекта
Директива volumes монтирует папки из хостмашины внурть контейнера, таким образом осуществляется конфигурирование nginx и сохранение данных бд при перезапуске.
Директива links связывает сервисы между собой, app связан с db, это значит что после запуска внутри контейнера app будет доступен хост “db”, и он будет указывать на соответствующий контейнер.
Есть довольно интересный темплейт yii2-starter-kit, в коробке которого можно найти неплохую реализацию описанной сборки php7-fpm nginx mysql а также mailcatcher.
Тем кому, как и мне, больше по душе python и django можно вообще не париться и все сделать по официальному туториалу от Docker — docs.docker.com/compose/django
плюс, после того как уже пришло понимание как это все работает, не составит особого труда переработать любую понравившуюся сборку под свои нужды.
Pitfalls
— MacOS. Доступ к сервису на хосте (к примеру mongo или mysql) из контейнера.
Из-за ограничений “Docker for Mac networking stack” нельзя “просто так взять и подключиться” к локалхост. Но есть два обходных пути:
а) официальный и простой (доступен в версии Docker начиная с 17.06) — использовать для подключения специальный DNS хост (доступно только в Docker for Mac) docker.for.mac.localhost. Источник.
б) добавить алиас IP к сетевому устройству lo0:
`sudo ifconfig lo0 alias 10.200.10.1/24`
и использовать этот адрес для подключения
— MongoDB. На маке нельзя монтировать внешний диск для данных. Причины описаны здесь
WARNING (Windows & OS X): The default Docker setup on Windows and OS X uses a VirtualBox VM to host the Docker daemon. Unfortunately, the mechanism VirtualBox uses to share folders between the host system and the Docker container is not compatible with the memory mapped files used by MongoDB
— Под Windows не работают симлинки в примонтированных томах. Ожидаемо, но очень неприятно узнавать об этом уже после того как все остальное заработало.
— Отличия entrypoint и command — вот тут подробно и понятно описана разница между entrypoint и command.
— UPD дополнение от saskasa: На маке скорость записи из контейнера на диск хоста (добавленный как VOLUME) очень медленная, для понимания масштабов — примерно в 50-100 раз.
Докер
Гру́зчик — это профессия, в которой используется преимущественно только мускульная физическая сила человека для выполнения простых рабочих операций: погрузки, выгрузки, кантования, перекатывания и подъема тяжелых (большой массы или размеров) грузов. В ряде случаев также используются приспособления для облегчения тяжелого физического труда. Название профессии происходит от слова груз (тяжесть). Профессия грузчика чрезвычайно широко распространена по всем странам и континентам, и в мире трудятся десятки миллионов грузчиков.
Содержание
Рабочие функции грузчиков
Ошибкой было бы считать что грузчику нет необходимости в какой бы то ни было квалификиции, так как в современном мире грузчик обязан быть не только сильным и выносливым, но и обладать водительскими навыками управления погрузочной техникой (автокар, электрокар, механизированный погрузчик), навыками крановщика (тельфер, ручная лебедка, и др). Ложное мнение о низком интеллекте грузчика также ошибочно, поскольку грузчику приходится тщательно рассчитывать не только силу, но и различные способы закрепления грузов и др. Профессиональный грузчик — это специалист, способный быстро оценить наиболее оптимальный алгоритм действий при погрузочно-разгрузочных работах и обеспечить максимальную безопасность выполняемого объема работы.
Инструмент, приспособления, и спецодежда используемые грузчиками
В зависимости от программы разгрузочно-погрузочных работ грузчики используют следующие инструменты и оборудование:
Требования к профессии грузчика
Основными требованиями к профессии грузчика являются:
Применение труда грузчиков
Профессия грузчика широко применяется и востребована с древнейших времен и до наших дней. Распространена во всех без исключения странах на всех континентах.
Объекты, на которых применяется труд грузчиков наиболее широко:
Профессиональные заболевания и травмы
Профессия грузчика сопряжена с постоянной мышечной работой. Кроме того в работе грузчиков часты тяжелые психологические нагрузки, всевозможные травмы. Необходимое регулярное питание, ежегодный отпуск, и медицинский контроль в значительной степени позволяют поддержать и сохранить здоровье грузчиков. Основные риски для здоровья:
Профессия грузчика в кинематографе, литературе и жизни известных политиков
Профессия грузчика отражена в ряде кинофильмов советского кино, литературных произведениях и песнях и стихотворениях. Одесские грузчики, например, были широко известны в России тем, что были объединены в профессиональный союз и отстаивали свои интересы. Кроме того, из рядов грузчиков вышло немало революционеров, спортсменов и политиков. Например президент Чехословакии В. Гавел до начала своей политической карьеры много работал именно грузчиком[1], грузчиком работал и президент Кыргызстана К.Бакиев[2] и многие другие известные в мире люди.
Профессиональная нормативная лексика
Литература
Полезное
Смотреть что такое «Докер» в других словарях:
докер — портовый рабочий, береговой рабочий, грузчик Словарь русских синонимов. докер см. грузчик Словарь синонимов русского языка. Практический справочник. М.: Русский язык. З. Е. Александрова. 2011 … Словарь синонимов
ДОКЕР — (англ. docker) портовый грузчик, рабочий в порту … Большой Энциклопедический словарь
ДОКЕР — ДОКЕР, докера, муж. (англ. docker). Рабочий на доках и судостроительных верфях. Забастовка английских докеров. Толковый словарь Ушакова. Д.Н. Ушаков. 1935 1940 … Толковый словарь Ушакова
ДОКЕР — ДОКЕР, а, муж. Портовый рабочий. | прил. докерский, ая, ое. Толковый словарь Ожегова. С.И. Ожегов, Н.Ю. Шведова. 1949 1992 … Толковый словарь Ожегова
ДОКЕР — «ДОКЕР», СССР, ЛЕНФИЛЬМ, 1973, ч/б, 74 мин. Киноповесть. По одноименному роману Г. Холопова. Герою фильма семнадцать. Он, как и большинствоего сверстников, мечтает о подвиге и славе. Первые трудностии помощь тех, кого он узнал и полюбил на первой … Энциклопедия кино
докер — докер, мн. докеры, род. докеров (неправильно докера, докеров) … Словарь трудностей произношения и ударения в современном русском языке
ДОКЕР — а; м. [англ. docker] Портовый грузчик, рабочий в доках, на верфях. ◁ Докерский, ая, ое. * * * ДОКЕР ДОКЕР (англ. docker), портовый грузчик, рабочий в порту … Энциклопедический словарь
Докер — м. Рабочий дока [док I 1.]; портовый грузчик. Толковый словарь Ефремовой. Т. Ф. Ефремова. 2000 … Современный толковый словарь русского языка Ефремовой
докер — докер, докеры, докера, докеров, докеру, докерам, докера, докеров, докером, докерами, докере, докерах (Источник: «Полная акцентуированная парадигма по А. А. Зализняку») … Формы слов