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

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

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

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

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

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

Почему Докер?

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

Помимо создания контейнерных приложений, Docker также очень популярен для создания тестов и интеграции их в ваш рабочий процесс CI/CD. Опять же, это потому, что вы можете гарантировать, что каждый тест выполняется в совершенно новой и изолированной среде, поэтому на тесты не должны влиять побочные эффекты от других тестов.

Наконец, поскольку вы можете быстро запускать и останавливать контейнеры Docker на лету, у вас есть много возможностей программно делать некоторые действительно интересные вещи с помощью Docker. Например, есть компания Удаленное собеседование, которая позволяет компаниям устанавливать кодовые тесты для потенциальных сотрудников. Кандидат отправляет код онлайн, программное обеспечение Remote Interview запускает некоторые тесты, и кандидат выясняет, прошли ли тесты или нет. И какие технологии они используют для тестирования кода кандидатов? Докер, конечно! Каждый раз, когда кандидат отправляет новый фрагмент кода, он запускает новый контейнер Docker для тестирования своего кода. У них даже есть общедоступный репозиторий GitHub, чтобы вы могли сами увидеть, как это работает.

Примеры начала работы

Все примеры, которые я привожу ниже, относятся к проектам JavaScript/NodeJs, но достаточно просто модифицировать их для разных языков/фреймворков.

Я также предполагаю, что на вашем компьютере установлен Docker. Если нет, сделайте это сейчас.

Страница загрузки Docker Desktop

Привет мир

Какое руководство по кодированию было бы полным без примера Hello World?

Начните с создания файла index.js и добавления в него одной строки кода:

console.log('Hello World');

Затем в том же каталоге, что и ваш файл JavaScript, создайте файл с именем Dockerfile (да, без расширения). Это файл, который будет использоваться для создания образа вашего контейнера Docker. Образ — это всего лишь шаблон для создания контейнеров Docker. Dockerfile должен выглядеть так:

FROM node:latest 
WORKDIR /hello-world
COPY ./index.js . 
CMD ["node", "./index.js"]

Давайте пройдемся по этому построчно.

  • FROM node:latest — в Docker Hub есть тысячи предварительно сконфигурированных образов Docker, которые мы можем использовать в качестве основы для наших собственных образов — поэтому есть вероятность, что вы всегда сможете найти базовый образ для своего приложения. В нашем случае мы хотим начать с последнего образа Node в качестве основы, в котором будет все настроено для запуска приложения Node.
  • WORKDIR /hello-world — устанавливает рабочий каталог в контейнере на hello-world.
  • КОПИРОВАТЬ ./index.js . — копирует файл index.js с нашей машины в рабочую директорию контейнера Docker.
  • CMD ["node", "./index.js"] — запускает Node с index.js в качестве точки входа.

Теперь нам нужно создать наш образ. Откройте окно консоли и перейдите в каталог, содержащий файлы index.js и Dockerfile, и введите:

docker build -t hello-world .

Это создаст образ Docker с тегом hello-world из Dockerfile в этом каталоге. Теперь мы используем тег, чтобы указать Docker запустить этот контейнер:

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

Если все работает, теперь вы должны увидеть Hello World на экране. Поздравляем! Вы запустили свое первое приложение в Docker.

Создание контейнера Docker из репозитория GitHub

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

Поскольку этот контейнер Docker должен быть немного более сложным и динамичным, мы напишем сценарий оболочки Bash, который запускается в контейнере Docker. Итак, начните с создания нового каталога и создания файла с именем docker.sh:

repository_url=$1 
branch=$2 
git clone --single-branch --branch $branch $repository_url 
cd $(ls -d */|head -n 1) 
yarn install
yarn test

Опять же, я объясню это построчно.

  • #!/bin/bash — в Linux это называется шебангом и просто сообщает консоли, что это скрипт Bash.
  • репозиторий_url=$1/branch=$2 — $1 и $2 — это первый и второй аргументы командной строки соответственно. Здесь мы просто присваиваем их переменным, чтобы было понятнее, что они представляют. Когда мы запускаем наш контейнер Docker, мы передаем URL-адрес нашего репозитория GitHub и ветку, которую мы хотим клонировать, в качестве аргументов для контейнера.
  • git clone… — клонирует репозиторий Git и извлекает нужную ветку. Параметр --single-branch означает, что загружается только эта ветка, что экономит время при запуске контейнера.
  • yarn install/yarn test — предполагается, что репозиторий GitHub, который мы клонируем, является проектом Node, в котором есть файл packages.json с определенным скриптом тестирования. Это установит все зависимости Node и запустит скрипт тестирования. Конечно, вы могли бы подумать о том, чтобы сделать это более динамичным, но для моих целей это прекрасно работает.

В этом же каталоге нам снова понадобится наш Dockerfile:

FROM node 
RUN apt-get update 
RUN apt-get install dos2unix -y 
COPY docker.sh /test/docker.sh 
WORKDIR /test 
RUN dos2unix ./docker.sh 
ENTRYPOINT ["./docker.sh"]

Здесь я устанавливаю dos2unix и запускаю свой файл ./docker.sh. Это необходимо только в том случае, если вы (как и я) написали сценарий оболочки Bash на компьютере с Windows. Это связано с тем, что окончания строк необходимо преобразовать из формата Windows в формат Unix, чтобы сценарий выполнялся правильно.

Указав скрипт docker.sh в качестве точки входа (пока без каких-либо аргументов), этот скрипт будет выполняться при запуске контейнера Docker. Мы также можем выбрать наши аргументы во время команды docker run, чтобы мы могли динамически выбирать, какой репозиторий тестировать.

Затем мы можем запустить:

docker build -t github-repo . 
docker run --rm github-repo https://github.com/walpoles93/basic-jest-test.git master

Я создал базовый репозиторий Github, который вы можете использовать для этого урока. Надеюсь, это также поможет в качестве отправной точки для ваших собственных проектов!

Все идет хорошо, вы должны увидеть, что репозиторий Git клонирован, и тесты Jest выполняются для проекта.

Вывод

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

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

Первоначально опубликовано на https://samwalpole.com.