fbpx

Каталог статей

Каталог статей для размещения статей информационного характера

Как выучить

Изучайте Docker с самого начала, часть I

# Изучайте Docker, с самого начала, часть I

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

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

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

В этой статье мы попытаемся охватить следующие темы

  • Почему Docker и что это такое, это, вероятно, самая важная часть статьи, почему Docker, почему не какая-то другая технология или статус-кво? Я попытаюсь объяснить, что такое Docker и из чего он состоит.
  • Docker в действии, мы будем докеризировать приложение, чтобы показать, что мы понимаем и можем использовать основные концепции, из которых состоит Docker.
  • Улучшая наши настройки, мы должны убедиться, что наше решение не полагается на статические значения. Мы можем обеспечить это путем создания и установки переменных окружения, значение которых мы можем прочитать изнутри нашего приложения.
  • Управление нашим контейнером – теперь довольно просто запустить контейнер, но давайте посмотрим, как им управлять, ведь мы не хотим, чтобы контейнер работал вечно. Даже если это очень легкая вещь, она увеличивается и может блокировать порты, которые вы хотите использовать для других целей.

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

# Ресурсы

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

    Для использования контейнеров в облаке как частного реестра вам понадобится бесплатная учетная запись Azure Отличная обзорная страница, которая показывает, что еще нужно знать о контейнерах в облаке Учебник, который показывает, как легко использовать имеющиеся навыки работы с Docker и запустить свои службы в облаке Ваши образы Docker могут находиться в Docker Hub, а также в реестре контейнеров в облаке. Разве не здорово хранить свои образы где-то и иметь возможность создать сервис из этого реестра за несколько минут?

# Почему Docker и что это такое

Docker помогает вам создать воспроизводимую среду. Вы можете

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

  • окружения выглядят одинаково, используя Docker, вы можете создать DEV, STAGING и PRODUCTION окружения, которые все выглядят одинаково. Это действительно здорово, поскольку до Docker/контейнеризации у вас могли быть среды, которые были похожи, но могли быть небольшие различия, и когда вы обнаруживали ошибку, вы могли потратить много времени на поиск ее первопричины. Иногда ошибка была в самом исходном коде, но иногда она возникала из-за различий в окружении, и на ее определение обычно уходило много времени.
  • работает на моей машине, этот пункт во многом похож на описанный выше, но поскольку Docker создает эти изолированные контейнеры, в которых вы точно указываете, что они должны содержать, вы можете отправлять эти контейнеры клиентам, и они будут работать точно так же, как и на вашей машине/машинах для разработки.
  • ##Что это такое Итак, выше мы назвали несколько причин, по которым вам стоит обратить внимание на Docker, но давайте подробнее рассмотрим, что же такое Docker на самом деле. Мы выяснили, что он позволяет нам определять окружение, например, ОС, как найти и запустить приложения и необходимые переменные, но что еще нужно знать о Docker?

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

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

Если вам интересно узнать, как именно Docker это делает, я советую взглянуть на следующие ссылки о многоуровневой файловой системе

и библиотеке runc

а также этот замечательный википедический

обзор Docker.

# Docker в действии

Итак, мы рассмотрели, что такое Docker и некоторые преимущества. Мы также поняли, что то, что в конечном итоге запускает мое приложение, называется контейнером. Но как мы до этого доберемся? Ну, мы начинаем с файла описания, называемого Dockerfile. В этом Dockerfile мы указываем все, что нам нужно в плане ОС, переменных окружения и того, как поместить туда наше приложение.

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

Мы выполним следующие шаги:

создадим приложение , мы создадим приложение Node.js Express, которое будет работать как REST API.

  • создадим Dockerfile, текстовый файл, который укажет Docker, как собрать наше приложение.
  • создать образ, предварительным шагом к запуску нашего приложения является создание так называемого образа Docker.
  • создание контейнера, это последний шаг, на котором мы увидим наше приложение в рабочем состоянии, мы создадим контейнер из образа Docker
  • # Создание нашего приложения

Теперь мы создадим проект Express Node.js, который будет состоять из следующих файлов:

app.js, это файл, который запускает наш REST-сервер.

  • package.json , это файл манифеста для проекта, здесь мы увидим все зависимости, такие как express, но мы также объявим скрипт start, чтобы мы могли легко запустить наше приложение
  • Dockerfile, это файл, который мы создадим, чтобы указать Docker, как докеризировать наше приложение.
  • Чтобы сгенерировать наш package.json, мы просто поместим себя в каталог проектов и напечатаем:

Это создаст файл package.json с кучей значений по умолчанию.

Затем мы должны добавить зависимости, которые мы собираемся использовать, это библиотека express, мы устанавливаем ее, набрав следующее:

# Let’s add some code

Теперь, когда мы выполнили всю предварительную работу по созданию файла package.json и установке зависимостей, пришло время добавить код, необходимый для запуска нашего приложения, поэтому мы добавляем следующий код в app.js :

Мы можем попробовать запустить это приложение, набрав:

Перейдя в веб-браузер на http://localhost:3000, мы должны увидеть:

Ok, это работает, хорошо .

Один небольшой комментарий, однако, мы должны обратить внимание на тот факт, что мы назначаем порт на 3000, когда мы позже создадим наш Dockerfile.

# Создание Dockerfile

Следующим шагом будет создание нашего Dockerfile. Этот файл действует как манифест, а также как файл инструкций по сборке, как запустить наше приложение. Итак, что необходимо для запуска приложения? Нам нужно:

скопировать все файлы приложения в контейнер docker

  • установить зависимости, например, express
  • открыть порт в контейнере, к которому можно получить доступ извне
  • указать контейнеру, как запустить наше приложение.
  • В более сложном приложении нам может потребоваться сделать такие вещи, как установка переменных окружения, установка учетных данных для базы данных, запуск seed для заполнения базы данных и так далее. На данный момент нам нужны только те вещи, которые мы указали в нашем списке выше. Поэтому давайте попробуем выразить это в нашем Dockerfile:

Давайте разобьем вышеприведенные команды на части:

FROM , это мы выбираем образ ОС из Docker Hub. Docker Hub – это глобальный репозиторий, содержащий образы, которые мы можем извлекать локально. В нашем случае мы выбираем образ на основе Ubuntu, на котором установлен Node.js, он называется node. Мы также указываем, что нам нужна последняя версия, используя следующий тег :latest

  • WORKDIR , это просто означает, что мы задаем рабочий каталог. Это способ подготовиться к тому, что произойдет позже, в следующей команде ниже
  • COPY , здесь мы копируем файлы из каталога, в котором мы находимся, в каталог, указанный командой WORKDIR
  • RUN , запускает команду в терминале, в нашем случае мы устанавливаем все библиотеки, необходимые для создания нашего экспресс-приложения Node.js
  • EXPOSE , это означает, что мы открываем порт, именно через этот порт мы общаемся с нашим контейнером
  • ENTRYPOINT , t
  • создание образа , с помощью Dockerfile и команды docker build мы создадим образ

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

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

docker buil d-t chrisnoring/node:latest .

  • Приведенная выше команда создает образ. Символ . в конце важен, так как он указывает Docker, где находится ваш Dockerfile, в данном случае это каталог, в котором вы находитесь. Если у вас нет образа ОС, который мы запрашиваем в команде FROM, это приведет к тому, что он будет извлечен из Docker Hub, а затем будет создан ваш конкретный образ.
  • Ваш терминал должен выглядеть примерно так:

Выше мы видим, как образ ОС node:latest извлекается из Docker Hub, а затем выполняется каждая из наших команд, таких как WORKDIR , RUN и т.д. Стоит обратить внимание на то, что после каждого шага говорится об удалении промежуточного контейнера. Это Docker проявляет смекалку и кэширует все различные слои файлов после каждой команды, чтобы процесс шел быстрее. В конце мы видим надпись successfully built, что является сигналом того, что все было создано успешно. Давайте посмотрим на наш образ:

У нас есть образ, успех

# Создание контейнера

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

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

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

docker ru n-p 8000:3000 chrisnoring/node

Ок, выполнение этой команды означает, что мы должны иметь возможность посетить наш контейнер, зайдя на http://localhost:8000, 8000 – это наш внешний порт, помните, что он сопоставлен с внутренним портом 3000. Давайте посмотрим, давайте откроем браузер:

Вот и все, друзья, рабочий контейнер .

# Улучшение наших настроек с помощью переменных окружения

Итак, мы узнали, как создать образ Docker, научились запускать контейнер и тем самым наше приложение внутри него. Однако мы могли бы немного лучше обращаться с частью с PORT. Сейчас нам нужно отслеживать порт, с которого мы запускаем экспресс-сервер, внутри нашего app.js, чтобы убедиться, что он соответствует тому, что мы написали в Dockerfile. Это не должно быть так, это просто статично и чревато ошибками.

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

добавить переменную окружения в Dockerfile

прочитать переменную окружения в app.js.

###Добавить переменную окружения Для этого нам нужно использовать команду ENV, например, так:

Давайте добавим ее в наш Dockerfile, чтобы теперь он выглядел следующим образом:

  • Давайте сделаем еще одно изменение, а именно обновим EXPOSE, чтобы использовать нашу переменную, таким образом мы git избавиться от статических значений и полагаться на переменные, как показано ниже:
  • Обратите внимание, как мы изменили команду EXPOSE на $PORT, любые переменные, которые мы используем, должны иметь префикс $:

# Чтение значения переменной окружения в App.js

Мы можем читать значения из переменных окружения в Node.js следующим образом:

Поэтому давайте обновим наш код app.js до этого:

ПРИМЕЧАНИЕ: когда мы вносим изменения в наш app.js или наш Dockerfile, нам нужно перестроить наш образ. Это означает, что нам нужно снова выполнить команду docker build, а до этого мы должны снести наш контейнер с помощью docker stop и docker rm. Подробнее об этом в следующих разделах.

# Управление нашим контейнером

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

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

Как вы видите выше, у нас есть колонка CONTAINER_ID или колонка NAMES, оба эти значения будут работать, чтобы остановить наш контейнер, потому что это то, что нам нужно сделать, как показано выше:

Мы предпочитаем использовать CONTAINER_ID и три первые цифры, больше нам не нужно. Это эффективно остановит наш контейнер.

# Режим демона

Мы можем поступить так, как делали выше, и открыть отдельную вкладку терминала, но запуск в режиме демона – лучший вариант. Это означает, что мы запускаем контейнер в фоновом режиме, и весь вывод от него не будет виден. Для этого мы просто добавим фла г-d . Давайте попробуем это сделать:

Теперь мы получим только id контейнера, и это все, что мы увидим. Теперь нам проще просто остановить его, если мы хотим, набрав docker stop 268 , это три первые цифры из приведенного выше id.

# Интерактивный режим

Интерактивный режим очень интересен, он позволяет нам войти в работающий контейнер и перечислить файлы, добавить/удалить файлы или сделать практически все, что мы можем сделать, например, в bash. Для этого нам нужна команда docker exec, например, так:

Выше мы запустили команду:

ВНИМАНИЕ, контейнер должен быть запущен и работать. Если вы останавливали его ранее, то запустите его командой docker start 268 . Замените 268 на любой идентификатор, который вы получили при создании контейнера, когда набирали команду docker run .

268 – это три первые цифры нашего контейнера, -it означает интерактивный режим, а аргумент bash в конце означает, что мы запустим оболочку bash.

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

Если мы просто хотим запустить что-то на контейнере, например, команду node, мы можем ввести:

это запустит команду node app.js в контейнере.

[…]

[…] […]

[…] […]

[…] […] […]

[…]

[…]

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

# Благодарности

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

Я буду рад ответить на ваши запросы, вопросы и предложения по темам.

alt text

alt text

alt text

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

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