Введение
Docker – это система управления контейнерами. Платформа, которая используется для запуска и работы с приложениями в контейнерах. Использование контейнеров популярно среди разработчиков, сетевых администраторов и других специалистов из-за той гибкости, которую предлагают контейнеры.
Docker имеет три важных компонента:
- Docker Engine – клиент-серверное приложение, которое предоставляет основные возможности работы с контейнерами;
- Docker Tools – набор инструментов для командной строки, которые используются для запуска контейнеров, создания новых образов и т.д.;
- Docker Registry – место, где находятся образы контейнеров.
Требования
Для того чтобы выполнить необходимые действия, вам понадобятся:
- установленная ОС Ubuntu 16.04 с пользователем, который может выполнять команды sudo, и фаерволом;
- аккаунт Docker Hub.
По умолчанию для выполнения команды docker необходимо иметь root-привилегии. Однако команду можно выполнять и без добавления sudo, если работать от имени пользователя, который находится в группе docker.
В данном руководстве предполагается, что сервер настроен так, чтобы выполнять команду docker можно без использования sudo.
Для такой настройки вам нужно ввести:
$ sudo usermod -aG docker ${USER}
Текущий пользователь будет добавлен в группу docker. Для того чтобы изменения вступили в силу, выполните команду:
$ su - ${USER}
Шаг 1: Установка Docker
Сначала нужно удалить все пакеты Docker, которые, возможно, были установлены ранее:
$ sudo apt-get remove docker docker-engine docker.io
А затем уже перейти к установке самого Docker:
$ 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 Engine, развернутом в окружении. Для того чтобы посмотреть версию Docker Engine и Tools, введите:
$ docker version
Шаг 2: Запуск контейнеров
Контейнеры 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);
- --name – указывает имя запущенного контейнера. Если не указать этот параметр, то Docker Engine назначит случайное имя;
- -d – указывает на то, что контейнер будет запущен в фоновом режиме.
Введите команду ниже для того, чтобы убедиться, что контейнер работает:
$ docker ps
В выводе вы увидите, что контейнер под названием web работает по 80 порту и привязан к 80 порту хоста.
Для того чтобы остановить и убрать запущенный контейнер, используйте команды:
$ docker stop web $ docker rm web
Введите команду docker ps для того, чтобы убедиться, что контейнер был удален.
Шаг 3: Добавление хранилища для контейнеров
Контейнеры сами по себе эфемерны – всё, что находится внутри контейнера, будет потеряно после удаления этого контейнера. Для того чтобы данные существовали дольше, чем контейнер, к нему необходимо добавить том (volume). Том используется для длительного хранения нужных файлов (данных). Том – это директория файловой системы хоста.
Для начала нужно создать новую директорию:
$ mkdir htdocs
Теперь нужно запустить контейнер и смонтировать его с директорией htdocs:
$ docker run -p 80:80 --name web -d -v $PWD/htdocs:/usr/local/apache2/htdocs httpd
Введите команду для доступа к директории из контейнера:
$ 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, то вы увидите, что веб-сервер использует последнюю версию сайта.
Теперь удалите контейнер при помощи следующей команды:
$ 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.
Перед тем как превратить контейнер в неизменяемый образ, лучше остановить его:
$ docker stop web
А вот после этого можно ввести команду commit, которая фактически превратит контейнер в неизменяемый образ.
$ docker commit web doweb
Подтвердите создание образа командой docker images. Она покажет образ doweb, который только что был создан.
Вы можете присвоить образу тег, а также поместить его в Docker Hub. Для этого выполните следующие команды (вместо your_docker_hub_username нужно написать имя пользователя вашего Docker Hub):
$ docker login $ docker tag your_docker_hub_username/doweb $ docker push
Теперь новый образ можно найти в Docker Hub или в командной строке.
Шаг 5: Запуск частного репозитория
Если вы хотите, чтобы образы были более защищенными, то лучше использовать частный репозиторий.
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, а потом работать с контейнерами и образами Docker. Для получения более подробной информации я рекомендую ознакомиться с документацией Docker.
Комментарии