Найти тему
МАРС Телеком

Понять Docker шаг за шагом

Оглавление

Это просто простая демонстрация, чтобы получить общее представление о том, как докер работает, шаг за шагом. Я изучил Docker таким образом и хочу поделиться некоторыми проблемами, с которыми я столкнулся в процессе обучения, для того чтобы помочь другим новичкам.

Требования

  • Вам нужно установить Docker для вашей ОС.
  • Вам нужно установить Docker Compose для вашей ОС.

Докер

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

Википедия определяет Docker как

Представляет собой набор продуктов платформа как услуга (PaaS), которые используют виртуализацию на уровне ОС для доставки программного обеспечения в пакетах, называемых контейнерами. Контейнеры изолированы друг от друга и включают в себя собственное программное обеспечение, библиотеки и файлы конфигурации; они могут общаться друг с другом через четко определенные каналы. Все контейнеры выполняются одним ядром операционной системы и поэтому используют меньше ресурсов, чем виртуальные машины.

Черт, довольно громкие слова! На непрофессиональном языке Docker помогает вам проще развернуть ваши приложения в «песочнице» (называемые контейнерами) для запуска в операционной системе хоста. Основное преимущество Docker заключается в том, что он позволяет упаковывать программное обеспечение со всеми его зависимостями в единый стандартизированный модуль.

Что такое контейнер?

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

Зачем использовать контейнеры?

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

Начинаем

Настройка вашей машины

После завершения установки Docker протестируйте установку Docker, выполнив следующее:

docker run hello-world
Hello from Docker.
This message shows that your installation appears to be working correctly.
...

Написание вашего первого Dockerfile

1. Dockerfile - это текстовый документ, который содержит все команды, которые вы можете вызывать в командной строке для создания образа. Создайте файл hello.js и скопируйте в него этот код. Здесь мы в основном написали простой код JS для отображения Hello World по адресу localhost:8888.

var http = require("http");
http.createServer(function (request, response) {
response.writeHead(200, {'Content-Type': 'text/plain'});
response.end('Hello World\n');
}).listen(8888);
// Console will print the message
console.log('Server running at http://127.0.0.1:8888/');

2. Создайте файл с именем Dockerfile и скопируйте в него этот код.

FROM node:8
LABEL maintainer="championshuttler@gmail.com"
RUN npm install
ADD hello.js /hello.js
EXPOSE 8888
ENTRYPOINT [ "node", "hello.js" ]

Даже если это первый Dockerfile, который вы когда-либо видели, я бы сказал, что вы можете догадаться, что здесь происходит.

Dockerfile дает такие инструкции: Начните с образа узла, добавьте его «championshuttler@gmail.com» в качестве сопровождающего, запустите npm install для установки зависимостей, скопируйте файл в код приложения, задокументируйте сетевой порт приложения и установите hello.js в качестве приложения для запуска по умолчанию.

Создание ваших Docker Images

Теперь мы создадим образ докера на нашей локальной машине. Откройте свой терминал в папке текущего проекта и запустите

docker build -t helloworld .

Здесь вы говорите Docker создать образ, который называется helloworld на основе содержимого текущего каталога (обратите внимание на точку (.) В конце команды build). Docker будет искать Dockerfile в каталоге и создавать образ на основе инструкций в файле.

Запуск образа докера

После построения образа Docker следующим шагом будет запуск образа и проверка его работоспособности:

docker run -p 8888:8888 helloworld

Команда, которую мы только что запустили, использовала порт 8888 для сервера внутри контейнера и выставила его внешне на порт 8888. Перейдите к URL-адресу с портом 8888:

-2

Поздравляем! Вы успешно создали свой первый образ докера.

Понимание образов Docker и слоев образа

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

-3

Образ Docker содержит все упакованные вами файлы, которые становятся файловой системой контейнера, а также содержит много метаданных о самом образе. Это включает в себя краткую историю того, как образ был построен. Вы можете использовать это, чтобы увидеть каждый слой образа и команду, которая создала этот слой. Вы можете проверить историю helloworld образа, используя:

docker image history helloworld
IMAGE CREATED CREATED BY COMMENT
cb84eb33ca20 58 seconds ago /bin/sh -c #(nop) ENTRYPOINT ["node" "hello…
7d652a817a9f 58 seconds ago /bin/sh -c #(nop) EXPOSE 8888
334575e947c9 59 seconds ago /bin/sh -c #(nop) ADD file:b9606ef53b832e66e…

Эти CREATED BY команды инструкции Dockerfile - есть отношения один к одному, так что каждая строка в Dockerfile создает слой образа.

Отправка ваших собственных образов в Docker Hub

Сначала вам необходимо войти в систему с помощью учетной записи dockerhub.

docker login --username $dockerId

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

Мы создали образ Docker под названием helloworld. Эта ссылка на образ не имеет имени учетной записи, поэтому мы не можем отправить его в другие реестры. Нам не нужно перестраивать образ, чтобы дать ему новую ссылку, хотя образы могут иметь несколько ссылок. Пометьте свой образ следующим образом:

docker image tag helloworld $dockerId/helloworld:v1

Теперь у нас есть ссылка на образ с нашим идентификатором Docker в имени учетной записи, и мы вошли в Docker Hub, поэтому мы готовы поделиться своим образом! Команда docker image push является аналогом команды pull, она загружает наши локальные слои образа в реестр:

docker image push championshuttler/helloworld:v1
The push refers to repository [docker.io/championshuttler/helloworld]
9519a21ac374: Pushed

Эффективное использование тегов образа

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

Многие программные проекты используют цифровую схему управления версиями с десятичными точками, чтобы указать, насколько велика разница между версиями, и вы можете следить за этим с помощью тегов образа. Основная идея - что-то вроде [major]. [Minor]. [Patch], которая имеет некоторые неявные гарантии. Релиз, который только увеличивает номер патча, может содержать исправления ошибок, но должен иметь те же функции, что и предыдущая версия; выпуск, который увеличивает младшую версию, может добавить функции, но не должен удалять их; основной выпуск может иметь совершенно разные функции.

Развертывание мультиконтейнерных приложений с помощью Docker Compose

Что такое Docker Compose

Большинство приложений не работают в одном компоненте. Даже большие старые приложения обычно создаются как внешние и внутренние компоненты, которые представляют собой отдельные логические уровни, работающие в физически распределенных компонентах. Docker идеально подходит для запуска распределенных приложений - от n-уровневых монолитов до современных микросервисов. Каждый компонент работает в своем собственном облегченном контейнере, и Docker подключает их вместе, используя стандартные сетевые протоколы. Вы определяете и управляете такими мультиконтейнерными приложениями, используя Docker Compose. Docker Compose - это инструмент для определения и запуска многоконтейнерных приложений Docker. С Compose вы используете YAML файл для настройки служб вашего приложения. Затем с помощью одной команды мы создаем и запускаем все службы из вашей конфигурации.

Файл Docker Compose описывает желаемое состояние вашего приложения - как оно должно выглядеть, когда все работает. Это простой формат файла, в котором вы записываете все параметры, которые вы помещаете в команды запуска контейнера Docker, в файл Compose. Затем вы используете инструмент Docker Compose для запуска приложения. Он определяет, какие ресурсы Docker ему необходимы - это могут быть контейнеры, сети или тома - и отправляет запросы в API Docker для их создания. Имя по умолчанию для файла Compose YAML docker-compose.yml. Однако мы можем использовать флаг -f для указания пользовательских имен файлов.

Давайте начнем.

Ниже код показывает очень простой Docker Compose файл, который определяет небольшое приложение Flask с двумя службами (веб-интерфейс и Redis). Приложение представляет собой простой веб-сервер, который подсчитывает количество посещений и сохраняет значение в Redis.

version: "3.5"
services:
web-frontend:
build: .
command: python app.py
ports:
- target: 8888
published: 8888
networks:
- counter-net
volumes:
- type: volume
source: counter-vol
target: /code
redis:
image: "redis:alpine"
networks:
counter-net:
networks:
counter-net:
volumes:
counter-vol:

  • version - ключ необходим, и он должен всегда быть первой строкой файла. Это объясняет версию Compose fileформата (в основном API).
  • services - ключ верхнего уровня - это место, где мы определяем различные сервисы приложений. Пример, который мы используем, определяет два сервиса; веб-интерфейс называется web-frontend и база данных в памяти называется Redis. Compose будет развертывать каждый из этих сервисов как свой собственный контейнер.
  • networks - ключ верхнего уровня сообщает Docker о создании новых сетей. По умолчанию Compose создаст мостовые сети. Это сети с одним хостом, которые могут подключать контейнеры только на одном хосте.

В рамках определения службы веб-интерфейса мы даем Docker следующие инструкции:

  • build: Это говорит Docker о создании нового образа, используя инструкции в Dockerfile в текущем каталоге (.). Вновь созданный образ будет использоваться для создания контейнера для этого сервиса.
  • command: python app.py Это говорит Docker запустить приложение Python с именем app.py в качестве основного приложения в контейнере. Файл app.py должен существовать в образе, и образ должен содержать Python. Dockerfile выполняет оба эти требования.
  • ports: Говорит Docker для сопоставления порта 8888 внутри контейнера (-target) с портом 8888 на хосте (опубликовано). Это означает, что трафик, отправляемый на хост Docker через порт 8888, будет направлен на порт 8888 контейнера. Приложение внутри контейнера прослушивает порт 8888.
  • networks: Сообщает Docker, к какой сети подключить контейнер службы. Сеть уже должна существовать или быть определена в ключе верхнего уровня сети. Если это оверлейная сеть, ей нужно иметь флаг присоединения, чтобы к ней можно было присоединять автономные контейнеры (Compose развертывает автономные контейнеры вместо Docker Services).
  • volumes: Говорит Docker о монтировании тома counter-vol (source :) в / code ('target:') внутри контейнера. Том противодействия должен уже существовать или быть определен в ключе верхнего уровня томов внизу файла.

Развертывание приложения с помощью Docker Compose

Мы развернем приложение, определенное в файле Compose из предыдущего раздела. Для этого вам понадобятся следующие 4 файла из https://github.com/championshuttler/counter-app:

  • Dockerfile
  • app.py
  • requirements.txt
  • docker-compose.yml

Клонируйте репозиторий Git локально.

git clone https://github.com/championshuttler/counter-app.git

Давайте быстро опишем каждый файл:

  • app.py код приложения (приложение Python Flask)
  • docker-compose.yml это файл Docker Compose, который описывает, как Docker должен развернуть приложение.
  • Dockerfile описывает, как создать образ для сервиса веб-интерфейса.
  • requirements.txt перечисляет пакеты Python, необходимые для приложения.

Давайте использовать Compose, чтобы запустить приложение. Вы должны выполнить все эти следующие команды из counter-app каталога:

docker-compose up &

Запуск приложения займет несколько секунд, и вывод может быть довольно подробным.

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