Как Docker может облегчить вашу жизнь как разработчика

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

Что такое докер?

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

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

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

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

  2. Воспроизводимые среды: вы можете запустить систему, очень близкую к производственной, на вашем компьютере для разработки. Это значительно упрощает поиск ошибок. Гораздо менее вероятно, что ошибка возникла из-за того, что кто-то забыл запустить команду в производственной среде. Или, как говорится в старом оправдании: «Это сработало на моей машине».

  3. Инструменты управления инфраструктурой: вы можете воспользоваться инструментами и технологиями, которые обрабатывают подготовку, сетевое взаимодействие, балансировку нагрузки и масштабирование контейнеров, таких как Docker Swarm или Kubernetes.

  4. Управление зависимостями: например, если у вас есть две службы, которым требуются разные версии Python, вы можете запускать обе эти службы на одной виртуальной машине, но в разных контейнерах, и их зависимости не будут мешать друг другу.

  5. Новые члены команды: у компаний обычно есть гигантский, неправильный и неполный документ о том, как настроить машину разработчика, который чертовски расстраивает новых членов команды. Контейнеры могут помочь вам улучшить это. Ваша среда разработки может быть полностью настроена с помощью сценария 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, чтобы увидеть, как это приложение работает.

Вы должны увидеть что-то вроде этого:

приложение-контейнер aspnet вбраузере{.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, я рекомендую вам это сделать.

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus