Docker desktop яндекс практикум как
Перейти к содержимому

Docker desktop яндекс практикум как

  • автор:

Docker desktop яндекс практикум как

Docker: что это и как используется в разработке

На дворе закат 2022-го, и большая часть IT-индустрии только и делает, что работает с контейнерами. Откуда они появились, как добились глобального признания и при чём тут Docker? Расскажет разработчица в команде инфраструктуры Яндекса, действующий автор курса «DevOps для эксплуатации и разработки» Дарья Меленцова.

Дарья Меленцова

Из этой статьи вы узнаете:

  • что такое Docker и его главные возможности;
  • почему Docker стал де-факто современной индустрией программного обеспечения;
  • как создавать и развёртывать Docker-контейнеры.

Начнём с основ

Что такое Docker

Разработчики Docker дают ему такое определение: «Docker helps developers bring their ideas to life by conquering the complexity of app development», что можно перевести как «Docker помогает разработчикам воплощать свои идеи в жизнь, преодолевая сложность разработки приложений». Звучит многообещающе, не правда ли?

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

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

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

Что такое контейнер

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

  1. Все серверы настраивались вручную (или почти вручную). Подключение сервера, установка ОС, настройка правильного окружения, сети и других параметров занимали много времени.
  2. Были проблемы с гибким масштабированием. Представьте, что у вас на сервере развёрнут интернет-магазин. В обычное время приложение справляется с потоком пользователей, но в канун Нового года аудитория возрастает, ведь все хотят закупиться подарками. И тут оказывается, что интернет-магазин не справляется с нагрузкой и надо либо добавить ресурсы на сервер, либо поднять ещё несколько экземпляров сервиса. Да, мы можем заранее подумать о празднике и предвидеть наплыв покупателей, но что делать с теми ресурсами, которые будут простаивать после Нового года?
  3. Требовалось эффективнее использовать ресурсы. Если на большом и мощном физическом сервере разместить какое-нибудь скромное приложение, которому нужно от силы 20% всех мощностей, что делать с остальным запасом? Может быть, подселить к этому приложению ещё одно или несколько? Казалось бы, вариант, пока вы не узнаете, что для работы приложений нужны разные версии одного и того же пакета.

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

Виртуализация — технология, которая позволяет создавать виртуальное представление ресурсов отдельно от аппаратных. Например, под операционную систему (далее — ОС) можно отдать не весь диск, а только часть, создав его виртуальное представление.

Есть много разных видов виртуализации, и один из них — аппаратная виртуализация.

Схема аппаратной виртуализации

Идея в том, чтобы взять сервер и разделить его на кусочки. Допустим, у вас есть сервер, на котором установлена хостовая ОС, и внутри неё запускаются виртуальные машины (далее — ВМ) с гостевыми ОС. Между хостовой ОС и ВМ есть прослойка — гипервизор, который управляет разделением ресурсов, а также изоляцией гостевых ОС.

У аппаратной виртуализации есть большой плюс: внутри ВМ можно запускать абсолютно разные ОС, отличные от хостовой, но ценой дополнительных расходов на гипервизор.

Казалось бы, проблемы с утилизацией ресурсов и изоляцией приложений решены, но как быть с установкой ОС и настройкой окружения: всё ещё делаем вручную и на каждой ВМ? Да и зачем платить за гипервизор, если не нужно держать на одном сервере Windows и Linux — достаточно ядра хостовой ОС?

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

Схема контейнерной виртуализации

Контейнер — это изолированный процесс, который использует основное ядро ОС. Работа с контейнерами помогает решить следующие проблемы:

  • утилизации ресурсов (на одном сервере можно запустить несколько контейнеров);
  • изоляции приложений;
  • установки ОС (по сути, мы используем хостовую ОС);
  • настройки окружения для приложения (можно один раз настроить окружение и быстро клонировать его между контейнерами).
Почему контейнеры и Docker

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

Все механизмы для создания контейнеров заложены в ядро Linux, но на практике обычно используют готовые среды выполнения вроде Docker, containerd и cri-o, которые помогают автоматизировать развёртывание и управление контейнерами.

  • Короткий жизненный цикл. Любой контейнер можно остановить, перезапустить или удалить. Данные, которые содержатся в контейнере, тоже пропадут. Поэтому при проектировании приложений, которые подходят для контейнеризации, используют правило: не хранить важные данные в контейнере. Такой подход проектирования называют Stateless.
  • Контейнеры маленькие и лёгкие, их объём измеряется в мегабайтах. Так получается, потому что в контейнер упаковывают лишь те процессы и зависимости ОС, которые необходимы для приложения. Легковесные контейнеры занимают мало места на диске и быстро запускаются.
  • Контейнеризация обеспечивает изоляцию процессов. Приложения, которые работают внутри контейнера, не имеют доступа к основной ОС.
  • Благодаря контейнерам можно перейти с монолита на микросервиснуюархитектуру.
  • Не нужно тратиться на гипервизор, и можно запустить больше контейнеров, чем ВМ на одних и тех же ресурсах.
  • Контейнеры хранятся в специальных репозиториях, и каждый контейнер содержит всё необходимое окружение для запуска приложения, благодаря чему можно автоматизировать развёртывание приложения на разных хостах.

Теперь обсудим, какие преимущества даёт Docker.

  • Сообщество. Существует огромное хранилище контейнеров с открытым исходным кодом, и вы можете скачать готовый образ для конкретной задачи.
  • Гибкость. Docker позволяет создавать базовые шаблоны контейнеров (image) и использовать их повторно на различных хостах. Docker-контейнеры можно легко запустить как на локальном устройстве, так и в любой облачной инфраструктуре.
  • Скорость развёртывания. Шаблон контейнера содержит всё необходимое окружение и настройки для работы приложения, нам не нужно настраивать всё это каждый раз с нуля.
  • Нет проблемы с зависимостями и версиями пакетов. Docker позволяет упаковывать различные языки программирования и стек технологий в контейнер, чем избавляет от проблемы несовместимости разных библиотек и технологий в рамках одного хоста.

Благодаря каким механизмам работает Docker

Как вы уже знаете, в ядре Linux из коробки есть все необходимые механизмы для создания контейнеров:

  • capabilities — позволяет выдать процессу часть расширенных прав, которые доступны только root . Например, разрешить удалять чужие файлы, завершать другие процессы (команда kill ) или изменять атрибуты у файлов (команда chown );
  • namespace — это абстракция в Linux, с помощью которой можно создавать своё изолированное окружение в ОС. То есть такую коробочку, в которой свои пользователи, своя сеть, свои процессы и всё остальное. При этом изменения в namespace видны только членам этого namespace. Есть шесть типов пространств имён (namespaces): IPC, Network, Mount, PID, User, UTS.
  • Network namespace отвечает за ресурсы, связанные с сетью. У каждого namespace будут свои сетевые интерфейсы, свои таблицы маршрутизации.
  • User namespace специализируется на пользователях и группах в рамках namespace.
  • PID namespace заведует набором ID процессов. Первый процесс, созданный в новом namespace, имеет PID = 1 , а дочерним процессам назначаются следующие PID.
  • cgroup объединяет несколько процессов в группу и управляет ресурсами для этой группы.

Традиционно лимиты в Linux можно задавать для одного процесса, и это неудобно: вы могли задать какому-то процессу не больше n мегабайт памяти, но как указывать лимиты на приложение, если у него больше одного процесса? Поэтому появились cgroups , позволяющие объединить процессы в группу и навесить на неё лимиты.

Давайте разберёмся, как Docker создаёт контейнер из capabilities, namespace и cgroup.

Docker — это очень тонкая прослойка вокруг ядра. Он создаёт контейнер на основе docker image c заданными настройками. Когда вы попросите Docker создать контейнер, он автоматически создаст набор namespaces и cgroup для этого контейнера.

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

Network namespace — контейнер получит свой сетевой стек, а значит, он не сможет получить доступ к сокетам или сетевым интерфейсам другого контейнера.

Аналогичная история со всеми остальными пространствами имён — для каждого контейнера своё дерево каталогов, хостнеймы и прочее.

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

По умолчанию Docker при создании контейнера урезает все capabilites внутри него, оставляя только часть возможностей — смену атрибутов UID и GID ( chown ), kill , chroot и несколько других. Это сделано в целях безопасности, чтобы злоумышленнику не достались все root-права, если бы он смог выбраться из контейнера.

Терминология

Прежде чем начать работу с Docker, нужно изучить несколько терминов.

Устройство архитектуры Docker

Docker Image

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

В практической части вы будете использовать команду docker pull , чтобы загрузить busybox image из специального хранилища Docker образов — docker hub.

Docker Container

Контейнер — это исполняемый экземпляр образа (image). Его можно создавать, запускать, останавливать и удалять. Также можно подключать к контейнеру хранилище, объединять контейнеры одной или несколькими сетями и общаться с контейнерами, используя Docker API или CLI.

Увидеть список запущенных контейнеров можно через команду docker ps .

Docker Daemon

Docker-демон (dockerd) — фоновый процесс в операционной системе, который обрабатывает запросы Docker API и управляет объектами Docker: образами, контейнерами, сетями и томами.

Docker Client

Docker-клиент — инструмент командной строки (Comand Line Interface — CLI), через который пользователь взаимодействует с демоном.

Когда вы используете команду docker run , то Docker-клиент отправляет команду dockerd. Аналогичная история с другими командами docker <команда> .

Docker Hub

Docker Hub — это общедоступный Docker registry, то есть хранилище всех доступных Docker-образов. При необходимости можно разворачивать свои приватные Docker registry, размещать собственные реестры Docker и использовать их для извлечения образов.

Запуск и начальная настройка Docker

Для работы потребуются:

  • базовые навыки работы с командной строкой;
  • Git;
  • Docker.

Docker — довольно популярный инструмент, и установить его на любую ОС не составит труда. В руководстве «Начало работы с Docker» есть подробные инструкции по настройке Docker на Mac, Linux и Windows.

После установки Docker стоит проверить, что он работает.

Для этого выполните:

Запускаем Busybox

Теперь, когда Docker установлен, запустим в нём первый контейнер. За основу контейнера возьмите Busybox image. Введите в терминале команду:

$ docker pull busybox

Примечание Вы можете увидеть ошибку permission denied после выполнения команды. Если вы работаете на Mac, убедитесь, что ядро Docker (engine) запущено. Если вы работаете в Linux, добавьте к командам docker префикс sudo . Кроме того, вы можете создать docker group, чтобы избавиться от этой проблемы.

Команда pull скачает (спулит) busybox image из Docker registry и сохранит его в вашей системе.

Чтобы увидеть список всех образов в вашей системе, используйте команду docker images :

Docker Run

Отлично! Давайте теперь запустим Docker-контейнер на основе этого образа. Используйте команду docker run :

Пусть вас не смущает, что ничего не произошло. Ошибки здесь нет, и всё идёт по плану. Когда вы вызываете run , Docker-клиент находит образ (в нашем случае busybox), загружает контейнер и запускает в нём команду.

Когда вы запустили docker run busybox , то не передали команду, поэтому контейнер загрузился, выполнил ничего и затем вышел.

Давайте передадим команду и посмотрим, что будет:

Ура, хоть какой-то результат! Docker клиент выполнил команду echo в busybox-контейнере, а затем вышел из него. И всё это произошло довольно быстро.

Хорошо, контейнер вы запустили, а как посмотреть, какие контейнеры запущены на сервере прямо сейчас? Для этого есть команда docker ps :

Сейчас нет запущенных контейнеров, и вы видите пустую строку. Попробуйте более полезный вариант — docker ps -a :

Появился список всех контейнеров, которые вы запускали. Заметьте, столбец STATUS показывает, что эти контейнеры были закрыты несколько минут назад.

Итак, вы запустили контейнер, выполнили одну команду, и контейнер завершился. Какой в этом смысл? Может быть, есть способ запускать больше одной команды?

Конечно, есть! Давайте выполним docker run -it busybox sh :

run с флагами -it подключит вас к интерактивному терминалу в контейнере. Теперь можно запускать в контейнере столько команд, сколько захотите.

Попробуйте выполнить ваши любимые команды в контейнере. А ещё стоит потратить немного времени на изучение возможностей команды run , так как именно её вы будете использовать чаще всего.

Чтобы увидеть список всех флагов, которые поддерживает run , выполните docker run —help .

Docker rm

Раз вы научились создавать контейнеры, нужно потренироваться их удалять. Вы сами видели, что даже после остановки контейнера информация о нём остаётся на хосте. Можно запускать docker run несколько раз и получать бесхозные контейнеры, которые будут занимать место на диске.

Место на диске нерезиновое, поэтому надо прибираться и удалять ненужные контейнеры. В этом поможет команда docker rm :

Если на хосте много контейнеров, которые надо удалить, то придётся копировать много CONTAINER ID , а это может быть утомительно. Чтобы облегчить себе жизнь, можно использовать docker container prune :

Команда удалит все остановленные контейнеры.

Чтобы удалить образы, которые больше не нужны, запустите docker image prune .

Развёртывание веб-приложения

Static-site

Итак, вы рассмотрели запуск docker и поиграли с контейнером. Настало время перейти к более реальным вещам и развернуть веб-приложение с помощью Docker.

Первым делом запустите очень простой статический сайт. Для этого заберите Docker-образ из Docker Hub, запустите его и проверьте, что у вас есть рабочий веб-сервер.

Образ, который вы будете использовать, — одностраничный веб-сайт, специально созданный для демонстрации и размещённый в registry — ifireice/static-site .

Вы можете загрузить и запустить образ сразу, используя docker run , флаг —rm автоматически удалит контейнер при выходе из него, а флаг -it запустит интерактивный терминал, из которого можно выйти с помощью Ctrl+C. Контейнер при этом будет уничтожен.

Так как образа ещё нет на хосте, Docker-клиент сначала скачает образ с registry, а потом запустит его. Если всё пойдёт по сценарию, вы должны увидеть сообщение Nginx is running. в терминале.

Сервер запущен, но как увидеть сайт? На каком порту работает сайт? Как получить доступ к контейнеру?

Клиент не предоставляет никаких портов, поэтому вам нужно повторно запустить docker run и опубликовать порты. Нажмите Ctrl+C, чтобы остановить контейнер.

Также вам надо сделать так, чтобы работающий контейнер не был привязан к терминалу. Это нужно для того, чтобы после закрытия терминала контейнер продолжил работать, — принцип действия detached mode:

  • -d — отсоединить терминал,
  • -P — опубликовать все открытые порты на случайные порты,
  • —name — задать имя контейнеру.

Теперь вы можете увидеть порты, запустив команду docker port [CONTAINER] :

Откройте http://localhost:55000 в браузере. Также можно указать собственный порт, на который Docker-клиент будет перенаправлять подключения к контейнеру.

«Hello Docker!» в localhost

Если вы устали писать «Hello world!», самое время перейти на «Hello Docker!»

Чтобы остановить контейнер, запустите docker stop , указав идентификатор контейнера. В этом случае можно использовать имя static-site , которое вы задали контейнеру при запуске.

Чтобы развернуть этот же сайт на удалённом сервере, вам нужно установить Docker и запустить указанную выше команду.

Создание Docker Image

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

Помните команду docker images , которая выводит список образов, располагающихся локально?

Перед вами список образов, скачанных из registry, а также образы, которые созданы нами:

  • TAG — относится к конкретному снимку изображения;
  • IMAGE ID — уникальный идентификатор этого image.

Образы могут быть зафиксированы с изменениями и иметь несколько версий. Если вы не укажете конкретный номер версии, по умолчанию для клиента будет установлена последняя — latest . Например, вы можете вытащить конкретную версию образа ubuntu :

Новый образ можно или скачать из registry, или создать собственный.

Первый image

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

Теперь это приложение нужно упаковать в image. Здесь пригодятся определения про образы.

  • Базовые образы — это образы, у которых нет родительского образа. Обычно это образы ОС — ubuntu, busybox или debian;
  • Дочерние образы — это образы, созданные на основе базовых образов с дополнительной функциональностью.

Также есть такие понятия, как официальный и пользовательский образы.

  • Официальные образы поддерживаются Docker-сообществом. Обычно их имя состоит из одного слова, например, python, ubuntu, busybox и hello-world.
  • Пользовательские образы созданы пользователями. Они строятся на основе базового и содержат дополнительную функциональность. Только поддерживаются уже не сообществом, а пользователем, который его создал. Имя у таких образов обычно имеет вид имя пользователя/изображения.

Вы будете создавать пользовательский образ, основанный на Python, потому что используете приложение на Django. Также вам понадобится Dockerfile.

Dockerfile

Dockerfile — это простой текстовый файл со списком команд, которые Docker-клиент вызывает при создании образа. Команды почти как в Linux, а значит, не нужно изучать ещё один язык для создания Dockerfile.

В директории приложения уже есть Dockerfile , но вы будете создавать его с нуля. Поэтому переименуйте его и создайте пустой файл с именем Dockerfile в директории Django-приложения.

Начните с определения базового image. Для этого используйте ключевое слово FROM :

Потом задайте рабочую директорию и скопируйте все файлы приложения:

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

Добавьте порт, который нужно открыть. Приложение работает на порту 5000, его и укажите:

Последний шаг — написать очень простую команду для запуска приложения: python ./manage.py runserver 0.0.0.0:5000 . Для этого используйте команду CMD . Она говорит, какую команду должен запустить контейнер при старте.

Теперь ваш Dockerfile готов и выглядит вот так:

Раз у вас есть Dockerfile , нужно собрать образ. Для этого используйте docker build и передайте необязательный флаг -t — имя тега и расположение каталога, содержащего Dockerfile .

Чтобы сохранить (запушить) готовый image на Docker Hub, нужно создать там учётную запись. Сохранитесь, чтобы потом вы могли получить образ и развернуть контейнер на его основе на любом сервере.

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

Если на локальной машине нет образа python:3.8 , Docker-клиент сначала скачает образ, а затем создаст ваш. Тогда вывод команды может отличаться.

Если всё прошло хорошо, то image готов! Запустите его, не забыв изменить yourusername на правильный:

Команда взяла порт 5000 внутри контейнера и сопоставила его с портом 8888 на хосте. И теперь, если вы обратитесь на порт 8888 хостовой машины, запрос будет перенаправлен в контейнер на порт 5000 . Узнать, что вернёт приложение на запрос, можно с помощью пути: http://0.0.0.0:8888 .

Docker-образ кота

Поздравляем! Вы успешно создали свой первый Docker-образ.

Docker push

Осталось дело за малым — сохранить ваш образ в registry. Сначала авторизуйтесь в Docker Hub? Не забудьте про логин из yourusername .

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

Чтобы сохранить образ в registry, просто введите docker push yourusername/cats . Важно, чтобы тег имел формат yourusername/image_name . Тогда Docker-клиент будет знать, куда сохранять образ:

Гайд по Docker: что это такое, зачем его использовать и как с ним работать

Гайд по Docker: что это такое, зачем его использовать и как с ним работать главное изображение

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

Разработчик узнаёт, что сайт компании работает с помощью веб-сервера Nginx, менеджера процессов PHP-FPM и системы управления базами данных Postgres. Теперь программист ищет нужную страницу. Поиск выглядит так:

  1. Разработчик вводит в браузере адрес сайта
  2. Браузер запрашивает HTML-страницу с котиками по указанному адресу
  3. HTTP-сервер Nginx принимает запрос и делегирует создание страницы PHP-FPM
  4. PHP-FPM запрашивает данные о котиках из базы Postgres, строит HTML-страницу и отдает обратно его серверу Nginx, а тот — клиенту-браузеру
  5. Разработчик видит страницу с котиками.

Свое первое задание разработчик выполняет на компьютере тимлида, где уже установлен Nginx, PHP-FPM и Postgres. На следующий день ему выдают новый компьютер, на котором этих программ нет.

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

  • Устанавливает Nginx
  • Устанавливает PHP-FPM и все нужные расширения
  • Настраивает совместную работу Nginx и PHP-FPM
  • Устанавливает Postgres, создает пользователей, нужные базы и схемы.

Установка идет долго: приходится ждать, пока сначала установится одна программа, потом другая. Сложности добавляет и то, что вся его команда работает над проектом на разных операционных системах: одни на macOS, а другие на Ubuntu или Windows.

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

Что такое Docker

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

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

Простыми словами контейнер — это некая изолированная песочница для запуска ваших приложений.

На картинке видно, что приложение 1 и приложение 2 изолированы как друг от друга, так и от операционной системы.

Что еще может делать Docker:

  • Управлять изолированными приложениями
  • Ускорять и автоматизировать развертывание приложений
  • Доставлять приложения до серверов
  • Масштабировать приложения
  • Запускать на одном компьютере разные версии одной программы.

Как работает Docker

Концепцию программы легче понять на практике. Сначала установим на компьютер Docker и запустим HTTP-сервер Nginx. Для этого введем следующую команду:

docker run -p 8080:80 nginx:latest

Далее откроем браузер и забьем в адресную строку: 127.0.0.1:8080 . Откроется страница приветствия Nginx.

Теперь разберемся подробнее, что происходит, когда мы вводим команду docker run -p 8080:80 nginx:latest . Она выполняет следующее:

  1. Скачивает docker-образ — шаблон для создания Docker-контейнера — nginx:latest из публичного репозитория Docker Hub (если его не скачивали ранее). Docker-образ содержит все необходимое для запуска приложения: код, среду выполнения, библиотеки, переменные окружения и файлы конфигурации. На странице Nginx в Docker Hub можно найти Docker-образ nginx:latest, где latest — это тег (метка, снимок), который ссылается на самый свежий docker-образ и описывает его.
  2. Запускает Docker-контейнер с помощью Docker-образа
  3. Пробрасывает порт. Ранее мы объясняли, что процессы в Docker-контейнерах запускаются в изоляции от ОС, то есть все порты между ОС и Docker-контейнером закрыты. Для того, чтобы мы смогли обратиться к Nginx, нужно пробросить порт, что и делает опция -p 8080:80 , где 80 — это порт Nginx внутри контейнера, а 8080 — порт в локальной сети ОС.

Как создать свой Docker-образ

Теперь попробуем создать свой Docker-образ, взяв за основу nginx:latest . Docker умеет создавать Docker-образ, читая текстовые команды, которые записаны в файл Dockerfile.

Вот пример простейшего Dockerfile:

Команда FROM задает базовый (родительский) Docker-образ и всегда вызывается в первую очередь. Команда COPY копирует файлы в Docker-контейнер.

С помощью COPY можно заменить стандартную велком-страницу Nginx на такую страницу:

Узнать подробнее об этих и других командах Docker можно в официальной документации.

Теперь, когда мы разобрались, за что отвечают команды, создадим Docker-образ из Dockerfile:

Поясним, какие команды мы использовали в этом коде:

  • -t nginx_custom:latest — это имя будущего Docker-образа, latest — это тег
  • -f /opt/src/docker-for-kids/dockerFiles/Nginx-custom/Dockerfile — путь до Dockerfile
  • /opt/src/docker-for-kids — директория, в контексте которой будет создан Docker-образ. Контекст — это все то, что доступно для команд из Dockerfile при сборке (билде) образа. Процесс создания Docker-образа может ссылаться на любой из файлов в контексте.

Теперь запускаем команду:

$ docker run -p 8080:80 Nginx_custom:latest

Что такое Docker Compose и как он работает

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

Работу облегчает Docker Compose — это инструмент для описания многоконтейнерных приложений. С его помощью можно собрать один файл, в котором наглядно описываются все контейнеры. Еще Docker Compose позволяет собирать, останавливать и запускать файлы одной командой.

Для описания приложений используется YAML-файл.

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

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

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

  1. network . Как мы объяснили ранее, каждое приложение в Docker-контейнере находится в изоляции. networks объединяет все Docker-контейнеры в одну сеть с именем test-network, и это позволяет обращаться к нужному контейнеру по его имени.
  2. volumes — это механизм для хранения данных вне Docker-контейнера, то есть в файловой системе нашей ОС. volumes решает проблему совместного использования файлов.

Все примеры, а также исходники Dockerfile можно взять из репозитория на GitHub.

Как создать простое веб-приложение с помощью Docker

Создадим простое веб-приложение, которое покажет нам сообщение об успешном подключении к базе данных. Вместо адреса базы данных используем host=postgres , такое же имя cервиса, как и в YAML-файле. Напомню, что эта возможность появилась благодаря общей сети test-network.

PDO — это интерфейс для доступа к базам данных в PHP. Подробнее об этом можно узнать в официальной документации.

Теперь, чтобы создать все Docker-образы и запустить Docker-контейнеры нужно выполнить:

Выполняем index.php и видим успешное соединение с базой данных.

Веб-приложение для самостоятельного запуска можно найти в репозитории на GitHub.

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

Изучите основы Docker: На Хекслете есть курс по основам Docker. Пройдите его, чтобы подробнее узнать об этой программе, научиться работать с образами, управлять контейнерами и получить поддержку от менторов и единомышленников.

Яндекс Практикум

Стоит ли тратить время на их курсы? Кто-то может поделиться опытом?

У меня сейчас последний месяц обучения на аналитика, и оно тех денег точно не стоит. Тренажёр хуже чем на бесплатном степике, сам курс не обновлялся с 19го года, если ревью первых проектов был не плохим, то последних довольно печальный, у ревьюеров явно не хватает квалификации, и они все подгоняют под один ответ, не давая пространства для маневра. Спасает только то что есть неплохие преподы, и я сходил на интервью, что тоже полезно. Ну а по факту, блок по пайтону хуже чем на степике, как и блок по sql.

Что такое степик?

Сайт с большим количеством курсов. Stepik.org

Странно. Я проходил курс на аналитика в 2020 году и с этого момента в курс добавили доп.блок по теории вероятностей и диагностику базовой математики. По ревью, в некоторых моментах соглашусь, только у меня было так, что первые и последние ревью были прям отличными, а в середине с просадкой.
Из минусов — мне не хватило материалов по той же статистике (у Карпова на Степике разобрано все куда лучше) и по SQL (на том же Степике есть интерактивный тренажер).
Кстати, а почему ты выбрал не karpov.courses для изучения аналитики? Если ты был на Степике, наверняка же курсы по мат.стату проходил.

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

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

Я проходил курс по плюсам. Вполне понравился. Но я его рассматривал как дополнение к образованию в ВУЗе и самостоятельному обучению.

Я училась на дизайне интерфейсов. И если вкратце — потраченное время на обучение и деньги того стоят. Я сменила работу�� даже не просто работу, а в целом, сферу) а новая зарплата почти сразу откупила стоимость курса��

Я в Практикуме заканчивала 2 курса: джун-питонист (после него сменила сферу и ушла из юристов в программисты) и следом взяла джун-фронтендер (веб-разработчик) уже для себя, расширения кругозора и понимания полного цикла разработки. Поэтому отзывы могу дать только по ним.
Из плюсов главных на мой взгляд:
И там, и там — стек дают максимально актуальный (не только программирование, но и работу с гитом или например деплой (докер, CICD, в случае с бэкендерскими курсами)). Программа в процессе обновляется, после выпуска у тебя остается доступ и соответственно к новым блокам тоже доступ есть.
Процесс работы над проектами (ревью, сами проекты, тз) максимально похож на реальную работу.
Из минусов, а точнее из жестокой правды: учиться придется самому) нет, "само" оно все не выучится, нагрузка оч высокая, но даже без технического бэкграунда подъемная, просто надо на старте понимать что тебе оно действительно надо и ты готов свою жизнь перестроить и время на курсы выкроить не по остаточному принципу, а в приоритетном порядке.
Ну и многие пишут про баги в тренажере: в принципе работа в тренажере это даже не 50% от курса, но баги случаются, да, и искать что не так бесит, но честно говоря в работе искать баг бесит куда больше, а там нет поддержки, которая пойдет и этот баг починит. Так что я к ним относилась как неизбежному злу в работе в принципе.
Веб/Питон при этом отличаются социально (сугубо имхо): на питонячьих курсах у нас сложилось комьюнити, много помогали друг другу с учебой, делились разными материалами и тп, после выпуска продолжаем общаться, в общем социальный нетворкинг и все дела, было вот это ощущение какой-то студенческой тусовки. На вебе такого не было, что на качество учебы в принципе не влияет.

Иди на хекслет. За подписку. Профессию не покупай

Просто есть возможность с большим дисконтом опробовать их курс. Так то очевидно, что профессию не купишь

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

И встрянет уже на втором проекте, без ментора там делать нечего.

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

Я в данный момент в ЯП учусь на Python-разработчика

Никаких видео-материалов, все подается через текст. Это я считаю плюс, потому что так информация лучше усваивается.

Есть вебинары раз в 1-2 недели по пройденной теме, где можно позадавать вопросы. Или накануне попросить чтоб разобрали подробно непонятный момент из теории. Вебинары могут быть и малоинформативными, в завивисмости от наставника.

График довольно жесткий. Две недели на изучение теории и сдачу проекта(постепенная доработка большого проекта).

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

Я вот сечас на грани завала жесткого дедлайна.
Короче, мне нравится)

а ну и немного расстроило, что учим Django 2

что-то у меня действительно слишком бодро позитивный отзыв получился. Советую почитать соседние комменты. Они помогут составить полную картину.

Я закончила курс Практикума по тестированию и коренным образом сменила работу в возрасте 50 лет.
Мощные "за":
1. Дадут необходимую базу, пусть самые начала, но это точно хорошая структура знаний, на которые в зависимости от реального рабочего проекта можно наращивать любое дополнительное содержание.
2. Примут в доброжелательное помогающее сообщество, где и куратор, и наставники, и преподаватели, и студенты готовы откликнуться, обсудить, посоветовать пути решения проблем/задач. Выпускники тоже объединяются в сообщество, где обсуждают ситуацию на рынке, делятся советами по дальнейшему продвижению, помогают друг другу и просто болтают о том, о сем.
3. Помогут с трудоустройством. Это одна из важнейших задач Практикума — устроить своих выпускников. Для этого создана программа трудоустройства, которая входит в программу обучения и выглядит точно так же как учебный тренажер платформы. Студенты, кому важно устроиться на работу (а среди студентов есть и уже работающие тестеры, пришедшие лишь прокачать навыки), научаются искать и внимательно читать вакансии, формировать резюме, составлять адекватные отклики, проходить собеседования. В конечном счете, этот курс очень помогает осознать свое место на рынке, свои сильные и слабые стороны, свою стоимость и направления развития.
Если после курса по трудоустройству не удалось найти работу, предлагается курс по акселерации трудоустройства. Желающие попадают в отдельное сообщество, где еженедельно отчитываются о своих успехах в поиске работы (необходимо публиковать цифры: сколько раз откликнулся на вакансии, сколько тестовых заданий сделал, сколько прошел собеседований и сколько получил офферов); участвуют в вебинарах на самые разные темы вроде "Самые токсичные вопросы на собеседованиях"; проходят тренировочные собеседования по хард-и софт-скиллам, поддерживают друг друга и вместе радуются успехам товарищей.
Интересное наблюдение: после такой мощной прокачки, после длинной полосы отказов и самого жестокого уныния, если не опускать руки и продолжать поиски, многие из моих собеседников получали не один, а два и более офферов за раз.
3а. Кроме всего прочего, выпускникам Практикума доступны партнерские вакансии. Практикум имеет сайт для работодателей, где анонсирует своих выпускников в качестве их потенциальных сотрудников. Направляя свое резюме по сокращенному пути таких партнерских каналов, выпускники Практикума получают персонализированный доступ к вниманию hr-ов этих работодателей.

Не менее важные "против":
1. Учиться придется самостоятельно. Да, есть объясняющие вебинары, за помощью можно обращаться практически круглосуточно, но учиться за вас никто не будет. Гуглить придется неизбежно. Смотреть дополнительные материалы — обязательно. То же придется делать и уже устроившись на работу.
2. Прямо на вопросы по конкретной задаче вряд ли ответят. Я сама испытала шок, когда наставница отказалась вникнуть в мою Excel-табличку, но потом, когда разозлилась и со злости прошла весь курс сама, обращаясь с вопросами не к наставникам, а только к соученикам, поняла, что так построено обучение: не давать прямых ответов, но наводить на самостоятельное решение. Поняла в итоге, что такой способ работает лучше всего.
3. На работу за руку не приведут. Поиск работы, даже с учетом всех вышеназванных возможностей, — отдельный труд. Надо быть готовым, что будет много отказов, в том числе немотивированных и несправедливых, что может настать разочарование, а кое-где вам придется услышать негатив не только в свой адрес, но и в адрес вашего диплома. Но важно не опускать руки и упорно лопатить списки вакансий, редактировать свое резюме, строчить сопроводительные письма и оттачивать переговорные навыки на собеседованиях.

Да прикольные курсы, можно же бесплатно проходить.

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

9 мес. Диплом действителен только вместе с основным дипломом об образовании (среднем/высшем).

В чем плюсы такого подхода:
1 Живое общение. Можно найти себе друзей и учиться вместе. (На курсах Яндекса я ни с кем не общался вообще.);
2 Объясняет живой человек (или несколько преподавателей по разным предметам), с которым можно пообщаться до или после уроков;
3 Дешевле;
4 Диплом получишь в любом случае, если твой IQ выше чем у хлебушка;
5 Диплом гос. образца.

В чем минусы:
1 Не знаю, нужен ли работодателю такой диплом или он не котируется;
2 Знания, как и полагается в Российской образовательной системе поверхностные.

Когда стоит брать курсы Яндекса? Если 50-90т.р. за обучение это не последние деньги, которые у тебя есть. Когда ты точно знаешь, что тебе нужно. Когда уверен, что осилишь.

В чем плюсы такого подхода:
1 Реальные знания в выбранной теме.
2 Обещают помочь с трудоустройством (не проверял).

В чем минусы:
1 Не очень много общения с другими людьми. На моем обучающем курсе все обучение сводилось к чтению учебника от Яндекс и решения задач. После спринта был вебинар на 1.5ч с разбором задач на который никто не приходил);
2 Не очень много общения с преподавателями. Общение в основном сводилось к коротким и очень туманным подсказкам в чате, после которых можно было еще долго сидеть в недоумении;
3 Можно не сдюжить и потерять деньги и не получить диплом;
4 Не знаю, нужен ли работодателю такой диплом или он не котируется.

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

Использование Docker для сборки и запуска программ.

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

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

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

Основы использования Docker.

sudo apt install docker.io

Базовая проверка работоспособности docker:

sudo docker run hello-world

В выводе должно оказаться нечто подобное:

Если демон Docker по какой-то причине не запустился, будет показано предупреждение:

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

Запуск можно сделать вручную:

sudo service docker start

Образы.

Образы загружаются из специального хранилища — docker-реестра: https://hub.docker.com/ В нём хранятся публичные и приватные образы. Можно сформировать собственное хранилище образов или экспортировать образ в файл, что позволит поделиться им любым удобным образом.

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

Образы делятся на базовые (Base images) и дочерние (Child images).

Базовые образы — как правило, содержат в себе операционную систему. (Ubuntu, Debian и подобные).

Дочерние образы — зависят от базовых.

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

sudo docker pull <название_образа>

Можно выбрать конкретную версию образа:

sudo docker pull ubuntu:20.04

В данном случае это Ubuntu 20.04.

Поиск образов в реестре. Найти все образы Ubuntu 20.xx:
sudo docker search ubuntu-20

Вывести список всех загруженных образов:

sudo docker images

sudo docker rmi <IMAGE ID>

sudo docker rmi 56def654ec22

Принудительно удалить образ:

sudo docker rmi -f <IMAGE ID>

f — отфильтровать образы или контейнеры по предоставленному условию. В данном случае по ID образа.

Удалить образы, которые не используются ни одним контейнером:

sudo docker image prune -a -f

Контейнеры.

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

Вывести список всех контейнеров:

sudo docker ps -a

Вывести список только запущенных контейнеров:

sudo docker ps —no-trunc

—no-trunc — не обрезать вывод. К примеру, будут полностью отображены ID, вместо их сокращения.

Место хранения контейнеров: /var/lib/docker/

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

docker run —help

Создание и запуск контейнера на примере busybox (комплект консольных утилит):

sudo docker run busybox echo «hello world»

Из реестра (хранилища) hub.docker.com будет загружен образ busybox (если его нет на локальной машине), из образа будет создан контейнер, внутри которого будет запущена утилита echo, которая отправит в вывод строку «hello world».

Запустить ранее созданный контейнер:

sudo docker start <ID>

Остановить работу контейнера:

sudo docker stop <ID>

Подключение к запущенному контейнеру:

sudo docker exec -it <ID> sh

Контейнеры можно удалить по имени и по ID. Команда:

sudo docker rm <ID>

sudo docker rm 791834eb255d

Принудительное удаление запущенного контейнера:

sudo docker rm -f <ID>

Удалить все остановленные контейнеры:

sudo docker container prune -f

Создание и запуск контейнера с желаемым именем (в примере my-busy) с последующим запуском echo, которая выведет строку «hello world»:

sudo docker run —name my-busy busybox echo «hello world»

Создать и запустить контейнер, а затем удалить его по завершению работы (опция —rm).

sudo docker run —rm busybox echo «hello world»

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

Вывести потребляемые контейнером ресурсы:

sudo docker stats <ID>

Dockerfile и создание собственных образов.

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

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

Собственные образы и контейнеры очень удобно применять для сборки программ. Это особенно актуально при использовании дистрибутивов с длительным сроком поддержки (LTS). Ключевым является то, что не придётся смешивать различные зависимости и самосборные пакеты с системными пакетами. Все они будут изолированы в контейнере, что позитивно скажется на безопасности и стабильности системы.

Наполнение Dockerfile.

Пример содержимого Dockerfile:

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

Примечание: Docker рекомендует использовать именно apt-get.

Основные инструкции.

FROM — указать имя базового образа, из которого будет создан собственный образ. Базовый образ будет загружен, если его нет на локальной машине. Dockerfile всегда должен начинаться с FROM.

RUN — выполнить команды в окружении образа. Таким образом можно выполнить команды на установку зависимостей. Пакеты зависимостей будут загружены только в пространство образа, то есть не будут смешиваться с пакетами основной системы.

Команды выполняются последовательно, то есть результат первой порции команд, перечисленных в инструкции RUN, не влияет на команды, перечисленные в следующей RUN. Пример: RUN cd /tmp не будет действовать для RUN ls, то есть ls выведет каталоги корня, а не /tmp.

При выполнении инструкции RUN Docker будет сохранять изменения в файловой системе, накладывая новые изменения поверх старых по слоям. Каждая инструкция RUN создаёт слой. Это используется для ускорения создания образов. Те слои, что не изменились, будут использоваться без повторной обработки.

WORKDIR — создать и/или выбрать рабочий каталог внутри образа, в котором будут выполнены последующие команды, перечисленные в инструкциях RUN и CMD. Особенно полезно при сборке программ.

COPY — копировать указанные файлы и каталоги из каталога контекста сборки в создаваемый образ по пути, указанному в инструкции WORKDIR или напрямую.

ENV — объявить переменную окружения, которая будет использоваться в контейнере.

ENTRYPOINT — запускает указанную программу с желаемыми параметрами при старте контейнера. Команды можно записывать в синтаксисе JSON. Обычно указывается в конце Dockerfile. Пример: ENTRYPOINT [«/bin/sh», «-c»]

CMD — указать команды и аргументы к выполнению при запуске контейнера из созданного образа. Может использоваться только одна инструкция этого типа, остальные будут проигнорированы. Обычно указывается в конце Dockerfile.

Прочие инструкции можно посмотреть в официальной документации: https://docs.docker.com/engine/reference/builder/

Пример создания образа.

Команда на создание образа:

sudo docker build -f </путь/до/Dockerfile> -t <имя_создаваемого_образа> </путь/до/контекста>

-f — используется, чтобы указать путь до конкретного Dockerfile. Без этой опции демон Docker будет искать Dockerfile в каталоге выполнения.

-t — имя (тэг) создаваемого образа. В обычном случае создаётся локальный образ с указанным именем, но можно загрузить создаваемый образ в репозиторий, если указать имя пользователя в реестре hub.docker.com, а затем аутентификационные данные. Пример: docker build -t myuser/myimage .

</путь/до/контекста> — это аргумент, указывающий демону контекст сборки, то есть какие файлы и каталоги использовать для сборки образа. Если не планируется добавлять какие-то конкретные файлы и каталоги, то достаточно указать любой пустой каталог. Sending build context to Docker daemon — процесс упаковки и отправки файлов демону для сборки образа. Образ будет собираться в специальном временном каталоге. Указанные файлы будут скопированы, упакованы (tar-архив) и помещены в специальный каталог для последующей сборки. После сборки скопированные файлы будут удалены, а оригиналы останутся без изменений.

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

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

Альтернативный способ создания образа.

Docker позволяет сохранить изменения, которые были сделаны в контейнере, в отдельный образ. То есть можно настроить содержимое контейнера (установить желаемые пакеты и тому подобное), затем сохранить всё в новый образ, из которого можно будет запускать уже настроенный контейнер.

sudo docker commit <ID_контейнера> <имя_нового_образа>

Пример использования можно найти далее в статье.

Поделиться Docker-образом без использования hub.docker.com.

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

sudo docker save —output <имя_файла_образа> <ID_исходного_образа>

Пример сохранения образа ubuntu в файл-образ с именем my-exp-ubuntu.tar в каталог

sudo docker save —output

/Documents/ my-exp-ubuntu.tar ubuntu

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

sudo docker load —input <имя_файла_образа>

sudo docker load —input

Примеры использования Docker.

Монтирование каталогов в контейнер Docker.

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

/Video/, чтобы обработать его содержимое с помощью ffmpeg, который находится в контейнере.

Использование на примере busybox.

Создать контейнер из образа busybox, примонтировать каталог

/Documents/ к контейнеру, запустить утилиту ls внутри контейнера для смонтированного в него каталога, вывести результат и удалить контейнер:

sudo docker run -v

/Documents/ :/mnt/ —rm busybox ls /mnt/

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

/mnt — обозначает точку монтирования. В примере это

/Documents/. Пример пути: /mnt/каталог/файл, что является аналогичным

—rm — удалить контейнер после завершения его работы.

Использование интерпретатора sh из контейнера.

sudo docker run —rm -it busybox sh

Образ busybox будет загружен из реестра hub.docker.com (если его нет на локальной машине), из образа busybox будет создан контейнер, внутри которого будет запущена утилита sh, после чего станет доступным ввод команд, которые будут выполняться утилитами busybox внутри контейнера. После завершения работы контейнера он будет удалён (опция —rm).

-i — интерактивный режим.

-t — проброс терминала в контейнер.

Благодаря опции -it будет выделен псевдо-tty, работающий в интерактивном режиме, а не только на вывод, что позволит выполнять команды внутри контейнера через терминал. Без опции -it утилита sh будет запущена единожды, отобразится вывод и работа контейнера завершится.

Команда ls покажет набор каталогов от корня внутри контейнера:

Пример перехода в каталог /bin и выполнение команды ls:

На иллюстрации показано всё многообразие утилит из комплекта busybox.

Для завершения работы этого контейнера необходимо ввести exit .

Использование браузера elinks из контейнера.

Ниже рассмотрен пример установки в контейнер текстового браузера elinks и сохранения изменений в образ.

На базе образа ubuntu будет создан контейнер с именем —name my-base-ubuntu:

sudo docker run -it —name my-base-ubuntu ubuntu sh

При этом с помощью опции -it пробрасывается терминал в интерактивной сессии и запускается утилита sh.

Теперь можно выполнять команды непосредственно внутри контейнера.

Установка браузера elinks:

apt-get install elinks

После завершения установки пакетов можно завершить сессию:

Проверяем наличие контейнера в списке контейнеров:

sudo docker ps -a


Всё в порядке.

Теперь предстоит сохранение изменений, которые были сделаны в контейнере (установлены пакеты для браузера elinks), в образ:

sudo docker commit my-base-ubuntu my-ubuntu-elinks

Сначала указывается имя контейнера (можно указать ID), а потом имя для образа, который будет создан. В данном случае будет создан образ с именем my-ubuntu-elinks.

Проверим наличие образа. Вывести список всех доступных образов:

sudo docker images

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

sudo docker rm my-base-ubuntu

Создание контейнера из свежесозданного образа и запуск браузера в интерактивной сессии проброшенного терминала:

sudo docker run -it —rm my-ubuntu-elinks elinks

Благодаря опции —rm, контейнер будет удалён после завершения работы.

Использование на примере Cmake-Converter.

Программа предназначена для автоматического преобразования солюшена (.sln) Visual Studio в CmakeLists.txt. Программа написана на Python и доступна из репозитория посредством пакетного менеджера pip.

Установка и использование очень просты, что очень удобно для освоения Docker.

Настройка Dockerfile.

Для примера Dockerfile будет сохранён по следующему пути:

Создание образа.

Перейти в каталог с Dockerfile. Пример:

Создать образ с именем my-cmake-converter:

sudo docker build -t my-cmake-converter .

Точка в конце указывает на то, что контекст сборки располагается в том же каталоге, где выполняется команда на сборку. В данном случае это место хранения Dockerfile:

Запуск контейнера и использование cmake-converter.

Примечание: В данном примере sln-файл находится в

Запустить контейнер my-cmake-converter, смонтировать каталог

/Documents/ в каталог /mnt/ внутри контейнера, выполнить программу cmake-converter и указать ей путь до sln-файла, который нужно преобразовать в CMakeLists.txt:

sudo docker run -v

/Documents/:/mnt/ —rm my-cmake-converter cmake-converter -s /mnt/my-project.sln

Использование на примере утилиты untrunc.

Утилита предназначена для исправления следующей проблемы: moov atom not found audio.mp4: Invalid data found when processing input.

То есть позволяет исправить битое видео в формате mov. К примеру, видео может побиться, если некорректно завершить процесс записи. Утилита позволяет подсунуть moov атом из нормального видео в битое, тем самым решая проблему.

Открыть в терминале желаемый каталог, куда планируется загрузить Dockerfile. Пример:

В этой же сессии терминала выполнить команду на создание образа:

sudo docker build -t untrunc .

Создание контейнера и запуск утилиты:

sudo docker run -v

/Video/:/mnt/ —rm untrunc /mnt/video_good.mp4 /mnt/video_bad.mp4

-v — указать каталог, который следует смонтировать в контейнер. Контейнер получит доступ ко всему содержимому каталога. В данном примере монтируется каталог

/Video/ в каталог /mnt/ внутри контейнера.

—rm — удалить контейнер после завершения выполнения команды. В данном случае после завершения обработки видео.

untrunc — непосредственно сама утилита, находящаяся в контейнере. Сначала указывается видео-донор, в котором всё в порядке с moov атомом, а следом указывается видео с повреждённым.

Если всё правильно, то пойдёт процесс обработки, который зависит от объёма видео. Обработка видео 1 Гб занимает до 10 минут. Если moov атом не подходит, то будет указана ошибка.

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

Использование утилиты alien.

Утилита применяется для конвертации rpm-пакетов в deb-пакеты. Она требует довольно много зависимостей, которые не хочется тащить в систему. Поэтому сделаем собственный Docker-образ на базе Ubuntu.

Настройка Dockerfile.

В данном примере Dockerfile будет сохранён в

Создание образа.

Перейти в каталог с Dockerfile:

Создать образ с именем alien:

sudo docker build -t alien .

Создание контейнера и запуск утилиты:

sudo docker run -v

/Downloads/:/mnt/ —rm alien /mnt/пакет.rpm

В данном примере rpm-пакет находится в каталоге

/Downloads/, который был смонтирован в каталог /mnt/ внутри контейнера.

Первый опыт работы с Docker

Хотелось бы поделиться «граблями», на которые успел наступить при работе с docker, интересными фишками и вообще рассказать про эту замечательную технологию.

Что за зверь такой?

Думаю, сегодня уже все слышали про docker, но все же:
Docker — контейнеризатор приложений. =) (более развернутое пояснение на вики)

А тут я собрал основные свойства технологии:

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

Запуск на любой машине без установки среды

Запуск с помощью одной команды

Возможность тестирования новых технологий без ее установки

Установка

Установка вполне дефолтная, но все же уделю этому немного внимания

Первое, что необходимо сделать — перейти на официальный сайт (удивительно, правда?!)

официальный сайт docker

официальный сайт docker

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

первый запуск

первый запуск Грабля при установке

На ОС Windows может появиться ошибка, связанная с Hyper-V (система аппаратной визуализации)

Решение:

Переходим в папку с Docker -> открыть файл start.sh ->открываем в любом текстовом редакторе -> найти следующую строку:

«$» create -d virtualbox —virtualbox-no-vtx-check $PROXY_ENV «$«

->снова запустить процесс установки (готово)

Работа с Docker

Есть несколько способов работы с Docker :

Работать в Docker Desktop (как устанавливать смотреть выше!)

Первый запуск

Запускаем наш Docker Desktop и открываем командную строку. После запуска приложения, у Вас должна отображаться следующая иконка (в скрытых значках):

в командной сроке пишем следующую команду:

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

cmd

cmd Если командная строка говорит, что не знает такой команды как «docker»

Проверьте переменные зависимости. В переменной Patch мог не прописаться путь до docker.exe. Найдите путь до docker.exe (обычно в папке bin) и добавьте путь в переменную Patch

Надеюсь у Вас все хорошо, и команда docker заработала и описание команд появилось и погода хорошая. Теперь то можно и скопировать команду из Docker Desktop

Про это команду идет речь

Про это команду идет речь

и выполнить ее в командной строке. По идее должно получиться следующее:

процесс создание контейнера

процесс создание контейнера

И что же мы сделали? Создали и запустили контейнер docker/getting-started на порту 80.
Вернемся в наш Docker Desktop и видим следующее:

Запущенный контейнер

Запущенный контейнер

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

Перейдем во вкладку Images и увидим следующее:

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

тогда увидим следующее

Видим всю информацию про все контейнеры и образы.

Давайте-то уже посмотрим, что у нас получилось. Переходим в Docker Desktop во вкладку Containers/Apps и нажимаем следующее:

Hello world! по docker-ски

Можем насладиться проделанной работой)

Контейнеры и образы

Контейнеры, образы — чтооооо?!
Давайте теперь немного теории(совсем чуть-чуть)

Образ – готовое решение , содержащее некий функционал(нельзя изменять), на его основе можем создать свой контейнер
Контейнер – это собранный проект , состоящий из образов: упакованное (контейнеризированное) приложение на основе образов

Посмотрим на картинку ниже:

Архитектура docker

Архитектура docker

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

Docker deamon – промежуточный api для нахождение и скачивания нужного image

Docker hub — место сбора различных образов

Установка образа

Давайте попробуем развернуть какой-нибудь контейнер (что-то повеселее стартовой страницы).

Переходим во вкладку: Explore

В поиске вводим название нужного образа (я буду скачивать образ java- вы можете выбрать любой другой)

нажимаем, видим сразу готовенькую команду:

Копируем и вставляем в командную строку –> тем самым устанавливаем себе образ java:

Запуск образа

Давайте теперь создадим и запустим контейнер на основе только что скачанного образа.

«Стоп» — скажите Вы . А откуда взять имя образа? А вот от куда:

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

Что получили

Запустить образ без контейнера невозможно – противоречит принципу docker, следовательно у нас создался контейнер на основе нашего образа, который мы пытались запустить

Давайте запустим наш контейнер в интерактивном режиме и убедимся, что мы все сделали верно. Вводим команду для запуска (даем свое имя- тут я обозвал его как JavaContainer):

Получаем запушенный контейнер:

Видим — запустили контейнер с java (об этом нам говорит надпись jshell- java оболочка). Ну хорошо, поигрались с java, а как вернуться обратно, команды docker то уже не работают. И что делать ?

Спокойствие, только спокойствие. Нажимаем магическую комбинацию Ctrl + D:

и о чудо, можно выдохнуть)

А что еще можно запустить?

Давайте , на последок, посмотрим еще возможности docker и запустим Ubuntu.

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

Аналогично шагам выше , зайдем на сайт и найдем Ubuntu, после воспользуемся командой в описании на сайте

Далее запустим в интерактивном режиме:

Итоги

Тут я собрал некоторые полезные команды docker и их описание на русском. Может кому пригодится).

Это был краткий обзор на технологию Docker, разумеется он не претендует на полноценный гайд: не было рассказано про Dockerfile или Docker compose или про запуск контейнеров в IDE, про создание собственных образов; НО цель данной статьи — помочь ознакомиться с базой а не рассказать про все и вся). В будущем поговорим про незатронутые тут моменты в Docker. Надеюсь моя статья была для Вас полезной!

Docker Desktop

Docker Desktop is a one-click-install application for your Mac, Linux, or Windows environment that enables you to build and share containerized applications and microservices.

It provides a straightforward GUI (Graphical User Interface) that lets you manage your containers, applications, and images directly from your machine. Docker Desktop can be used either on it’s own or as a complementary tool to the CLI.

Docker Desktop reduces the time spent on complex setups so you can focus on writing code. It takes care of port mappings, file system concerns, and other default settings, and is regularly updated with bug fixes and security updates.

  • Ability to containerize and share any application on any cloud platform, in multiple languages and frameworks.
  • Quick installation and setup of a complete Docker development environment.
  • Includes the latest version of Kubernetes.
  • On Windows, the ability to toggle between Linux and Windows Server environments to build applications.
  • Fast and reliable performance with native Windows Hyper-V virtualization.
  • Ability to work natively on Linux through WSL 2 on Windows machines.
  • Volume mounting for code and data, including file change notifications and easy access to running containers on the localhost network.

Docker Desktop works with your choice of development tools and languages and gives you access to a vast library of certified images and templates in Docker Hub. This enables development teams to extend their environment to rapidly auto-build, continuously integrate, and collaborate using a secure repository.

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

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

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

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

Когда я наконец-то понял все тонкости работы с Docker (на полное изучение которого ушло несколько месяцев), и начал правильно применять его при разработке (а он как раз и нужен для разработки, в большей степени), то почувствовал, как будто обрёл какую-то сверхспособоность. Смотря на свой опыт изучения Докера, я понял, что мне есть что рассказать, и чем поделиться. В этой статье я постарался создать максимально понятную для новичков инструкцию, благодаря которой вы сможете полностью изучить Docker за 30 минут. Я долго думал о том, чтобы написать туториал, и наконец-то осилил эту задачу, и, как мне кажется, получилось неплохо 🙂

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

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

В этом туториале я показываю всё на примере ОС Windows 10, делая все команды из консоли винды, и демонстрируя процесс установки Docker на Windows 10. Но, все команды будут работать аналогично и на Linux и Mac. Эта статья — это продолжение ряда статей, посвященных настройке рабочего окружения. В прошлой статье мы рассматривали работу с Vagrant, что не менее интересно, чем Docker. И Docker и Vagrant преследуют цель — упростить жизнь разработчикам, но с Докером открывается больше возможностей.

Так же, прошу заметить, если вы используете Vagrant, и решите установить Docker, то Vagrant перестанет работать. Такая жизнь, но с этим можно смириться, тем более, субъективно, Docker круче ^^.

Что вы узнаете из этой статьи

Что такое Docker

О том, как появился Docker:

Docker — это программное обеспечение, которое начинало с того, что зародилось в одной компании, как внутренний проект platform-as-a-service в компании dotCloud.

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

На сайте Докера можно найти статью, в которой подробно рассказывается, что такое Docker. Из их слов — это стандартизированное ПО для разработки и развёртывания проектов.

Но, что это на самом деле значит?

Давайте на секунду забудем про Докер, и вспомним про такую ностальгическую штуку, как GameBoy Color :game-boy-coloe

Если вы помните, игры для этой приставки поставлялись в виде картриджей:cartrige

И я уверен в том, что производители видео игр пользуются успехом из-за своей простоты:

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

Docker следует похожему принципу — позволяет запускать своё ПО настолько просто, что это соизмеримо с вставкой картриджа и нажатием кнопки ON на приставке.

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

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

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

Какое программное обеспечение можно запустить с помощью докера? В техническом плане, Docker чем-то похож на виртуальную машину:

Докер — это движок, который запускает виртуальную операционную систему, имеющую чрезвычайно маленький вес (в отличие от Vagrant-а, который создаёт полноценную виртуальную ОС, Докер, имеет особые образы ПО, запускающиеся в виртуальной среде, не создавая полную копию ОС).

Docker позволяет запустить ОС Linux в изолированной среде очень быстро, в течение нескольких минут.

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

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

Аналогично, что делает написание PC игр более сложным, чем написание Game Boy игр — это то, что приходится проектировать систему с учётом большого множества существующих PC девайсов и спецификаций. Так как разные компьютеры имеют различные операционные системы, драйвера, процессоры, графические карты, и т.д.
И потому задача разработчика — написать приложение совместимое со всеми популярными системами, является достаточно затруднительной и трудоёмкой.

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

В этом случае вы не должны беспокоиться об операционной системе, на которой пользователь будет запускать ваше приложение. Теперь, когда пользователи будут запускать приложение через Docker — конфигурация будет собрана автоматически, и код будет выполняться ВСЕГДА.

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

Для пользователя все действия сводятся к принципу подключи и играй.

Установка Docker

Docker доступен для любой из операционных систем: Windows, Linux, Max . Для скачивания установочного файла — перейдите по ссылке и выберите подходящую вам версию. Я же, как и писал ранее, выбираю версию docker для Windows 10 .

Docker предоставляет 2 сборки:

  • Community Edition (полностью бесплатная версия)
  • Enterprise Edition (платно). Enterprise Edition содержит в себе дополнительные свистелки-перделки функции, которые, на данном этапе, точно не нужны. Функциональность, которую мы будем использовать совершенно не отличается в этих двух сборках.

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

Для того, чтобы проверить, запущен ли Docker , откроем командную строку (на Windows 10 — Нажмите кнопку windows, и начните писать командная строка)command-call
Где, напишем команду docker , и в случае успешно работающего докера, получим ответ command-docker
Дальше, нужно удостовериться, что вместе с докером, доступен так же, docker-compose , для этого, выполним команду:

docker-compose (вывод обеих команд будет примерно одинакового содержания).

Если вы используете Linux, то, docker-compose нужно будет устанавливать отдельно по инструкции.

Что такое Docker Image?

Docker образ (он же Docker Image), похож на Game Boy картридж — это просто программное обеспечение. Это стандартизированное программное обеспечение, которое запускается на любой приставке Game Boy. Вы можете дать игру вашему другу, и он сможет просто вставить картридж в приставку, и играть.

Как в случае с картриджами, бывают различные игры, так и Docker имеет различные образы ПО: ubuntu , php (который наследуется от оригинального образа Ubuntu), nodejs , и т.д.

Рассмотрим пример скачивания нашего первого образа.

Для этого, существует команда:
docker pull <IMAGE_NAME> , где <IMAGE_NAME> — имя скачиваемого образа

Зная эту команду, скачаем образ Ubuntu 18.10 :

docker-pull-ubuntu-18

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

Это как поездка за новым картриджем в магазин, только намного быстрее :).

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

docke-images

У вас, как и на скрине, должен появиться только что скачанный образ Ubuntu 18.10 .
Как и обсуждалось выше, по поводу маленького размера образов, чистый образ Ubuntu при установке из Docker-образа, весит всего 74 МБ . Не чудо ли?

Проводя аналогии, команда docker images выглядит как коллекция картриджей от приставки, которые у вас есть сейчас:Depositphotos_194136098_xl-2015

Что такое Docker контейнер?

Теперь представьте, что мы обновили нашу приставку с Game Boy на GameCube . Игры хранятся на диске, который предназначен только для чтения самого образа игры. А прочие файлы (сохранения, кеш и т.д.) сохраняются внутри самой приставки, локально.

Так же, как и игра на диске, исходный Docker Image (образ) — неизменяемый.

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

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

Depositphotos_194135642_xl-2015

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

Для запуска контейнера существует команда:

Давайте запустим наш первый контейнер Ubuntu:
docker-run

Команда echo ‘hello from ubuntu’ была выполнена внутри среды Ubuntu. Другими словами, эта команда была выполнена в контейнере ubuntu:18.10.

Теперь выполним команду для проверки списка запущенных контейнеров:
docker-ps

Здесь пустота. это потому что docker ps показывает только список контейнеров, которые запущены в данный момент (наш же контейнер выполнил одну команду echo ‘hello from ubuntu’ и завершил свою работу).

А для того, чтобы посмотреть список всех контейнеров без исключения, нужно добавить флаг -a , выполним: docker-ps-a

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

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

Выполнение неограниченное количество команда внутри контейнера

Давайте добавим немного интерактивности в наше обучение. Мы можем подключиться к консоли виртуальной ОС ( Ubuntu 18.10 ), и выполнять любое количество команд без завершения работы контейнера, для этого, запустим команду:

Опция -it вместе с /bin/bash даёт доступ к выполнению команд в терминале внутри контейнера Ubuntu.

Теперь, внутри этого контейнера можно выполнять любые команды, применимые к Ubuntu . Вы же можете представлять это как мини виртуальную машину, условно, к консоли которой мы подключились по SSH.
В результате, теперь мы знаем возможные способы, как подключиться к контейнеру, и как выполнить команду в контейнере Docker-а.

Узнаём ID контейнера

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

Теперь, все команды буду выполняться внутри операционной системы Ubuntu . Попробуем, например, выполнить команду ls , и посмотрим, список директорий, внутри этого образа Ubuntu.docker-ubuntu-ls

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

Это аналогично тому, как, если бы вы играли в Mario Kart на приставке Gamecube , и неважно, что вы делаете в игре, вы никак не сможете изменить само ядро игры, или изменить информацию, записанную на диске.

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

Теперь откройте новое окно терминала (не закрывая и не отключаясь от текущего), и выполните команду docker ps
docker-ps-new-window

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

Теперь вернёмся назад к первому окну терминала (который находится внутри контейнера), и выполним:

Выполнив команду exit , контейнер будет остановлен (чтобы убедиться, можете проверить командой docker ps ). Теперь, вы так же знаете, как выйти из Docker контейнера.

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

Так же, для того, чтобы запустить ранее созданный контейнер, можно выполнить команду docker start <CONTAINER_ID> ,

где CONTAINER_ID — id контейнера, который можно посмотреть, выполнив команду docker ps -a (и увидеть в столбце CONTAINER_ID)

В моём случае, CONTAINER_ID последнего контейнера = 7579c85c8b7e (у вас же, он будет отличаться)

Запустим контейнер командой:

И теперь, если внутри контейнера выполнить команду ls , то можно увидеть, что ранее созданная папка truedir существует в этом контейнереdocker-exex-truedir

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

Для выхода, как обычно, выполним exit .

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

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

docker run -it —rm ubuntu:18.10 /bin/bash

Что такое DockerFile?

Docker позволяет вам делиться с другими средой, в которой ваш код запускался и помогает в её простом воссоздании на других машинах.

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

К примеру, если вы разрабатывали приложение на php7.2, и использовали ElasticSearch 9 версии, и сохранили это в Dockerfile-е, то другие пользователи, которые запустят образ используя ваш Dockerfile, получат ту же среду с php7.2 и ElasticSearch 9.

С Dockerfile вы сможете подробно описать инструкцию, по которой будет воссоздано конкретное состояние. И делается это довольно-таки просто и интуитивно понятно.

Представьте, что вы играете в покемонов

Вы пытаетесь пройти первый уровень, но безрезультатно. И я, как ваш друг, хочу с этим помочь. У меня есть 2 таблетки варианта:

  1. Я дам вам файл сохранений, в котором игра ничинается со второго уровня. Всё что вам нужно — это загрузить файл.
  2. Я могу написать инструкцию, в которой опишу шаг за шагом процесс прохождения уровня. Это как рецепт, которому нужно будет следовать в точности, как описано. Эта инструкция могла бы выглядеть как-то так:

Инструкция прохождения первого уровня

  • Выбрать покемона Squirtle
  • Направляйтесь к лесу, к северу от города
  • Тренируйтесь, пока покемон не достигнет 10 уровня
  • Направляйтесь в Оловянный город
  • Подойдите к боссу, и победите его заклинанием Watergun

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

С докером вы так же имеете два варианта при создании образа:

  1. Вы можете запаковать ваш контейнер, создать из него образ (аналогично тому, что вы запишите на диск новую игру с собственными модификациями). Это похоже на способ, когда вы делитесь сохранениями напрямую.
  2. Или же, можно описать Dockerfile — подробную инструкцию, которая приведёт среду к нужному состоянию.

Я склоняюсь ко второму варианту, потому что он более подробный, гибкий, и редактируемый (вы можете переписать Dockerfile, но не можете перемотать состояние образа в случае прямых изменений).

Пришло время попрактиковаться на реальном примере. Для начала, создадим файл cli.php в корне проекта с содержимым:

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

Имена команд в Dockerfile (выделенные красным) — это синтаксис разметки Dockerfile. Эти команды означают:

  • FROM — это как буд-то вы выбираете движок для вашей игры (Unity, Unreal, CryEngine). Хоть вы и могли бы начать писать движок с нуля, но больше смысла было бы в использовании готового. Можно было бы использовать, к примеру, ubuntu:18.10, в нашем коде используется образ php:7.2-cli, потому весь код будет запускаться внутри образа с предустановленным php 7.2-cli.
  • COPY — Копирует файл с основной системы в контейнер (копируем файл cli.php внутрь контейнера, с одноимённым названием)
  • RUN — Выполнение shell-команды из терминала контейнера (в текущем случае, присвоим права на выполнение скрипта /cli.php
  • CMD — Выполняет эту команду каждый раз, при новом запуске контейнера

Для просмотра полного списка команд можете перейти по ссылке

При написании Dockerfile, начинать следует с наиболее актуального существующего образа, дополняя его в соответствии с потребностями вашего приложения.
К примеру, мы могли не использовать образ php:7.2-cli, а могли взять ubuntu:18.10, последовательно выполняя команды в RUN одна за одной, устанавливая нужное ПО. Однако, в этом мало смысла, когда уже есть готовые сборки.

Для создания образа из Dockerfile нужно выполнить:
docker build <DOCKERFILE_PATH> —tag <IMAGE_NAME>
<DOCKERFILE_PATH> — путь к файлу Dockerfile ( . — текущая директория),
<IMAGE_NAME> — имя, под которым образ будет создан

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

build-image-1

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

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

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

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

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

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

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

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

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

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

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

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

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

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

result-3

Монтирование локальной директории в Docker-контейнер

Монтирование директории в Docker контейнер — это предоставление доступа контейнеру на чтение содержимого вашей папки из основной операционной системы. Помимо чтения из этой папки, так же, контейнер может её изменять, и такая связь является двусторонней: при изменении файлов в основной ОС изменения будут видны в контейнере, и наоборот.

Когда игра читает файлы сохранений, файловая система Game Cube внедряет их в текущий сеанс игры (представим это, даже если это не так). Игра может изменять файл сохранений, и это изменение отразится на файловой системе Game Cube, т.е. возникает двусторонняя связь.

Монтирование директории в контейнер позволяет ему читать и писать данные в эту директорию, изменяя её состояние.

Для того, чтобы смонтировать папку из основной системы в контейнер, можно воспользоваться командой
docker run -v <DIRECTORY>:<CONTAINER_DIRECTORY> . ,
где DIRECTORY — это путь к папке, которую нужно смонтировать,
CONTAINER_DIRECTORY — путь внутри контейнера.

Только путь к монтируемой папке должен быть прописан полностью: C:\projects\docker-example , или на *nix-системах можно воспользоваться конструкцией $(pwd)

При выполнении этой команды, указанная папка смонтируется в папку /mounted, внутри файловой системы контейнера, а команда touch mounted/testfile создаст новый файл под названием testfile, который вы можете увидеть из основной ОС.

Теперь вы можете увидеть, что после выполнения этой команды в текущей директории появился новый файл testfile. И это говорит о том, что двусторонняя связь работает — при изменении директории на основной ОС всё отразится на смонтированную папку внутри контейнера, а при изменениях изнутри контейнера всё отразится на основную ОС.

Монтирование папки позволяет вам изменять файлы вашей основной системы прямо во время работы внутри Docker контейнера.

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

Что такое Docker Volumes?

Docker Volumes — что-то похоже на карты памяти для Game Cube. Эта карта памяти содержит данные для игры. Эти карты съемные, и могу работать, когда Gamecube приставка выключается. Вы так же можете подключить различные карты памяти, содержащие разные данные, а так же, подключать к разным приставкам.

Вы можете вставить вашу карту внутрь приставки, точно так же, как и Docker Volume может быть прикреплён к любому из контейнеров.

С Docker Volum-ами мы имеем контейнер, который хранит постоянные данные где-то на нашем компьютере (это актуально, потому что после завершения работы контейнер удаляет все пользовательские данные, не входящие в образ). Вы можете прикрепить Volume-данные к любому из запущенных контейнеров.

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

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

Порты контейнеров

Docker позволяет нам получить доступ к какому-то из портов контейнера, пробросив его наружу (в основную операционную систему). По умолчанию, мы не можем достучаться к каким-либо из портов контейнера. Однако, в Dockerfile опция EXPOSE позволяет нам объявить, к какому из портов мы можем обратиться из основной ОС.

Для этого, на по-быстрому, запустим Docker-образ php-apache, который работает на 80 порту.

Для начала, создадим новую папку apache (перейдём в неё cd apache ), в которой создадим файл index.php , на основе которого мы и поймём, что всё работает.

А так же, в этой папке создадим файл Dockerfile :

Пробежимся по командам:
FROM: это вам уже знакомо, это образ с уже установленным php и apache
WORKDIR: создаст папку если она не создана, и перейдёт в неё. Аналогично выполнению команд mkdir /var/www/html && cd /var/www/html
EXPOSE: Apache по-умолчанию запускается на 80 порту, попробуем "прокинуть" его в нашу основную ОС (посмотрим как это работает через несколько секунд)

Для работы с сетью в Docker, нужно проделать 2 шага:

  • Прокинуть системный порт (Expose).
  • Привязать порт основной ОС к порту контейнера (выполнить соответствие).

Это что-то похоже на подключение вашей PS4 приставки к телевизору по HDMI кабелю. При подключении кабеля, вы явно указываете, какой HDMI-канал будет отображать видео.

В этой аналогии наша основная ОС будет как телевизор, а контейнер — это игровая консоль. Мы должны явно указать, какой порт основной операционной системы будет соответствовать порту контейнера.

EXPOSE в Докерфайле разрешает подключение к 80 порту контейнера — как разрешение HDMI подключения к PS4.

Выполним первый шаг прокидывания порт. Сбилдим контейнер:

И после этого, запустим контейнер:

apache_call

После чего, попробуем перейти по адресу localhost:80

Но, это не сработало, потому что мы ещё не выполнили 2 шаг по маппингу портов.

Выйдите из контейнера, нажав CTRL+C.

Если у вас проблемы с остановкой контейнера, в новом окне откройте терминал, выполните docker ps , найдите ID контейнера, который сейчас запущен, и выполните docker stop (указав ваш ID контейнера)

Теперь, осталось сообщить нашему компьютеру, какой порт контейнера ему нужно слушать, и для этого формат записи будет такой:

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

Здесь, вы уже наверное заметили, что добавился новый параметр -p 80:80 , который говорит Docker-у: я хочу, чтобы порт 80 из apache был привязан к моему локальному порту 80.

И теперь, если перейти по адресу localhost:80, то должны увидеть успешный ответ: apache_result

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

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

Для *nix пользователей есть небольшой хак, который позволит остановить и удалить все контейнеры Docker:

Запомните, что любой, кто будет запускать этот код на своём компьютере, не должен иметь установленный PHP, всё что ему нужно — один только Docker.

Docker образ: прослойка данных и кеширование

Docker умнее, чем вы могли бы подумать :).

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

Каждая команда в Dockerfile сохраняется как отельный слой образа.

Рассмотрим это на примере нашего прошлого Dockerfile-а:

Когда вы пишите свой Dockerfile, вы добавляете слои поверх существующего основного образа (указанного в FROM), и создаёте свой собственный образ (Image).

FROM: говорит Докеру взять за основу этот существующий образ. А все новые команды будут добавлены слоями поверх этого основного образа.
COPY: копирует файлы с основной ОС в образ
WORKDIR: устанавливает текущую папку образа в /var/www/html

Слой Образа Докера это как точка сохранения в игре Super Mario. Если вы хотите изменить какие-то вещи, произошедшие до этой точки сохранения, то вам придётся перезапустить этот уровень полностью. Если вы хотите продолжить прогресс прохождения, вы можете начать с того места, где остановились.

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

Для иллюстрации этого, добавим новые строки в Dockerfile:

После чего, пересоберём образ:

cache
Выполнив эту команду, из вывода в консоль можете увидеть, что некоторые слои были взяты из кеша. Это как раз те команды, выше которых в Dockerfile не было добавлено/изменено содержимого.

И можно заметить, что в случае изменения Dockerfile, билдинг занимает больше времени, потому что не используется кеш. Где бы вы не написали команду, все закешированные команды, которые находятся ниже в Dockerfile, будут перебилжены заново. А те, что находятся выше, будут по-прежнему браться из кеша.

Когда вы используете команду COPY , она копирует указанную директорию в контейнер. И, в случае изменения содержимого любого из файлов этой директории, кеш команды COPY будет сброшен. Docker сверяет изменения во время билдинга в каждом из файлов. Если они были изменены, кеш будет сброшен, как и для всех последующих слоёв.

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

Какие выводы из этого можно сделать:

  1. Команды, которые вероятнее всего не будут меняться в будущем, нужно помещать как можно выше в Dockerfile.
  2. Команды копирования данных нужно помещать ниже, потому что файлы при разработке изменяются довольно часто.
  3. Команды, которые требуют много времени на билдинг, нужно помещать выше.

В заключение, так же хочу сказать, как можно уменьшить размер слоёв Docker образов.
В Dockerfile вы можете иметь несколько команд (RUN) на выполнение:

В результате выполнения этой команды, будет создано 3 разных слоя в образе. Вместо этого, все команды стараются объединить в одну строку:

Если команда становится длинной, и нечитаемой, то для переноса на следующую строку делаем так:

Если же команда становится слишком большой, и неудобной для чтения, то можно создать новый shell скрипт, в который поместить длинную команду, и запускать этот скрипт одной простой командой RUN .

Технически, только команды ADD, COPY, и RUN создают новый слой в Docker образе, остальные команды кешируются по-другому

Что такое Docker-Compose?

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

Docker Compose управляет контейнерами, запускает их вместе, в нужной последовательности, необходимой для вашего приложения.
Его можно назвать дирижёром в мире Docker-а.

Docker-compose организовывает совместных запуск контейнеров, как инструменты в групповой игре в определённых участках песни.

Каждый инструмент имеет конкретную задачу в группе оркестра. Труба создаёт основную мелодию песни; фортепиано, гитара дополняют основную мелодию; барабаны задают ритм; саксофоны добавляют больше гармонии и т.д.
Каждый из инструментов имеет свою конкретную работу и задачу, как и наши контейнеры.

Docker-compose написан в формате YAML который по своей сути похож на JSON или XML. Но YAML имеет более удобный формат для его чтения, чем вышеперечисленные. В формате YAML имеют значения пробелы и табуляции, именно пробелами отделяются названия параметров от их значений.

Создадим новый файл docker-compose.yml , для рассмотрения синтаксиса Docker Compose:

Теперь, построчно разберёмся с заданными параметрами, и что они значат:
version: какая версия docker-compose используется (3 версия — самая последняя на даный момент).
services: контейнеры которые мы хотим запустить.
app: имя сервиса, может быть любым, но желательно, чтобы оно описывало суть этого контейнера.
build: шаги, описывающие процесс билдинга.
context: где находится Dockerfile, из которого будем билдить образ для контейнера.
ports: маппинг портов основной ОС к контейнеру.

Мы можем использовать этот файл для билдинга нашего предыдущего образа apache:

После выполнения этой команды, Docker спарсит файл docker-compose и создаст описанные сервисы на основе инструкций во вкладке build.

А context говорит о том, из какой директории мы берём Dockerfile для создания образа сервиса (в текущем случае — это означает текущую директорию . , но могло быть и /php-cli , /nginx , и т.д.).

И теперь, запустим эти сервисы, которые создали:

В результате чего, сервер должен был запуститься, и стать доступным по адресу localhost:8080.

Теперь, отключитесь от консоли, нажав CTRL+C.

Когда контейнер под названием app запускается, docker-compose автоматически связывает указанные порты во вкладке ports . Вместо того, как мы делали ранее, выполняя -v 8080:80 , docker-compose делает это за нас, получив информацию параметра ports . Docker-compose избавляет нас боли, связанной с указанием параметров в командной строке напрямую.

С docker-compose.yml мы переносим все параметры, ранее записываемые в командной строке при запуске контейнера в конфигурационный YAML файл.

В этом примере мы записали BUILD и RUN шаги для нашего сервиса в docker-compose.yml. И преимущество такого подхода ещё в том, что теперь для билдинга и для запуска этих сервисов нам нужно запомнить только 2 команды: docker-compose build и docker-compose up . При таком подходе не нужно помнить, какие аргументы нужно указывать, какие опции нужно задавать при запуске контейнера.

Теперь давайте сделаем нашу разработку немного легче. Сделаем, чтобы вместо постоянного перестроения образа при каждом изменении файлов, мы можем примонтировать нашу рабочую папку в контейнер.
Для этого, удалите строку COPY . /var/www/html с Dockerfile — теперь все файлы будут прокинуты из основной ОС. Новый Dockerfile будет иметь вид:

Ранее мы рассматривали, как примонтировать папку в контейнер, для этого мы запускали контейнер с аргументом -v <HOST_DIRECTORY>:<CONTAINER_DIRECTORY> .
С Docker-compose мы можем указать напрямую в docker-compose.yml:

Добавленная строка примонтирует текущую директорию основой операционной системы к директории /var/www/html контейнера.

В отличие от указания путь в консоли, здесь можно указывать относительный путь ( . ), не обязательно указывать полный путь ( C:\projects\docker-example\apache ), как было ранее при ручном запуске контейнера.

Теперь, выполните по очереди команды:

При удалении, вас спросят, действительно ли удалять, напишите y и нажмите кнопку enter. Эти команды остановят и удалят все контейнеры, описанные в файле docker-compose.yml (то же самое, как мы ранее запускали docker stop <CONTAINER_ID> и docker rm <CONTAINER_ID> )

Теперь перебилдим сервисы, потому что мы изменили Dockerfile:

И заново запустим:

И опять, по адресу localhost:8080 поднимется наш сервер.

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

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

И теперь, если перейти по адресу localhost:8080?count=10, то увидим, что пирамида выводится: apache_index_count

Монтирование вашей локальной папки как Docker Volume это основной метод как разрабатывать приложения в контейнере.

Так же, как мы ранее выполняли команды внутри контейнера, указывая аргументы -it . /bin/bash . Docker-compose так же предоставляет интерфейс по удобному выполнению команд внутри конкретного контейнера. Для этого нужно выполнить команду:

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

К примеру, эта команда может выглядеть так:

Но, сделаем это на основе текущего Dockerfile:

И в результате должны получить exec

Пока что, в docker-compose.yml описан только один сервис, потому разворачиваем мы только один контейнер. Но реальный файл docker-compose выглядит больше. К примеру, для Laravel он такой:

И при выполнении одной только команды docker-compose up , поднимутся 5 сервисов. В сравнении с тем, что мы бы вручную выполняли 5 раз команду docker run . . Так что, использование docker-compose в этом случае — очевидно. Так что, теперь, ещё один шаг позадчи, теперь вы знаете, что такое docker и docker compose, и для чего нужен каждый из них.

Как писать Микро Сервисы с Docker? Что такое микросервисы?

Docker найболее часто используемый инструмент для написания Микросервисов. Микросервисы — это архитектурный шаблон проектирования который следует философии "разделения ответственности".

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

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

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

В основном, микросервисы имеют канал коммуникации мужду собой, в виде REST API, который возвращает данные в JSON, или что-то типа того.

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

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

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

Резюме

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *