[.Примечание]##
Эта статья дополняет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, управляете контейнерами, работаете с изображениями, добавляете постоянство и настраиваете личный реестр.
Предпосылки
Чтобы следовать этому уроку, вам понадобится:
-
Одна капля Ubuntu 16.04, настроенная в соответствии с этимUbuntu 16.04 initial server setup tutorial, включая пользователя sudo без полномочий root и брандмауэр.
-
ADocker Hub account. This overview of Docker Hub поможет вам начать работу.
По умолчанию для команды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.