Что такое Docker?
Docker реализует концепцию программного обеспечения под названием контейнер. По сути, идея заключается в том, когда вы отправляете код от разработки на производство, вы отправляете свой код внутри контейнера.
Поскольку приложения судна в контейнерах, разработчикам и/или DEVOPS отвечают за создание пользовательского контейнера для их применения. Некоторые придумали термин «докеремизировать» как глагол, что означает «создать контейнер Docker для конкретного приложения или услуги». Одна из первых задач, когда обучение Docker — «докерена» приложение.
Зачем использовать контейнеры?
В первые дни в Интернете было обычное для разработчиков есть набор очень тонких шагов для развертывания. Эти шаги могут включать, в каком-то логическом порядке:
- Создание ZIP (.zip) или файла Tarball (.tar.gz) с исходным кодом.
- Отправка этого файла на хост-сервер. Если вы за корпоративным брандмауэром, вам может придеться отправить его через несколько машин.
- DECOMPRUS В файл, создание нового каталога, а затем Symlinking другие каталоги (например, журналы каталогов и файлов TEMP файла) для подкаталогов этого нового каталога.
- Перезагрузите веб-сервер с новым исходным кодом.
- Удалите артефакт и очистите старые версии исходного кода.
Эта эта модель развертывания имеет много потенциальных проблем.
- Файлы должны быть введены в правильный каталог для веб-сервера, чтобы прочитать их.
- Если процесс развертывания является очень руководством, то координатор развертывания должен быть уверен, что они не допускают ошибку во время этого процесса.
- Это особенно распространено в случае сайтов, которые часто не обновляются.
- Файлы могут быть читабельными на веб-сервере.
- Если файлы были помечены как можно только для читаемого пользователем (в соответствии с разрешениями файлов UNIX), то веб-сервер не сможет получить доступ к ним.
- Управление безопасностью, вокруг которых пользователи будут делать развертывания, добавляет дополнительную сложность.
- Определенные команды требуют
Sudo.
? У кого естьSudo
Права на вашу команду? - Должны ли они требовать добавления пользователя в группу безопасности?
- Определенные команды требуют
- Что если вы создали одну учетную запись пользователя для развертываний?
- Затем члены команды должны будут знать о тех полнотекстовых учетных данных, которые распространяются с возможными ошибками безопасности.
- Старые версии кода должны храниться вокруг, в случае необходимости откатывать назад.
- Если мы накопим старые версии кода, он может начать заполнять файловую систему, вызывая проблемы с жестким диском.
- Файлы журнала также очень быстро растут на жестком диске.
- Инструменты вращения журнала должны быть реализованы для экономии дискового пространства.
- Если известны процессы не реагируют или сбой, тогда нам нужны инструменты мониторинга процессов, чтобы убедиться, что они продолжают быть доступны или выполнять необходимые перезагрузки.
- Процессы с утечками памяти или теми, которые потребляют много циклов ЦП, могут вмешиваться в другие процессы.
- Это может сделать услуги недоступными. Это даже может даже аварийровать хост-систему полностью.
- Там могут быть важные библиотеки, которые должны быть установлены на уровне операционной системы для приложения для правильной работы.
- Если вы всегда держите ту же физическую машину, и те же библиотеки, вы можете установить эти библиотеки один раз, а не беспокойтесь.
- Процесс установки новых библиотек (и проверяющих версий библиотеки) может быть пропорным процессом ошибок.
- Что, если вы должны перейти на новый физический сервер? Становится необходимо установить все библиотеки на новую машину.
Может ли Docker отлично решить все эти проблемы?
Нет
Может ли он решить большинство из них и сделать остальные рутины?
Определенно
Давайте пройдем некоторые преимущества использования Docker. Каждый контейнер может:
- Ограничьте количество процессора, используемое приложение.
- Ограничьте количество памяти, которое использует приложение.
- Ограничьте сетевые ресурсы приложения.
- Следите за своими зависимостями через
Dockerfile
, который описывает процесс создания определенного контейнера. - Отслеживайте здоровье заявления или услуг через проверки здоровья, используя
Docker-Compose
Отказ - Определите сетевые конфигурации между несколькими контейнерами, очень похожие на сеть между физическими машинами.
- Используйте файловую систему только временно.
- Контейнеры не должны быть постоянными, что делает для лучшей воспроизводимости в средах применения.
Важно подчеркнуть, по умолчанию важно подчеркнуть, потому что контейнеры Docker, по умолчанию не имеют постоянной файловой системы, это означает, что когда ваш контейнер выключен, любые созданные файлы или измененные файлы будут сброшены на следующем развертывании контейнера. Убедитесь, что вы знаете об этом, когда вы создаете свой контейнер Docker. Если ваше приложение необходимо хранить данные, это должно быть сделано на некоторой внешней системе, или она должна прикрепить что-то называемое Docker Volume.
Значение воспроизводимых сред
Воспроизводимость является фундаментальным принципом науки. В информатике и его реализация через программную технику воспроизводимость можно найти в единице и тестах интеграции. Докер приносит воспроизводимость в развертывании и дежопах. Есть много преимуществ для этой новой парадигмы:
- Написание и тестирование вашего кода в той же среде, поскольку вы развертываете свой код означает, что есть меньше шансов на ошибки только для производства.
- Все зависимости отслеживаются через изображение контейнера.
- Новый талант в вашей команде может быстро добраться до скорости, запустив и работаю над контейнером.
- Docker Images можно отследить версию, поэтому вы можете откатиться к предыдущим изображениям, когда развертывание будет неудачно.
- Расширение вверх или вниз по количеству экземпляров приложений, баз данных, балансировщиков нагрузки или очереди работы в облаке, таких как AWS или Google Cloud, можно легко автоматизировать с помощью таких инструментов
Docker-Compose
и Кубернеты.
Вся воспроизводимость возможна из-за контейнерных изображений.
Что такое изображение контейнера?
Если вы знакомы с концепциями виртуальных машин (VM), вы, возможно, слышали об изображении VM. Это шаблон для создания новых виртуальных машин. Есть некоторые сходства, но и важные различия.
Контейнерные изображения находятся за слоями. Каждый слой представляет инструкцию докера. Все, кроме последнего слоя, только для чтения. Это позволяет Docker уменьшить размер изображений, разделяя общие слои между беговыми контейнерами. Диаграмма ниже показывает, как вы можете развернуть несколько экземпляров изображения в виде разных контейнеров. Поскольку каждый слой предназначен только для чтения, эти слои могут быть переданы среди нескольких контейнеров без риска повреждения данных. Только последний слой пишется, и этот слой обычно хранится как можно точко.
В следующем разделе мы собираемся докерировать простое приложение Node.js.
Давайте сделаем App.js, чтобы подключить
Для этого учебника мы будем использовать Node.js, поскольку Express — самый популярный Node.js Framework. Для будущего проекта, возможно, мы можем использовать Meteor, который также популярен.
Чтобы создать приложение Express, все, что вам нужно, это один файл JavaScript. Официальная документация показывает Простой «Hello, World» учебник.
const express = require('express') const app = express() app.get('/', function (req, res) { res.send('Hello World') }) app.listen(3000)
Чтобы запустить этот простой веб-сервер, нам нужно дать ему папку. Создать один где-то. Для этого учебника я создаю каталог The-Easy-Node-JS-App-app-Ever
Отказ В этой папке мы собираемся установить Express:
$ cd the-greatest-node-js-app-ever $ npm install express --save $ node app.js Example app listening on port 3000!
Примечание : Если вы на Mac, вы можете увидеть это предупреждение. Вы можете нажать «Разрешить» в этом случае.
Теперь перейдите на свой веб-браузер и перейдите в http://localhost: 3000
Отказ Вы должны увидеть что-то похожее на это:
Добавление пакета .json.
Если мы хотим, чтобы наше приложение было автономным и развертываемым, мы, вероятно, следует отслеживать, какие зависимости мы используем. В Node.js, который обрабатывается файлом под названием package.json
Отказ
{ "name": "the-greatest-node-js-app-ever", "version": "1.0.0", "description": "The Greatest Node.js app ever! On Docker", "author": "Farley Knight", "main": "app.js", "scripts": { "start": "node app.js" }, "dependencies": { "express": "^4.17.1" } }
Номер версии Экспресс
Пакет мог бы измениться с момента этого письма. Обязательно включите последнюю версию вместо ^ 4.17.1
.
После создания package.json
Мы должны установить необходимые пакеты через Установка NPM
. Этот шаг важен, потому что он будет генерировать Package-lock.json
, который блокирует номера версий для всех наших пакетных зависимостей. Блокировка номера версии предотвращает непреднамеренные обновления или понижения.
$ npm install npm notice created a lockfile as package-lock.json. You should commit this file. npm WARN the-greatest-node-js-app-ever@1.0.0 No repository field. npm WARN the-greatest-node-js-app-ever@1.0.0 No license field. added 50 packages from 37 contributors and audited 126 packages in 2.307s found 0 vulnerabilities
Как только у нас есть наш Package-lock.json
Файл, мы можем создать Dockerfile
Отказ
Создание докерафила
Мы собираемся использовать следующий контент для наших Dockerfile
Отказ
FROM node:10 # Create a directory called `/workdir` and make that the working directory ENV APP_HOME /workdir RUN mkdir ${APP_HOME} WORKDIR ${APP_HOME} # Install all of the packages mentioned in `package.json` RUN npm install # Copy the project over COPY . ${APP_HOME} # We'll access the app via port 3000 EXPOSE 3000 # Run this command when the container is ready ENTRYPOINT ["node", "app.js"]
В будущем уроке мы пойдем на детали этих строк. На данный момент мы будем продолжаться с процессом построения контейнера докера.
Создание контейнера докеров
Контейнеры Docker основаны на документах Docker. Вы можете думать о изображении, как установочный пакет. Он содержит все необходимые данные для запуска контейнера. Во время процесса развертывания будет отправлен изображение докера. Затем хост будет использовать это изображение для создания контейнера.
Чтобы построить изображение, убедитесь, что вы находитесь в каталоге проекта и запустите Docker Build.
.
$ docker build . Sending build context to Docker daemon 3.584kB Step 1/8 : FROM node:10 10: Pulling from library/node 3192219afd04: Extracting [===========================================> ] 39.45MB/45.38MB ... ...
Это может занять некоторое время, но вы должны увидеть много активности из этой одной одной команды. В конце процесса будет высказывание линии Успешно построен C132A227961B
(Хотя ваш будет иметь другой идентификатор изображения, чем мой).
$ docker build . ... ... Step 9/9 : CMD ["node", "app.js"] ---> Running in a812b758efa8 Removing intermediate container a812b758efa8 ---> c132a227961b Successfully built c132a227961b
Кстати, не забывайте Отказ
в конце, Что необходимо. Он говорит Docker построить изображение на основе Dockerfile
В текущем каталоге.
Мы можем увидеть список всех наших изображений докера бегущей Docker Images
Отказ
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZEc132a227961b About a minute ago 910MB
Список изображений сортируется в первую очередь, поэтому вы должны увидеть ваше изображение, указанное здесь с идентификатором изображения (в моем случае C132A227961B
). Однако под Репозиторий
и Тег
это только показывает <Нет>
Отказ Не критично, что те, которые будут заполнены ценностями. Ваш контейнер может работать просто без них. Но, пытаясь вспомнить, что идентификатор изображения — это процесс, склонный к ошибкам. К счастью, Docker дает нам возможность назвать и течь наши изображения.
Отдавая ваше изображение имя
Гораздо проще, если мы дадим наши изображения читаемые имена человека. Давайте восстановим изображение, но на этот раз с --tag
флаг.
$ docker build --tag the-greatest-node-js-app-ever-on-docker . Sending build context to Docker daemon 2.006MB Step 1/9 : FROM node:10
Бег Docker Images
Опять дает нам контейнер с именем:
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE the-greatest-node-js-app-ever-on-docker latest c132a227961b About a minute ago 910MB
Превращение изображения в контейнер
Теперь, когда у нас есть изображение, мы можем сказать Docker запустить его, что создаст наш контейнер.
$ docker run --detach --publish 3000:3000 the-greatest-node-js-app-ever-on-docker 03665844b45a03e88a813c815c8d02d72712b27faa2332975778e0a847fad41d
Команда Docker Run
нуждается в нескольких аргументах командной строки:
--detach
— Этот флаг говорит Docker запустить контейнер и немедленно отсоединить из оболочки. Другими словами, контейнер докера теперь должен работать на заднем плане.--publish 3000: 3000
—Опубликовать
Флаг — сделать порт, доступный для внешнего мира. В этом случае мы отображаем внутренний порт 3000 к внешнему порту 3000. Поэтому мы можем получить доступ к нашему приложению Express Viahttp://localhost: 3000
Отказ Если бы мы хотели, мы могли бы установить это на--publish 80: 3000
И это будет означать, чтоhttp://localhost
будет ссылка на доступ наше приложение.- Будьте внимательны к упорядочению. Синтаксис
80: 3000
Значит, внешний мир увидит порт 80, но внутри контейнера Docker мы используем порт 3000. Многие команды UNIX используют источник заказа сначала, цель второго. Но порт Докера обращен в обратную связь: цель первого, источника второго.
- Будьте внимательны к упорядочению. Синтаксис
The-Easyest-Node-JS-App-Ever-On-Docker
— имя изображения, которое мы хотим использовать, должен быть последним аргументом.
Чтобы убедиться, что все работает правильно, перейдите на свой веб-браузер и дважды проверьте http://localhost: 3000
Похоже:
Теперь, когда наш контейнер работает, давайте обсудим, как управлять этим.
Docker Container Management
Подобно как мы управляем процессами на машине, используя командную строку PS. -ауэкс
(где PS
не хватает процессов), у нас есть похожая команда для докера, что является Docker PS
Отказ Это то, что мой похоже, во время написания этого руководства:
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES db032070bda8 the-greatest-node-js-app-ever-on-docker "docker-entrypoint.s…" 6 seconds ago Up 5 seconds 0.0.0.0:3000->3000/tcp jovial_carson
Как и большинство процессов, этот контейнер докеров работает на заднем плане. Изящно выключить или остановить этот контейнер, мы можем запустить Докер Стоп <Контейнер-ID>
Отказ В нашем случае идентификатор контейнера — db032070bda8
Отказ
$ docker stop db032070bda8
Также как большинство процессов, контейнеры иногда могут быть не реагированы при попытке изящного отключения и должны быть вынуждены отключить. Для обычных процессов мы бы использовали Убить -9
команда. Для докера команда — это Docker Kill
Отказ
$ docker kill db032070bda8
Взаимодействие с вашим контейнером
Контейнер Docker предназначен для выступления в качестве изолированной среды, почти как отдельный хост-машина. Это означает, что вы можете «войти» и запустить раковину Bash внутри вашего контейнера. Как только вы внутри контейнера, вы можете оглянуться и проверить, ваше приложение работает должным образом. Команда для этого — Docker Exec -it <контейнер-идентификатор>/bin/bash
. Флаг -Я
Стенды для интерактивного и флага -t
используется для создания сеанса TTY, очень похоже на сессию SSH.
$ docker exec -it db032070bda8 /bin/bash root@db032070bda8:/workdir# pwd /workdir root@db032070bda8:/workdir# ls Dockerfile app.js node_modules package-lock.json package.json root@db032070bda8:/workdir#
Снятие остановленного контейнера и изображения
Управление Docker означает создание и поддержание коллекции контейнеров и изображений и выполнение их по мере необходимости. Он также включает в себя удаление этих контейнеров и изображений также. В большинстве Unix подобных средах, RM
Команда удаляет файл.
Шаги для удаления старых контейнеров и изображений:
- Сначала запустите команду
Docker RM <Контейнер-ID>
удалить контейнер. - Наконец запустите команду
Docker RMI
Чтобы удалить изображение.
Обратите внимание, что даже когда вы остановите контейнер, он все еще управляется Docker. Поскольку контейнеры полагаются на изображения, вы должны сначала удалить остановленную контейнер, затем вы можете удалить изображение. Если вы не запускаете эти два шага в порядке, вы получите сообщение об ошибке, как это:
$ docker rmi c132a227961b Error response from daemon: conflict: unable to delete c132a227961b (must be forced) - image is being used by stopped container db032070bda8
Если вы запустите команды в правильном порядке, он должен выглядеть что-то подобное:
$ docker rm db032070bda8 db032070bda8 $ docker rmi c132a227961b Untagged: the-greatest-node-js-app-ever-on-docker:latest Deleted: sha256:c132a227961bf42ac0664e7ab470931ae440661a4eae98b286016cd5a20c3c46 Deleted: sha256:ca7c95922974a846620e0ce42fbc65b585b58457ca30a9910687d2a701f598fa Deleted: sha256:3e2c92e96f06d4282152faf9f81c9fb5bd138f57786112775afed57ba12a1f1b Deleted: sha256:ac7b17970c321c61a620b284f81825e2867b7477a552a485ce2226ac2b06004d Deleted: sha256:9ca2186b2dfe59cc5eed7b6ff743da708d35d5c14445d49048cf8924d6017767 Deleted: sha256:ed667d696e50cb479043af9725dbd5f40e300e923192c4e337f40ce95a1dfa1a Deleted: sha256:9f49958e02bd156c2ba0a0cef23736dfcab645a4f40f6590a48df9674c723c0a Deleted: sha256:bf5333fd26a86ab238b781f2012e0c47d09b978ae39372e2fb441adce07e1c05
Заключение
В этом посте мы охватывали основы Docker, какие контейнеры и изображения и как они полезны в мире разработки программного обеспечения. Мы обсудили, какие образы Docker есть и как они производят Docker Containers. Кроме того, мы объяснили значение контейнеров и изображений и показали, как подключить очень простое приложение Node.js. В будущих постах я надеюсь обсудить DockerFile более подробно, а также тома докера и докера.
Оригинал: «https://dev.to/farleyknight/docker-basics-containers-and-images-od9»