Следуй за мной на Twitter , рад принять ваши предложения по темам или улучшениям/Крису
Эта статья является частью серии:
- Докер — от начальной части I, мы здесь.
- Докер — с самого начала, часть II , Это о объемах и того, как мы можем использовать тома для сохранения данных, но и как мы можем превратить нашу среду развития в объеме и сделать наш опыт развития значительно лучше
- Докер — с самого начала, часть III , речь идет о том, как иметь дело с базами данных, поместив их в контейнеры и как создавать контейнеры, разговаривать с другими контейнерами, используя наследие, но и новый стандарт через сети
- Докер — с самого начала , Часть IV, вот как мы управляем более чем одним сервисом, используя Docker Compose (это 1/2 часть на Docker Compose)
- Докер — с самого начала, часть v Эта часть — это вторая и заключая часть на Docker Compose, где мы покрываем тома, переменные среды и работа с базами данных и сетью
Теперь есть тонна статей для докера, но я борюсь с тем, что никто из них не очень тщательно и объясняет, что происходит, или, скорее, это мое впечатление, не стесняйтесь не согласиться:). Я должен сказать, что я пишу много этих статей для меня и мое собственное понимание и веселиться в процессе:). Я также надеюсь, что это может быть полезно для вас.
Поэтому я решил копать относительно глубоко, так что вы все, надеетесь, могут принести пользу. TLDR, это первая часть в серии статей на Docker, эта часть объясняет основы и причина, по которой я думаю, вы должны использовать Docker.
Эта статья действительно Docker с самого начала, я не принимаю без предварительного знания, Я ничего не принимаю Отказ Наслаждаться:)
В этой статье мы попытаемся покрыть следующие темы
- Почему докер и что это за Вероятно, это, вероятно, самая важная часть статьи, почему докер, почему бы не некоторые другие технологии или статус-кво? Я буду пытаться объяснить, что докер и что он состоит из.
- Докер в действии , мы свяжемся о приложении к демонстрации мы понимаем и можем использовать основные концепции, которые делают Docker.
- Улучшение нашей настройки Мы должны обеспечить, чтобы наше решение не полагается на статические значения. Мы можем обеспечить это путем создания и установки переменных среды, значение которых мы можем прочитать изнутри нашего приложения.
- Управление нашим контейнером Теперь довольно легко получить контейнер вверх и запустить, но давайте посмотрим, как управлять этим, в конце концов, мы не хотим, чтобы контейнер был встал и работает навсегда. Даже это очень легкие вещи, он добавляет, и он может заблокировать порты, которые вы хотите использовать для других вещей.
Помните, что это первая часть серии, и мы рассмотрим другие вещи в этой серии на Docker, такие как объемы, связывание, микросервисы и оркестровка, но это будет покрыто будущим частям.
Ресурсы
Использование Docker и Containeruration — это о разрыве монолита в микросервисам. На протяжении этой серии мы научимся освоить Docker и все его команды. Рано или поздно вы захотите забрать свои контейнеры в производственную среду. Эта среда обычно облака. Когда вы чувствуете, что у вас есть достаточно опыта Docker, посмотрите на эти ссылки, чтобы увидеть, как Docker можно использовать в облаке:
- Подпишитесь на бесплатный Azure Account Чтобы использовать контейнеры в облаке, как частный реестр, вам понадобится бесплатная аккаунт Azure
- Контейнеры в облаке Отличная страница обзора, которая показывает, что еще есть, нужно знать о контейнерах в облаке
- Развертывание ваших контейнеров в облаке Учебное пособие, которое показывает, насколько легко использовать существующие навыки Docker и получите свои услуги в облаке
- Создание реестра контейнера Ваши изображения Docker могут быть в Docker Hub, но и в реестре контейнера в облаке. Разве не было бы здорово сохранить ваши изображения где-то и иметь возможность создавать услуги от этого реестра в считанные минуты?
Почему докер и что это
Docker поможет вам создать воспроизводимую среду. Вы можете указать точную версию различных библиотек, разные переменные среды и их ценности среди прочего. Самое главное, что вы можете запустить ваше приложение в изоляции внутри этой среды.
Большой вопрос, почему мы хотели бы этого?
- бортовое Каждый раз, когда вы на борту нового разработчика в проекте, им нужно настроить много вещей, таких как установка SDK, инструменты разработки, базы данных, добавления разрешений и так далее. Это процесс, который может занять от одного дня до 2 недель
- среды выглядят одинаково Используя Docker, вы можете создать разработку, постановку, а также производственную среду, которая все выглядит одинаково. Это действительно здорово, как до докера/контейнеров, вы могли бы иметь среды, которые были похожими, но могли быть небольшие различия, и когда вы обнаружили ошибку, вы могли бы провести много времени, преследующую корневую причину ошибки. Иногда ошибка была в сам исходный код Но иногда это было связано с некоторой разницей в окружающей среде, и это обычно потребовалось много времени, чтобы определить.
- работает на моей машине Этот момент очень похож на вышеупомянутое, но потому что Docker создает эти изолированные контейнеры, где вы точно указываете, что они должны содержать, вы также можете отправить эти контейнеры клиентам, и они будут работать так же, как и в вашей машине развития/s.
Что это такое
ОК, поэтому мы упомянули несколько великолепных причин выше, почему вы должны расследовать докер, но давайте погрузимся больше в то, что есть Docker. Мы установили, что это позволяет нам указать среду, такую как ОС, как найти и запустить приложения и переменные, которые вам нужны, но что еще, чтобы узнать о Docker?
Docker создает автономные пакеты под названием Контейнеры которые содержат все, что нужно для вас, чтобы запустить ваше приложение. Каждый контейнер получает свой собственный CPU, память и сетевые ресурсы и не зависит от определенной операционной системы или ядра. Первый, который приходит на ум, когда я опишу вышеуказанную, это виртуальная машина, но Докер отличается тем, как он делится или посвящает ресурсы. Docker использует так называемый Слоистая файловая система Это позволяет контейнерам обмениваться общими частями, а конечный результат заключается в том, что контейнеры находятся в том, что контейнеры находятся на уровне ресурсов на хост-системе, чем виртуальная машина.
Короче говоря, контейнеры Docker, содержат все необходимое для запуска приложения, включая исходный код, который вы написали. Контейнеры также являются изолированными и надежными подразделениями света в вашей системе. Это позволяет легко создавать несколько микросервисов, которые записываются на разных языках программирования, и которые используют разные версии того же LIB и даже одинаковой ОС.
Если вам интересно, как именно Docker это призывает взглянуть на следующие ссылки на Слоистая файловая система и библиотека runc а также это великое Википедия Обзор Докера.
Докер в действии
Хорошо, поэтому мы охватывали то, что Docker есть и некоторые преимущества. Мы также поняли, что то, что в конечном итоге запускает мое приложение, называется Контейнер
Отказ Но как мы туда доберемся? Ну, мы начинаем с файла описания, называемый Dockerfile
Отказ В этом Dockerfile
Мы указываем все, что нам нужно с точки зрения ОС, переменных окружающей среды и как наше приложение там.
Теперь мы прыгнем в глубокий конец. Мы построим приложение и Докереновать Это Таким образом, у нас будет наше приложение, бегущее внутри контейнера, изолированного от внешнего мира, но достижимы к порту, которые мы явно открываемся.
Мы возьмем следующие шаги:
- Создайте приложение Мы создадим Node.js Express Application, которое будет действовать как API для отдыха.
- Создать DockerFile , текстовый файл, который говорит Docker, как создать наше приложение
- построить изображение предварительный шаг к нашему приложению и запуску — сначала создать так называемое изображение докера
- Создать контейнер , это последний шаг, в котором мы увидим наше приложение вверх и бега, мы создадим контейнер от образа докера
Создание нашего приложения
Теперь мы создадим проект Express Node.js, и он состоит из следующих файлов:
- app.js это файл, который вращает наш отдых
- package.json Этот файл манифеста для проекта, здесь мы увидим все зависимости, такие как Express Но мы также будем объявлять начать сценарий, поэтому мы можем легко начать наше приложение
- Dockerfile , это файл, который мы создадим, чтобы сказать Docker, как подключить наше приложение
Генерировать наши package.json
Мы просто размещаемся в каталоге проектов и введите:
NPM init -y.
Это даст файл Package.json с кучей значений по умолчанию.
Затем мы должны добавить зависимости, которые мы собираемся использовать, которая является библиотекой выражать
Мы устанавливаем его, набрав так:
NPM Install Express —save
Давайте добавим какой-код
Теперь, когда мы сделали все VEWORK с созданием Package.json файла и установка зависимостей, пришло время добавить код, необходимый для нашего приложения для запуска, поэтому мы добавляем следующий код для app.js.
:
// app.js const express = require('express') const app = express() const port = 3000 app.get('/', (req, res) => res.send('Hello World!')) app.listen(port, () => console.log(`Example app listening on port ${port}!`))
Мы можем попробовать и запустить это приложение, набрав:
Узел App.js.
Ходить в веб-браузер на http://localhost:3000
Теперь мы должны увидеть:
Хорошо, так что работает, хорошо:)
Однако один маленький комментарий, мы должны принять к сведению тот факт, что мы присваиваем порт 3000, когда мы позже создаем наш Dockerfile.
Создание докерафила
Таким образом, следующий шаг создает нашу DockerFile. Теперь этот файл действует как манифест, но и в качестве файла инструкции по сборке, как получить наше приложение вверх и запустить. Хорошо, так что нужно, чтобы получить приложение вверх и бежать? Мы должны:
- Скопировать Все файлы приложений в контейнер докеров
- Установить зависимости, как экспресс
- Откройте порт в контейнере, к которому можно получить доступ снаружи
- поручить С Контейнер Как начать наше приложение
В более сложном применении нам может потребоваться выполнять такие вещи, как настройка переменных среды или установить учетные данные для базы данных или запускать семена базы данных для заполнения базы данных и т. Д. На данный момент нам нужны только вещи, которые мы указали в нашем списке пули выше. Итак, давайте постараемся выразить это в нашем DockerFile:
# Dockerfile FROM node:latest WORKDIR /app COPY . . RUN npm install EXPOSE 3000 ENTRYPOINT ["node", "app.js"]
Давайте сломаем вышеупомянутые команды вниз:
- От , это выбирая изображение ОС из Docker Hub. Docker Hub — это глобальный репозиторий, который содержит изображения, которые мы можем вытащить локально. В нашем случае мы выбираем изображение, основанное на Ubuntu, который установлен Node.js, это называется узел. Мы также указываем, что мы хотим, чтобы последняя версия этого, используя следующий тег
: самый последний
- Workdir Это просто означает, что мы устанавливаем рабочий каталог. Это способ настроить то, что должно произойти позже, в следующей команде ниже
- Скопировать , здесь мы копируем файлы из каталога, который мы стоим в каталог, указанный нашей командой Workdir
- Беги , Это запускает команду в терминале, в нашем случае мы устанавливаем все библиотеки, которые нам нужно создать нашу эксплуатацию Node.js Express
- Выставить Это означает, что мы открываем порт, это через этот порт, который мы общаемся с нашим контейнером
- Выходная точка , именно здесь мы должны указать, как мы запускаем наше приложение, командам необходимо указывать как массив, чтобы массив
[«Узел», «App.js»]
будет переведено в узел app.js в терминале
Краткая информация
Хорошо, так что теперь мы создали все файлы, которые нам нужны для нашего проекта, и он должен выглядеть так:
-| app.js // our express app -| Dockerfile // our instruction file that Docker will read from -| node_modules/ // directory created when we run npm install -| package.json // npm init created this -| package-lock.json // created when we installed libraries from NPM
Создание изображения
Есть два шага, которые необходимо предпринять, чтобы наш приложение вверх и запустить внутри контейнера, это:
- Создание изображения С помощью DockerFile и команды
Docker Build.
Мы создадим изображение - Начните контейнер Теперь, когда у нас есть изображение из действия, которое мы взяли выше, нам нужно создать контейнер
Первые вещи сначала давайте создадим наше изображение со следующей командой:
Docker Build -t Chrisnoring/Node: последние.
Вышеуказанная инструкция создает изображение. Отказ
В конце важно, поскольку это инструктирует Docker и рассказывает о том, где находится ваш DockerFile, в этом случае, в этом случае это каталог, в котором вы находитесь. Если у вас нет изображения ОС, что мы просим в От
Команда, оно приведет к тому, что он вытягивается из докера Hub, а затем строится ваше конкретное изображение.
Ваш терминал должен выглядеть что-то подобное:
То, что мы видим выше, так это то, как изображение ОС Узел: Последние
вытягивается из докера Hub, а затем каждая из наших команд выполняется как Workdir
, Беги
и так далее. Стоит отметить, как он говорит снятие промежуточного контейнера после каждого шага. Теперь это Docker является Smart и кэширует все разные слои файлов после каждой команды, чтобы она идет быстрее. В конце концов, мы видим Успешно построен
Какой наш CUE, что все было успешно построено. Давайте посмотрим на наш образ с:
Docker Images.
У нас есть изображение, успех:)
Создание контейнера
Следующий шаг — сделать наш образ и построить контейнер от него. Контейнер — это изолированная часть, которая запускает наше приложение внутри него. Мы строим контейнер, используя Docker Run
Отказ Полная команда выглядит так:
Docker Run Chrisnoring/Node
Это не совсем достаточно хорошо, хотя, так как нам нужно отобразить внутренний порт приложения на внешний, на хост-машине. Помните, что это приложение, которое мы хотим достичь через наш браузер. Мы делаем отображение, используя флаг -П
вот так:
-P [Внешний порт]: [Внутренний порт]
Теперь полная команда сейчас выглядит так:
Docker Run -P 8000: 3000 Крисноринг/Узел
Хорошо, запуск этой команды означает, что мы должны иметь возможность посетить наш контейнер, перейдя в http://localhost: 8000
, 8000
Наш внешний порт помнит, что отображает внутренний порт 3000. Давайте посмотрим, давайте откроем браузер:
Там у нас есть это люди, рабочий контейнер: D
Улучшение нашей настройки с переменными среды
ОК, поэтому мы узнали, как создать наш документ Docker, мы узнали, как запустить контейнер и тем самым наше приложение внутри него. Однако мы могли бы обработать часть с портом немного приятнее. Прямо сейчас нам нужно отслеживать порт, мы начнем Экспресс
Сервер с, внутри нашего app.js , чтобы убедиться, что это соответствует тому, что мы пишем в DockerFile. Это не должно быть таким способом, это просто статическое и ошибка.
Чтобы исправить это, мы могли бы ввести переменную среды. Это означает, что нам нужно сделать две вещи:
- Добавить Переменная среды до DockerFile
- читать Из переменных окружающей среды в App.js
Добавить переменную среды
Для этого нам нужно использовать команду ENV, как так:
Env.
Давайте добавим это на наш Dockerfile, так что теперь это выглядит так:
FROM node:latest WORKDIR /app COPY . . ENV PORT=3000 RUN npm install EXPOSE 3000 ENTRYPOINT ["node", "app.js"]
Давайте сделаем еще одно изменение, а именно для обновления Выставить
Чтобы использовать нашу переменную, поэтому мы избавим от статических значений и вместо этого полагаются на переменные, например:
FROM node:latest WORKDIR /app COPY . . ENV PORT=3000 RUN npm install EXPOSE $PORT ENTRYPOINT ["node", "app.js"]
Примечание выше, как мы меняем наше Выставить
командовать на $ Порт
Любые переменные, которые мы используем, необходимо префиксировать с помощью $
персонаж:
Выставлять $ порт
Прочитайте значение переменной среды в App.js
Мы можем прочитать значения из переменных среды в Node.js, как:
Process.env. Порт
Итак, давайте обновим наш код App.js к этому:
// app.js const express = require('express') const app = express() const port = process.env.PORT app.get('/', (req, res) => res.send('Hello World!')) app.listen(port, () => console.log(`Example app listening on port ${port}!`))
Примечание, когда мы делаем изменения в наших app.js
или наше Dockerfile
Нам нужно восстановить наш образ. Это означает, что нам нужно запустить Docker Build
команда снова и до этого нам нужно порвать наш контейнер с Докер Стоп
и Docker RM
Отказ Больше на этом в предстоящих разделах.
Управление нашим контейнером
Хорошо, так что вы только что начали свой контейнер с Docker Run
И вы замечаете, что вы не можете закрыть его в терминале. Панические наборы в;) На этом этапе вы можете перейти к другому окну терминала и сделать следующее:
докер PS.
Это перечисляет все беговые контейнеры, вы сможете увидеть имя контейнеров, а также это я d. Это должно выглядеть что-то вроде этого:
Как видите выше, у нас есть столбец Container_ID или имена столбца, оба этих значения будут работать, чтобы остановить наш контейнер, потому что это то, что нам нужно сделать, например:
Docker STOP F40.
Мы выбираем использование Container_id и три первых цифры, нам не нужно больше. Это будет эффективно остановить наш контейнер.
Режим демона
Мы можем сделать, как мы сделали выше, и откройте отдельный терминальный вкладку, но работая в режиме Daemon — это лучший вариант. Это означает, что мы запускаем контейнер на заднем плане и все вывод от него не будет видимым. Чтобы это случилось, мы просто добавляем флаг -d
. Давайте попробуем это:
То, что мы получаем сейчас, это просто контейнер ID, это все, что мы когда-либо увидим. Теперь нам легче просто остановить его, если мы хотим, набрав Docker Stop 268
Это три первых цифры из приведенного выше идентификатора.
Интерактивный режим
Интерактивный режим — это интересный, это позволяет нам выйти в бегущий контейнер и файлы списка или добавлять/удалять файлы или практически что мы можем сделать, например, Bash. Для этого нам нужна команда Docker Exec
, вот так:
Выше мы запустим команду:
Docker Exec -it 268 Bash
Примечание, контейнер должен быть запущен и работает. Если вы остановили его ранее, вы должны начать его с Докер начать 268
Отказ Заменить 268
с тем, что у вас есть, когда он был создан, когда вы напечатали Docker Run
Отказ
268
Три первые цифры, если наш контейнер и -Питать
означает интерактивный режим, и наш аргумент Bash в конце означает, что мы запускаем Bash Shell.
Мы также запускаем команду облицовка
, как только мы получим раковину Bash вверх и бегая, так что это означает, что мы можем легко перечислить, что в контейнере, чтобы мы могли проверить, мы построили его правильно Но это хороший способ отлаживать также.
Если мы просто хотим запустить что-то на контейнере, например, команду узла, например, мы можем ввести:
Docker Exec 268 Node App.js
это будет запускать команду Узел App.js
в контейнере
Docker Kill VS Docker Stop
До сих пор мы использовали Докер Стоп
как способ остановить контейнер. Есть еще один способ остановить контейнер, а именно Докер убить
Так что в чем разница?
- Докер Стоп это отправляет сигнал SIGTERM сопровождается Sigkill. после льготного периода. Короче говоря, это способ добиться контейнера более изящным образом, означающим, что он выпускает ресурсы и экономия государства.
- докер убить это отправляет SIGKILL немедленно. Это означает, что Resource Release или Save Save могут не работать как предназначено. В разработке это не имеет значения, что используется одна из двух команд, но в сценарии производства, он, вероятно, мудрее полагаться на
Докер Стоп
Убираться
В ходе развития вы получите создание тонн контейнера, поэтому убедитесь, что вы убираетесь, набрав:
Docker RM ID-контейнер
Резюме
ОК, поэтому мы объяснили Докер с самого начала. Мы охватывали мотивы для использования его и основных концепций. Кроме того, мы смотрели, как подключить приложение и при этом охватывало несколько полезных команд докеров. Есть намного больше, чтобы узнать о Docker, как работать с базами данных, объемами, как связать контейнеры и почему и как вращаться и управлять несколькими контейнерами, также известными как оркестры.
Но это ряд статей, мы должны где-то остановиться, или эта статья будет очень длинной. Оставайтесь настроиться на следующую часть, где мы поговорим о томах и базах данных.
Благодарность
Спасибо …| Дэн Валин Твиттер Для вашего удивительного курса на Docker много вещей докера нажал для меня из-за вашего курса.
Следуй за мной на Twitter Я рад ответить на ваши вопросы и вопросы и предложения по темам.
Оригинал: «https://dev.to/azure/docker—from-the-beginning-part-i-28c6»