Руководство по Docker для начинающих

0
795
views

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

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

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

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

При этом контейнеры легковесны. Они не требуют дополнительной загрузки гипервизора. Гипервизор — это гостевая операционная система вроде VMWare или VirtualBox. Так вот, для запуска контейнеров гостевая ОС не требуется, они запускаются прямо в ядре хоста.

От редакции Techrocks. Также рекомендуем статью «Контейнеры Docker: простое объяснение на примере аренды офиса».

Когда использовать Docker?

Изучение новых технологий

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

Многие проекты имеют готовые образы Docker, где продвигаемое приложение уже установлено и настроено.

Базовое использование

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

Например, на DockerHub доступны и хорошо поддерживаются официальные образы node и mongodb. Если дефолтная настройка этого ПО приемлема для ваших нужд, просто вытянуть себе готовый образ будет гораздо быстрее, чем самостоятельно настраивать среду и устанавливать необходимые инструменты.

Изоляция приложений

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

Работа в команде

«На моей машине это работает!» Мы, разработчики, знаем, что одна из самых заковыристых проблем в разработке — необходимость учитывать разные машины и платформы.

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

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

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

Система с ограниченными ресурсами

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

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

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

Виртуальные машины vs Docker

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

Если речь идет о виртуальной машине (VM), то все, что находится внутри нее, не зависит от операционной системы хоста. VM-платформа запускает процесс (virtual machine monitor или VMM) для управления процессом виртаулизации отдельной виртуальной машины. Система хоста выделяет некоторое количество ресурсов машины для этой VM.

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

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

В результате процессы, происходящие внутри контейнеров, видимы из системы хоста. Конечно, если у вас достаточно прав, чтобы их видеть.

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

Ну и поскольку контейнеры не нуждаются в отдельной операционной системе, они очень легковесны, обычно это 5-100 MB.

От редакции Techrocks. Также рекомендуем статью «В чём разница между Docker и Kubernetes?» и «Почему Docker на macOS намного хуже, чем на Linux?»

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

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

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

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

Что такое образ Docker?

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

Например, вы можете создать образ, основанный на образе ubuntu, но установить поверх него веб-сервер Apache и ваше приложение, а также добавить детали конфигурации, необходимые для запуска вашего приложения.

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

Каждая инструкция в Dockerfile создает слой образа. Если вы измените Dockerfile и перестроите образ, изменятся только те слои, которых это будет касаться.

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

Что такое Docker Hub?

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

При помощи Docker Hub пользователь может получить доступ к публичным репозиториям образов с открытым кодом. Также он может использовать пространство хаба для создания собственных приватных репозиториев, функций автоматизированной сборки, веб-хуков и т. п.

Пишем простой Dockerfile

Предположим, у нас есть простое приложение на node JS. В нем есть файл server.js, который прослушивает порт 3040 и выводит ‘Hello World!’ при переходе по адресу ‘localhost:3040/’.

Файловая структура приложения следующая:

simpleNodeApplication

  • Dockerfile
  • package-lock.json
  • package.json
  • server.js
//Initializes a new build stage and sets the Base Image for subsequent instructions
FROM node:14-alpine

//Defining working directory for our application and 
it will be the default directory for our further steps
WORKDIR /app

//Copy package.json file to our created workdir
COPY package.json .

//Does npm install
RUN npm install

//Copy entire code from local to our workdir
COPY . .

//Exposing application on port 3040
EXPOSE 3040

//Command to run our application
CMD ["node", "server.js"]

Чтобы поиграться с этим dockerfile:

  • Собрать образ => docker build -t myApp:V1 .
  • Создать контейнер и нацелить его на порт 3000 => docker run -p 3000:3040 --name myContainer myApp:V1
  • Вывести запущенные контейнеры => docker ps
  • Остановить контейнер => docker stop myContainer
  • Запустить контейнер заново => docker start myContainer

Примечание. Вероятно, вам интересно, в чем разница между RUN и CMD. Команда RUN может быть выполнена при сборке контейнера. Инструкция CMD должна использоваться для запуска программ, содержащихся в вашем образе.

Команды Docker

В этом разделе мы рассмотрим несколько консольных команд для работы с Docker. Этими командами разработчики пользуются постоянно.

Допустим, у нас есть образ с ImageId myApp:V1 и ContainerName myContainer.

Образ

docker build [OPTIONS] PATH | URL | -
docker build -t myApp:V1 .

При помощи этих команд, используя dockerfile, можно создать образ приложения. Имя образу можно задать самостоятельно, для этого нужно использовать опцию -t: docker build -t name:tag .

docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
docker tag myApp:V1 myNewApp:V1

С помощью этой команды можно переименовать или пометить тегом уже созданный образ. Сам образ при этом не перестраивается.

docker images

Вывод всех образов, доступных локально.

docker image inspect Name|ImageId
docker image inspect myApp:V1

Вывод подробной информации об образе, по умолчанию — в формате JSON.

docker rmi [OPTIONS] IMAGE [IMAGE...]
docker rmi myApp:V1

С помощью этой команды можно удалить один или несколько образов.

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

docker system prune [OPTIONS]

Удаление всех неиспользуемых контейнеров, сетей, образов и, опционально, разделов.

Контейнеры

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker run -p 3000:3040 -it -rm --name myContainer myApp:V1

Эта команда сперва создает слой контейнера с возможностью записи поверх указанного образа. Затем она запускает его с использованием указанной команды. При каждом запуске этой команды создается новый контейнер с указанным образом.

По умолчанию команда ищет образ локально, а если не находит, обращается к репозиториям.

Чтобы дать контейнеру имя, можно использовать опцию --name: docker run --name string Name|ImageId.

Для запуска приложения в интерактивном режиме (чтение входящих данных из консоли и т. п.) используйте опцию -it.

Опция -rm говорит docker удалить контейнер, как только он будет остановлен.

docker stop [OPTIONS] CONTAINER [CONTAINER...]
docker stop myContainer

С помощью этих команд можно остановить один или несколько контейнеров.

docker start [OPTIONS] CONTAINER [CONTAINER...]
docker start myContainer

Эти команды запускают остановленные контейнеры. По умолчанию это происходит в фоновом режиме.

docker restart [OPTIONS] CONTAINER [CONTAINER...]
docker restart myContainer

Перезапуск одного или нескольких контейнеров.

docker rename CONTAINER NEW_NAME
docker rename myContainer myNewContainer

Смена имени уже созданного контейнера.

docker ps [OPTIONS]

Вывод списка всех запущенных контейнеров (по умолчанию). Для вывода вообще всех контейнеров используйте опцию -a.

docker rm [OPTIONS] CONTAINER [CONTAINER...]
docker rm myContainer

С помощью этой команды можно удалить один или несколько контейнеров.

docker logs [OPTIONS] CONTAINER
docker logs myContainer

Получение логов контейнера.

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-

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

docker login [OPTIONS] [SERVER]
docker login localhost:8080

Вход в реестр Docker.

docker logout [SERVER]
docker logout localhost:8080

Выход из реестра Docker.

docker push [OPTIONS] NAME[:TAG]
docker image push myApp:V1

Используйте эту команду, когда хотите поделиться вашими образами в реестре Docker Hub.

docker pull [OPTIONS] NAME[:TAG|@DIGEST]
docker pull ubuntu:20.04

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

Перевод статьи «Beginner’s guide to Docker(Part 1)- Dockerfile and Docker CLI commands».

ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here