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

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

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

Контейнеры и образы: в чём разница?

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

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

Примером образа может быть веб-сервер Apache и все его зависимости, из которых можно создать и запустить контейнер.

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

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

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

Докер-контейнеры

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

  • операционную систему; 
  • код приложения;
  • среду выполнения;
  • библиотеку;
  • системные инструменты.

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

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

Механизмы контейнеризации

Термин «контейнер» на самом деле является просто абстрактным понятием, описывающим, как несколько различных функций работают вместе, чтобы визуализировать своеобразный «контейнер».

Давайте очень быстро пробежимся по этим механизмам.

  • Пространства имён (Namespaces, неймспейсы)

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

В ядре есть шесть различных типов пространств имен, которые использует Docker:

  1. Network (Net) предоставляет контейнеру возможность ограничивать работу сетевого стека системы внутри своей среды. В этот процесс входят сетевые устройства, IP-адреса, таблицы (IP) маршрутизации, номера портов и многое другое.
  2. PID – это идентификатор процесса. Если вы когда-либо запускали утилиту ps aux в командной строке, чтобы проверить, какие процессы запущены в вашей системе, вы видели столбец с названием «PID». Когда процесс помещается в это пространство имён, он получает собственное значение – например, «PID 1».
  3. Mount (MNT) изолирует точки монтирования в системе. 
  4. User – это неймспейс, который используется для изоляции пользователей в контейнере. 
  5. IPC расшифровывается как Inter Process Communications — «межпроцессное взаимодействие». Это пространство имён, отвечающее за изоляцию IPC ресурсов в процессах, работающих внутри каждого контейнера.
  6. UTS (UNIX Time-Sharing) позволяет контейнерам иметь собственное имя хоста и доменное имя NIS, которое не зависит от других контейнеров и хост-системы.

Все эти неймспейсы используются вместе при создании контейнера.

  • Контрольные группы (Control groups)

Контрольные группы (так называемые «си-группы» или cgroups) — это функция ядра Linux, которая отвечает за управление ресурсами (ЦП, память, сеть). Контрольная группа гарантирует, что контейнеры Docker будут использовать только те ресурсы, которые им нужны, и при необходимости устанавливает ограничения на то, к каким ресурсам контейнер имеет доступ.

Иными словами, контрольные группы – это гарант того, что один контейнер не истощит один из этих ресурсов и не приведет к стопу всей системы.

Что такое Docker Compose

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

Наиболее популярными функциями Docker Compose являются:

  • расположение нескольких изолированных сред на одном хосте;
  • сохранение всех данных при создании контейнеров;
  • одновременное управление набором контейнеров.

Как создать Docker-контейнер

  1. Установите Docker.
  2. Откройте терминал или командную строку.
  3. Выгрузите образ Ubuntu из Docker Hub, прописав:

docker pull ubuntu

На выходе вы получите следующую информацию:

docker pull ubuntu

Using default tag: latest

latest: Pulling from library/ubuntu

Digest: sha256:9a0bdde4188b896a372804be2384015e90e3f84906b750c1a53539b585fbbe7f

Status: Image is up to date for ubuntu:latest

docker.io/library/ubuntu:latest

  1. Введите команду:

docker create --name docker-cont ubuntu

В итоге, в терминале появится информация о завершении создания контейнера:

e4b0ae054671fc7b31d12004198d4cd2956b20ee6c173d41fc09052c89f03bcf 

Команда docker create создаёт слой поверх исходного образа, который доступен для записи и готов для выполнения определённых команд.

Как запустить контейнер Docker

«hello-world»

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

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

docker run hello-world

В случае успеха вы получите следующий ответ:

Unable to find image 'hello-world:latest' locally

latest: Pulling from library/hello-world

7050e35b49f5: Pull complete 

Digest: sha256:6e8b6f026e0b9c419ea0fd02d3905dd0952ad1feea67543f525c73a0a790fefb

Status: Downloaded newer image for hello-world:latest

Hello from Docker!

This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:

  1. The Docker client contacted the Docker daemon.
  2. The Docker daemon pulled the "hello-world" image from the Docker Hub.

    (arm64v8)

  1. The Docker daemon created a new container from that image which runs the

    executable that produces the output you are currently reading.

  1. The Docker daemon streamed that output to the Docker client, which sent it

    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:

 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:

 https://hub.docker.com/

For more examples and ideas, visit:

 https://docs.docker.com/get-started/

Давайте разберёмся, что произошло. 

Мы вызвали команду «docker run», отвечающую за запуск контейнеров. Сначала поиск образа «hello-world» проводился в вашей системе, а после неуспешной попытки его обнаружения стартовал в Docker Hub, где и был обнаружен нужный образ.

Загрузив его, Docker превратил «hello-world» в работающий контейнер и запустил его. После этого мы получили возможность увидеть в консоли то самое сообщение сообщение.

Это самый простой контейнер, который можно запустить. Теперь попробуйте запустить более сложный, используя образ Ubuntu.

«ubuntu»

  1. Введите: 

docker run -it ubuntu

Консоль предоставит вам весьма короткий ответ, содержащий лишь идентификатор контейнера: 

root@4f809782c33e:/#

В будущем этот идентификатор будет полезен, если вы планируете работать с конкретным контейнером. 

Как управлять Docker контейнером

Вот некоторые полезные команды для управление контейнером:

  • docker ps -a – показывает список всех активных контейнеров.
  • docker stop – приостанавливает запущенный контейнер.
  • docker stats – показывает пользователю, сколько памяти использует контейнер.
  • docker rm – удаляет контейнер.

Соответственно, если вы, например, хотите удалить контейнер, в командной строке пропишите:

docker rm docker-cont

где «docker-cont» – это название вашего контейнера.

Заключение

Контейнеры Docker позволяют решить множество проблем в разработке приложений и существенно развязывают руки профессионалам.  Вы можете запустить свой контейнер Docker на любом совместимом с ОС хосте (Linux или Windows), на котором установлен докер.

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

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

Всё ещё остались вопросы?