Что такое докер?
Docker - это технология, которая позволяет создавать и запускать контейнеры для ваших приложений. Контейнеры - это изолированные среды, которые запускают приложение и включают его зависимости. Обычно они минимальны, включают только то, что вам нужно для запуска вашего приложения, и ничего больше.
Контейнеры не предназначены для хранения постоянных данных. Ожидается, что ваш контейнер может быть уничтожен и воссоздан в любое время, поэтому любые данные, сохраненные в самом контейнере, будут потеряны. Он должен просто содержать двоичные файлы и код, необходимые для запуска вашего приложения, с любыми постоянными данными, хранящимися извне, например, на подключенных томах или в облачной базе данных.
Использование контейнеров для разработки и развертывания приложения дает ряд преимуществ:
-
Отсутствие человеческой ошибки: каждый раз при развертывании создается предсказуемая среда. Вместо того, чтобы ваш системный администратор запускал команды через SSH на виртуальном сервере, теперь у вас есть документированный сценарий в исходном коде того, что развертывается в вашем контейнере.
-
Воспроизводимые среды: вы можете запустить систему, очень близкую к производственной, на вашем компьютере для разработки. Это значительно упрощает поиск ошибок. Гораздо менее вероятно, что ошибка возникла из-за того, что кто-то забыл запустить команду в производственной среде. Или, как говорится в старом оправдании: «Это сработало на моей машине».
-
Инструменты управления инфраструктурой: вы можете воспользоваться инструментами и технологиями, которые обрабатывают подготовку, сетевое взаимодействие, балансировку нагрузки и масштабирование контейнеров, таких как Docker Swarm или Kubernetes.
-
Управление зависимостями: например, если у вас есть две службы, которым требуются разные версии Python, вы можете запускать обе эти службы на одной виртуальной машине, но в разных контейнерах, и их зависимости не будут мешать друг другу.
-
Новые члены команды: у компаний обычно есть гигантский, неправильный и неполный документ о том, как настроить машину разработчика, который чертовски расстраивает новых членов команды. Контейнеры могут помочь вам улучшить это. Ваша среда разработки может быть полностью настроена с помощью сценария bash.
Наконец, стоит упомянуть, что, хотя Docker почти синонимичен с контейнерами, существуют и другие контейнерные технологии, такие как rkt . В этой статье мы сосредоточимся на Docker, но хорошо знать, что есть и другие варианты.
Docker - это также компания, которая продает корпоративные решения для контейнеров. Однако ядро Docker и настольные продукты Docker можно использовать бесплатно. Движок Docker использует containerd с открытым исходным кодом.
Установка Docker
Вы можете установить Docker Desktop на Windows и Mac. В нем есть множество полезных инструментов, в том числе Docker Compose:
Вы можете установить Docker Server в Linux. И вы также можете установить другие инструменты отдельно, например, Docker Compose:
Создание образа на базе Alpine Linux
Образ Docker - это двоичный файл, содержащий файлы, необходимые для
запуска и запуска контейнера Docker. Образы Docker создаются с помощью
серии команд в файле с именем Dockerfile
. Эти команды настраивают
образ и сообщают Docker, какую команду выполнять при запуске контейнера.
Alpine Linux - это легкий дистрибутив Linux, который популярен среди контейнеров из-за своего небольшого размера и минимального багажа. Небольшие дистрибутивы популярны, потому что они сокращают время сборки образа и обеспечивают более точный контроль над устанавливаемыми вами зависимостями.
Вот пример Dockerfile, который настолько прост, насколько это возможно:
FROM alpine:3.9
CMD echo "hello world"
Первая команда использует в качестве основы образ Docker alpine:3.9
Он
захватит изображение для этого, а затем запустит остальные команды
против него. По умолчанию Docker получает эти образы из реестра
Docker , но при
необходимости это можно изменить.
Вторая команда - это команда для запуска контейнера. Здесь мы просто
запускаем echo
поэтому на консоль Hello World
Контейнер будет
оставаться в живых только до тех пор, пока выполняется эта команда,
поэтому в этом случае он немедленно выйдет и закроет контейнер.
Для контейнеров, которые должны работать постоянно, последняя команда обычно запускает процесс, который никогда не останавливается, например веб-сервер или ядро базы данных.
Запуск контейнера из вашего образа
Выполните следующую команду в том же каталоге, что и Dockerfile, чтобы создать образ контейнера, и пометьте его тегом «myimage»:
$ docker build -t myimage .
Результат выполнения этого примерно такой:
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM alpine:3.9
3.9: Pulling from library/alpine
bdf0201b3a05: Pull complete
Digest: sha256:28ef97b8686a0b5399129e9b763d5b7e5ff03576aa5580d6f4182a49c5fe1913
Status: Downloaded newer image for alpine:3.9
---> cdf98d1859c1
Step 2/2 : CMD echo "hello world"
---> Running in db62be8c00ca
Removing intermediate container db62be8c00ca
---> d351cb9614ec
Successfully built d351cb9614ec
Successfully tagged myimage:latest
Затем, используя тег в качестве ссылки, мы можем запустить контейнер:
$ docker run -t myimage
Результат:
hello world
Файлы Docker могут намного больше. Например, они могут копировать файлы из файловой системы в образ и переключать базовые образы, чтобы в качестве основы для запуска контейнера использовалось другое изображение. Мы увидим пример этих функций в следующем разделе.
Пример использования: запуск проекта с открытым исходным кодом с помощью файла Docker
В настоящее время для проектов с открытым исходным кодом все более распространено предоставление файла Dockerfile, чтобы упростить настройку и просмотр работающего приложения. Это может помочь новичкам запустить проект, не тратя время на установку множества зависимостей на свой компьютер.
Если вы пишете программное обеспечение с открытым исходным кодом, вы можете рассмотреть возможность раскрытия файла Docker, у проекта есть ряд зависимостей. Для простого проекта Node.js это может не стоить того, но для чего-то, что запускает Node, Ruby и MySQL, вы можете сделать это, чтобы немного облегчить жизнь людям, у которых они еще не установлены.
В этом примере мы возьмем приложение с открытым исходным кодом, написанное на платформе Microsoft .NET Core, и запустим его в Docker. Приложение представляет собой пример, созданный специально для Docker, и его можно найти по следующей ссылке:
https://github.com/dotnet/dotnet-docker-samples/tree/master/aspnetapp
Первый шаг - клонировать этот репозиторий, чтобы он был у нас локально:
$ git clone https://github.com/dotnet/dotnet-docker-samples
Если вы раньше не использовали Git, вы можете установить его отсюда . Неважно, что вы хорошо разбираетесь в git, поскольку мы используем его только для загрузки исходного кода.
После клонирования откройте dotnet-docker-samples/aspnetapp
,
просмотрите файлы и обратите внимание на наличие файла Dockerfile. Что
на момент написания выглядит так:
FROM microsoft/aspnetcore-build:2.0 AS build-env
WORKDIR /app
# copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore
# copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out
# build runtime image
FROM microsoft/aspnetcore:2.0
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "aspnetapp.dll"]
Этот файл Dockerfile основан на образе от Microsoft для создания приложений ASP.NET и запускает команды для копирования файлов и их сборки. Затем он переключает изображения на изображения от Microsoft для запуска приложения ASP.NET, копирует созданные файлы в текущий каталог, а затем запускает для них среду выполнения ASP.NET.
Если вы никогда раньше не использовали ASP.NET, вы скоро сможете сказать, что создали, установили и запустили приложение ASP.NET. Все, что вам нужно было сделать, это ввести пару команд Docker!
Чтобы создать образ, выполните следующие команды из командной строки:
$ cd dotnet-docker-samples/aspnetapp
$ docker build -t aspnetapp .
$ docker run -it --rm -p 8000:80 aspnetapp
Это создаст образ, а затем запустит контейнер, использующий этот образ, сопоставив порт 8000 на вашем компьютере с портом 80 внутри образа. Теперь вы можете посетить http: // localhost: 8000, чтобы увидеть, как это приложение работает.
Вы должны увидеть что-то вроде этого:
{.ezlazyload .img-responsive}
Docker Compose
Проблема, с которой вы быстро столкнетесь при запуске одного контейнера, заключается в том, что нелегко настроить контейнер для выполнения множества разных задач, таких как обработка файлов PHP, размещение базы данных MySQL и работа в качестве веб-сервера с использованием NGINX.
В этом также нет необходимости, потому что контейнеры настолько легкие (в отличие от виртуальных машин), а это означает, что нет проблем с тем, чтобы их группа работала на одной машине и выполняла разные задачи.
Преимущество нескольких контейнеров и образов состоит в том, что это дает вам возможность разделить их между разными виртуальными машинами или физическими машинами и даже создать несколько контейнеров из одного образа на разных машинах для обработки дополнительной нагрузки приложения.
Проблема с несколькими контейнерами заключается в том, как настроить их, чтобы они знали, как взаимодействовать друг с другом по сети с соответствующей безопасностью и как подключать хранилище к этим контейнерам. К счастью, есть несколько различных вариантов решения этой проблемы "оркестровки" контейнеров.
Возможно, самый простой способ начать работу с Docker Compose .
Docker Compose использует файл, в котором описываются компоненты, необходимые для запуска системы. Это могут быть контейнеры, файловые системы, открытые сетевые порты и т. Д.
Вот пример docker-compose.yml
который описывает такую настройку:
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
В показанном выше файле Docker Compose мы запускаем два контейнера. Один
создается из локальной папки, а другой использует образ Redis. Имеется
информация о том, какой том нужно смонтировать, например, текущая папка
сопоставлена с /code
внутри веб-контейнера, а папка logvolume01
сопоставлена с /var/log
внутри контейнера.
Команда docker-compose up
используется для запуска контейнеров и
монтирования томов, а также для запуска и запуска всего, что вы описали
в файле docker-compose.yml
Вы можете использовать это как для среды
разработки, так и для производственной среды.
Kubernetes
Docker Compose - отличный инструмент для начала склеивания контейнеров, но он ограничен в функциональности для производственных сред и работает только на одном хосте. Вам понадобится другая технология для работы на нескольких машинах и обеспечения отказоустойчивости, мониторинга и масштабирования.
Kubernetes - это контейнерная архитектура с открытым исходным кодом. Он управляет контейнерами и имеет широкий спектр функций, включая создание динамических контейнеров, масштабирование, отказоустойчивость, проверку контейнеров на наличие признаков жизни и балансировку нагрузки. Название происходит от греческого κυβερνήτης, что означает рулевой. Иногда его сокращают как K8s, хотя я не уверен, почему, поскольку это не очень длинное название для начала.
Kubernetes можно установить прямо на виртуальные или физические машины. В качестве альтернативы, все основные облачные провайдеры, включая Google, AWS, Azure и Digital Ocean, предоставляют управляемые сервисы Kubernetes, которые упростят настройку и запуск кластера.
Чтобы познакомиться с Kubernetes, нужно немного изучить. В этом не будет особого смысла, если вы просто будете копаться без каких-либо базовых знаний. По этому поводу есть базовый бесплатный курс edX , который я использовал, чтобы помочь мне начать с этого на работе.
Kubernetes - не единственная технология для оркестровки контейнеров: есть также Docker Swarm, Vagrant, Monad, Openshift и многие другие. Я считаю, что Kubernetes предлагает «беспроигрышную ставку» с точки зрения поддержки в будущем, начиная с 2019 года. Все основные облачные провайдеры поддерживают его, и недавно Microsoft объявила, что они вытесняют свой собственный контейнерный сервис в пользу Kubernetes. .
Заключение
Docker может сделать вашу жизнь как разработчика программного обеспечения более удобной. Его можно использовать для предсказуемого запуска различных сред на вашем компьютере разработчика. Он также используется в производственной среде, обычно с системой оркестровки, такой как Kubernetes, для обеспечения предсказуемого развертывания ваших приложений на серверах. Если вы еще не пробовали Docker, я рекомендую вам это сделать.