Серия вебинаров: начало работы с контейнерами

[.Примечание]##

Эта статья дополняетwebinar series on deploying and managing containerized workloads in the cloud. Эта серия статей охватывает основы контейнеров, в том числе управление жизненным циклом контейнеров, развертывание мультиконтейнерных приложений, масштабирование рабочих нагрузок и понимание Kubernetes, а также рассказывает о лучших практиках запуска приложений с состоянием.

Это руководство включает в себя концепции и команды, описанные в первом сеансе серии «Начало работы с контейнерами».

Вступление

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

Докер имеет три основных компонента:

  • Docker Engine

  • Инструменты докера

  • Docker Registry

Docker Engine предоставляет основные возможности управления контейнерами. Он взаимодействует с базовой операционной системой Linux для предоставления простых API для работы с жизненным циклом контейнеров.

Docker Tools - это набор инструментов командной строки, которые взаимодействуют с API, предоставляемым Docker Engine. Они используются для запуска контейнеров, создания новых образов, настройки хранилища и сетей, а также для выполнения многих других операций, влияющих на жизненный цикл контейнера.

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

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

Предпосылки

Чтобы следовать этому уроку, вам понадобится:

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

Чтобы настроить каплю таким образом, запустите командуsudo usermod -aG docker ${USER}. Это добавит текущего пользователя в группуdocker. Затем запустите командуsu - ${USER}, чтобы применить новое членство в группе.

В этом руководстве предполагается, что ваш сервер настроен для выполнения командыdocker без префиксаsudo.

Шаг 1 - Установка Docker

После SSHing в Droplet выполните следующие команды, чтобы удалить все существующие пакеты, связанные с Docker, которые могут быть уже установлены, а затем установите Docker из официального репозитория:

sudo apt-get remove docker docker-engine docker.io
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install -y docker-ce

После установки Docker проверьте установку с помощью следующих команд:

docker info

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

docker version

Шаг 2 - Запуск контейнеров

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

Чтобы найти изображение с именемhello-world, выполните команду:

docker search hello-world

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

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

docker images

Поскольку мы еще не запустили ни одного контейнера, изображений не будет. Теперь мы можем загрузить изображение и запустить его локально:

docker pull hello-world
docker run hello-world

Если мы выполним командуdocker run, не извлекая образ, Docker Engine сначала извлечет образ, а затем запустит его. Повторный запуск командыdocker images показывает, что у нас есть образhello-world, доступный локально.

Давайте запустим более значимый контейнер: веб-сервер Apache.

docker run -p 80:80 --name web -d httpd

Вы можете заметить дополнительные параметры, переданные командеdocker run. Вот объяснение этих переключателей:

  • -p - указывает Docker Engine, что порт контейнера80 должен быть открыт для порта хоста80. Поскольку Apache прослушивает порт80, нам нужно открыть его на порту хоста.

  • --name - этот переключатель присваивает имя нашему работающему контейнеру. Если мы пропустим это, Docker Engine назначит случайное имя.

  • -d - этот параметр указывает Docker Engine запускать контейнер в автономном режиме. Без этого контейнер будет запущен на переднем плане, блокируя доступ к оболочке. Переместив контейнер в фоновый режим, мы можем продолжать использовать оболочку, пока контейнер еще работает.

Чтобы убедиться, что наш контейнер действительно работает в фоновом режиме, попробуйте следующую команду:

docker ps

Выходные данные показывают, что контейнер с именемweb работает с портом80, сопоставленным с портом хоста80.

Теперь зайдите на веб-сервер:

curl localhost

Остановимся и удалим работающий контейнер с помощью следующих команд:

docker stop web
docker rm web

Запускdocker ps снова подтверждает, что контейнер завершен.

Шаг 3 - Добавление хранилища в контейнеры

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

Начните с создания нового каталога на хосте:

mkdir htdocs

Теперь давайте запустим контейнер с новым переключателем для монтирования каталогаhtdocs, указав его на корень документа веб-сервера Apache:

docker run -p 80:80 --name web -d -v $PWD/htdocs:/usr/local/apache2/htdocs httpd

Переключатель-v указывает каталогhtdocs в контейнере на файловую систему хоста. Любые изменения, внесенные в этот каталог, будут видны в обоих местах.

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

docker exec -it web /bin/bash

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

Перейдите в папкуhtdocs и создайте простой HTML-файл. Наконец, выйдите из оболочки, чтобы вернуться к хосту:

cd /usr/local/apache2/htdocs
echo '

Hello World from Container

' > index.html exit

Повторное выполнение командыcurl localhost показывает, что веб-сервер возвращает страницу, которую мы создали.

Мы можем не только получить доступ к этому файлу с хоста, но и изменить его:

cd htdocs
cat index.html
echo '

Hello World from Host

' | sudo tee index.html >/dev/null

Запускcurl localhost снова подтверждает, что веб-сервер обслуживает последнюю страницу, созданную с хоста.

Завершите работу контейнера с помощью следующей команды. (-f заставляет Docker завершить работу без предварительной остановки.)

docker rm -f web

Шаг 4 - Создание изображений

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

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

Давайте снова запустим контейнерhttpd и изменим документ по умолчанию:

docker run -p 80:80 --name web -d httpd
docker exec -it web /bin/bash
cd htdocs
echo '

Welcome to my Web Application

' > index.html exit

Контейнер теперь работает с настроеннымindex.html. Вы можете проверить это с помощьюcurl localhost.

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

docker stop web
docker commit web doweb

Подтвердите создание образа командойdocker images. Он показывает изображениеdoweb, которое мы только что создали.

Чтобы пометить и сохранить это изображение в Docker Hub, выполните следующие команды, чтобы отправить изображение в открытый реестр:

docker login
docker tag your_docker_hub_username/doweb
docker push your_docker_hub_username/doweb

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

Шаг 5 - Запуск частного реестра

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

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

docker run -d -p 5000:5000 --restart=always --name registry -v $PWD/registry:/var/lib/registry registry

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

Теперь мы можем пометить локальное изображение и отправить его в личный реестр. Давайте сначала извлечем контейнерbusybox из Docker Hub и отметим его.

docker pull busybox
docker tag busybox localhost:5000/busybox
docker images

Предыдущая команда подтверждает, что контейнерbusybox теперь помеченlocalhost:5000, поэтому отправьте образ в частный реестр.

docker push localhost:5000/busybox

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

docker rmi -f localhost:5000/busybox
docker images
docker pull localhost:5000/busybox
docker images

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

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

Поскольку реестр не защищен, нам нужно изменить конфигурацию Docker Engine, чтобы разрешить доступ к небезопасному реестру. Для этого отредактируйте файлdaemon.json, расположенный в/etc/docker/daemon.json. Создайте файл, если он не существует.

Добавьте следующую запись:

Редактирование /etc/docker/daemon.json

{
  "insecure-registries" : ["REMOTE_REGISTRY_HOST:5000"]
}

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

Заключение

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

Related