Установка и настройка Docker

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

Docker состоит из трех основных компонентов:

  • Docker Engine
  • Docker Tools
  • Docker Registry

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

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

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

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

Требования

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

Для этого запустите команду

sudo usermod -aG docker ${USER}

Это добавит текущего пользователя в группу docker. Затем запустите команду:

su - ${USER}

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

1: Установка Docker

Подключившись к серверу по SSH, запустите следующие команды, чтобы удалить все существующие пакеты, связанные с 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 info

Эта команда показывает детали текущей установки Docker. Следующая команда проверяет правильность установки и настройки Docker Tools. Она выведет версию платформы Docker и Docker Tools.

docker version

2: Запуск контейнера

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

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

docker search 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

В этой команде есть дополнительные опции:

  • -p – открывает в контейнере порт 80, который прослушивает Apache.
  • —name – присваивает имя запущенному контейнеру. Если пропустить эту опцию, Docker присвоит контейнеру случайное имя.
  • -d – эта опция запускает контейнер в раздельном режиме. Иначе контейнер запустится на переднем плане, блокируя доступ к оболочке. Переведя контейнер в фоновый режим, вы сможете продолжать работу в оболочке.

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

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 '<h1>Hello World from Container</h1>' > index.html
exit

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

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

cd htdocs
cat index.html
echo '<h1>Hello World from Host</h1>' | 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 '<h1>Welcome to my Web Application</h1>' > 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

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

5: Создание приватного регистра

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

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. Создайте файл, если его не существует.

Добавьте в него такие строки:

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

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

Заключение

Теперь вы умеете устанавливать Docker и выполнять базовые операции с образами и контейнерами.

Tags: ,