Docker – это платформа для развертывания и управления контейнеризованными приложениями. Контейнеры очень популярны среди разработчиков и администраторов благодаря своей гибкости.
Docker состоит из трех основных компонентов:
- Docker Engine
- Docker Tools
- Docker Registry
Docker Engine – это платформа, которая предоставляет базовые возможности управления контейнерами. Она взаимодействует с операционной системой Linux, открывая простые API-интерфейсы для работы с контейнерами.
Docker Tools – это набор инструментов командной строки, которые общаются с открытыми API. Они используются для запуска контейнеров, создания новых образов, настройки хранилищ и сетей и выполнения многих других операций, которые влияют на жизненный цикл контейнера.
Docker Registry – это регистр, где хранятся образы контейнеров. Каждый образ может иметь несколько версий, отмеченных с помощью уникальных тегов. Пользователи извлекают существующие образы из регистра и могут добавлять в него новые образы. Docker Hub – это основной регистр Docker, Inc. Docker позволяет создавать индивидуальные пользовательские регистры.
Данный мануал научит вас устанавливать Docker, управлять контейнерами, работать с образами и настраивать приватные регистры.
Требования
- Сервер Ubuntu 16.04, настроенный по этому мануалу.
- Аккаунт Docker Hub (вам может пригодиться это руководство)
По умолчанию для запуска команды 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 и выполнять базовые операции с образами и контейнерами.