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

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


Managed Kubernetes помогает разворачивать контейнерные приложения в инфраструктуре Selectel. Сосредоточьтесь на разработке, а мы займемся рутинными операциями по обеспечению работы вашего кластера Kubernetes.

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

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

В этой статье мы разберемся с установкой Docker на операционную систему Ubuntu, создадим образ контейнера на Docker Hub и запустим собственный репозиторий. Также расскажем об утилите Docker Compose для работы с мультиконтейнерными приложениями.

Перед началом установки всех необходимых компонентов, подготовим сервер. Это будет облачный сервер с готовой конфигурацией.

В консоли управления Selectel перейдем в представление Облачная платформа и нажмем на кнопку Создать сервер.

На следующем представлении вводим имя сервера, выбираем образ операционной системы (в нашем случае это Ubuntu 18.04 LTS 64-bit) и фиксированную конфигурацию сервера с 1 vCPU и 2 ГБ RAM. Для тестовых целей будет достаточно диска с 10 ГБ. Еще раз проверяем конфигурацию сервера и нажимаем Создать.

Подождем минуту или две пока сервер не перейдет в состояние Active.

Теперь можем приступать к установке Docker. Поехали!

Docker: системные требования для установки

Один из компонентов окружения Docker — Docker Engine. Эти клиент-серверное приложение, которое обеспечивает следующие компоненты:

  • серверная часть с процессом-демоном dockerd;
  • API-интерфейсы, которые программы могут использовать для взаимодействия с демоном Docker;
  • клиента интерфейса командной строки (CLI), вызываемый командой docker.

Docker Engine поставляется в виде .deb и .rpm пакетов и может быть установлен на любые дистрибутивы семейства Linux (CentOS, Debian, Fedora, Raspbian, Ubuntu). Также есть специальная утилита Docker Desktop, которая позволяет исполнять Docker Engine на операционных системах Windows и MacOS. В обоих случаях, все равно будет использоваться ядро Linux.

Установка Docker на Ubuntu

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

sudo apt update

Предварительно установим набор пакетов, необходимый для доступа к репозиториям по протоколу HTTPS:

  • apt-transport-https — активирует передачу файлов и данных через https;
  • ca-сertificates — активирует проверку сертификаты безопасности;
  • curl — утилита для обращения к веб-ресурсам;
  • software-properties-common — активирует возможность использования скриптов для управления программным обеспечением.
sudo apt install apt-transport-https ca-certificates curl software-properties-common

Далее добавим в систему GPG-ключ для работы с официальным репозиторием Docker:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Теперь добавим репозиторий Docker в локальный список репозиториев:

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

Повторно обновим данные о пакетах операционной системы:

sudo apt update

Приступаем к установке пакета Docker.

sudo apt install docker-ce -y

После завершения установки запустим демон Docker и добавим его в автозагрузку:

sudo systemctl start docker
sudo systemctl enable docker

На этом установка Docker завершена и можно начинать с ним работу.

Установка Docker Compose на Ubuntu

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

Посмотрим последнюю сборку Docker Compose в репозитории на Github и загрузим ее при помощи утилиты curl со следующими параметрами:

  • –L разрешает редиректы, если файл перемещен;
  • –o модифицирует имя файла для удобства его запуска и указывает каталог для сохранения.
sudo curl -L "https://github.com/docker/compose/releases/download/1.28.6/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

После завершения загрузки, добавим загруженному бинарному файлу права на выполнение:

sudo chmod +x /usr/local/bin/docker-compose

Заметим, что выполнить установку Docker Compose можно было из репозитория Ubuntu командой sudo apt-get install docker-compose. Однако, в репозитории может быть не самая последняя версия. Способ, который мы описали выше, позволит загрузить актуальную версию утилиты Docker Compose.

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

sudo docker–compose –version

Если команда вернула номер версии, значит Docker Compose готов к работе.

Когда нужно удалить Docker Compose, достаточно выполнить команду удаления файла:

sudo rm /usr/local/bin/docker-compose

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

sudo apt purge docker-compose

И следом удалить все невостребованные зависимости:

sudo apt autoremove

Команды Docker и работа с ним

Перед началом работы с Docker, нужно подготовить контейнер. Есть два пути: создать новый контейнер, описав его в Dockerfile или загрузить уже готовый из Docker Hub или другого репозитория. В этом разделе мы рассмотрим вариант создания собственного контейнера с нуля при помощи Dockerfile.

Dockerfile — это скрипт с инструкциями по созданию образа Docker. Эти инструкции представляют собой группу команд, автоматически выполняемых в среде Docker для создания определенного образа Docker.

Создадим новую директорию, перейдем в нее и создадим Dockerfile:

mkdir docker_images
cd docker_images
touch Dockerfile

Откроем Dockerfile и добавим в него несколько строк:

nano Dockerfile
FROM ubuntu
MAINTAINER selectel
RUN apt-get update
CMD ["echo", "Hello World"]
  • FROM определяет основу создаваемого изображения. Можно начать с родительского (как в примере выше) или базового образа. При использовании родительского образа вы используете существующий образ, на котором основан новый. Использование базового образа означает, что вы начинаете с нуля (именно так его и определяют: FROM scratch).
  • MAINTAINER указывает автора образа. Здесь вы можете ввести ваше имя и/или фамилию (или добавить адрес электронной почты). Также сюда можно вписать инструкцию по добавлению метаданных (LABEL) к образу.
  • RUN определяет инструкции по выполнению команды при построении образа в слоях поверх него. В этом примере система ищет обновления репозитория после начала сборки образа Docker. В Dockerfile может быть несколько инструкций RUN.
  • CMD отвечает за значение команды по умолчанию, которая будет исполнено. Система выполнит ее, если вы запустите контейнер без указания команды. Внутри Dockerfile может быть только одна инструкция CMD.

Сохраним изменения и выйдем из режима редактирования. Теперь можно приступать к сборке контейнера. Для этого используем утилиту Docker. Базовый синтаксис выглядит так:

sudo docker build [OPTIONS] PATH | URL | -

Запустим утилиту с параметром -t, который указывает на имя образа. Это упростит управление образами, когда их станет несколько.

sudo docker build -t my_image .

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

sudo docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
my_image     latest    889af78121ad   4 seconds ago   100MB
ubuntu       latest    4dd97cefde62   2 weeks ago     72.9MB

Казалось бы мы создали только один образ. Откуда там появилось два? Все просто — мы создавали свой контейнер my_ubuntu на на базе образа ubuntu, поэтому вначале скачался образ ubuntu и лишь потом был создан my_image.

Запустим новый контейнер Docker на основе образа, созданного на предыдущих шагах. Назовем контейнер «test» и получим вывод «Hello world» в результате выполнения команды docker run. Ubuntu, CentOS или Debian — операционная система значения не имеет, синтаксис везде будет одинаковый.

sudo docker run --name test my_image
Hello World

После выключения контейнера, все данные, которые он генерировал за время работы удаляются. Чтобы этого не происходило, предусмотрена возможность монтирования внешних хранилищ. Docker автоматически создает каталог /var/lib/docker/volume, в который можно сохранять данные на постоянной основе и совместно их использовать между несколькими контейнерами. Создадим новое хранилище с именем «selectel»:

sudo docker volume create selectel

Теперь запустим контейнер с примонтированным внешним хранилищем:

sudo docker run --name=test --mount source=selectel,destination=/selectel my_image

Таким образом, все данные, которые появятся в директории /selectel внутри контейнера будут надежно храниться на файловой системе сервера.

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

Предварительно выведем в терминал запущенные контейнеры:

sudo docker container ls -a
CONTAINER ID   IMAGE      COMMAND                CREATED         STATUS                     PORTS     NAMES
b52480dd6110   my_image   "echo 'Hello World'"   4 minutes ago   Exited (0) 4 minutes ago             test

Увидим контейнер, который мы только что запустили. Еще один вариант получить список запущенных контейнеров — добавить параметр -a. Так мы увидим список id контейнеров:

sudo docker container ls –aq
b52480dd6110

Можно остановить один контейнер:

sudo docker container stop [container_id]

А можно все разом:

sudo docker container stop $(docker container ls –aq)

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

sudo docker container stop $(docker container ls –aq) && docker system prune –af ––volumes

Команда выполняет остановку контейнеров, перечисленных в круглых скобках. Атрибут && предписывает Docker удалить все остановленные контейнеры и тома. Параметры –af указывает, что это должно применяться ко всем контейнерам (a) без необходимости подтверждения (f).

А теперь удалим контейнер. Один или все сразу:

sudo docker container rm [container_id]
sudo docker container rm $(docker container ls –aq)

При удалении ненужных контейнеров можно также задавать фильтры. Например, в примере ниже мы удалим все контейнеры без метки мейнтейнера «selectel».

sudo docker container prune --filter=”label!=maintainer=selectel”

Фильтры имеют следующий синтаксис:

  • label=<ключ>
  • label=<ключ>=<значение>
  • label!=<ключ>
  • label!=<ключ>=<значение>

Образы Docker — это файлы, которые включают несколько слоев, используемых для запуска кода в контейнере. В процессе разработки некоторые образы могут устаревать и, соответственно, занимать место на диске. Посмотрим какие образы сейчас находятся на файловой системе:

sudo docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
my_image     latest    889af78121ad   24 hours ago   100MB
ubuntu       latest    4dd97cefde62   2 weeks ago    72.9MB

Чтобы удалить неиспользуемые образы, нужно воспользоваться их идентификатором из колонки IMAGE ID.

docker image rm [image_id1] [image_id2]

Аналогичным контейнерам образом, удаляемые образы можно фильтровать по меткам или по дате создания. Первая команда удаляет образы с меткой «selectel», а вторая все образы, созданные за последние 24 часа.

sudo docker image prune ––filter=”label=selectel”
sudo docker image prune –a ––filter “until=24h”

Так как контейнеры после остановки не сохраняют внутри себя никакие данные. Например, если в контейнере работала база данных и там за время работы контейнера были созданы объекты и данные, после остановки они пропадут. Для этого, к контейнеру монтируются каталоги, расположенные, непосредственно на диске операционной системы. Чтобы просмотреть все такие каталоги, выполним команду:

sudo docker volume ls

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

sudo docker volume rm [VolumeName]

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

sudo docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
1e31297e1d6a   bridge    bridge    local
783575476ed4   host      host      local
c7c5d2496494   none      null      local

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

sudo docker network rm [networkID]

Команда prune автоматически удаляет все ресурсы, не связанные с контейнером. Это упрощенный способ очистки неиспользуемых образов, контейнеров, томов и сетей.

sudo docker system prune

Можно использовать дополнительные параметры:

  • -a — для удаления всех остановленных контейнеров и неиспользуемых образов.
  • -f — Обойти диалоговое окно подтверждения
  • --volumes — Удаляет все неиспользуемые тома.

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

sudo docker container prune
sudo docker image prune
sudo docker volume prune
sudo docker network prune

Можно использовать дополнительный параметр -a, в этом случае удаляются неиспользуемые и зависшие объекты.

Работа с репозиторием Docker Hub

Docker Hub — это общедоступный репозиторий образов контейнеров Docker. Каждый раз когда вы создаете собственный контейнер (в примере выше мы делали контейнер на основе операционной системе Ubuntu), с Docker Hub загружается соответствующий образ. Но образы можно не только загружать, но и выгружать. В этом разделе мы расскажем как это сделать.

Прежде чем начать, понадобится учетная запись на Docker Hub. Регистрация бесплатная. Сейчас в нашем тестовом окружении на Docker Hub нет ни одного репозитория. Прежде чем начинать выгрузку создадим один с помощью кнопки Create Repository.

В командной строке введем специальную команду для подключения к Docker Hub. На вход подадим имя учетной записи, которое указывали при регистрации. Затем укажем пароль.

sudo docker login -u [docker-hub-username]

Осталось выгрузить образ в репозиторий. Установим образу метку, а затем зальем его в репозиторий.

sudo docker tag my_image [docker-hub-username]/my_image:0.0.1
sudo docker push [docker-hub-username]/my_image:0.0.1
The push refers to repository [docker.io/[docker-hub-username]/my_image]
8c25b6d14dcf: Pushed
c20d459170d8: Pushed
db978cae6a05: Pushed
aeb3f02e9374: Pushed
0.0.1: digest: sha256: size: 1155

В результате, образ появится в репозитории.

Работа с частным репозиторием

Частный репозиторий — это аналог Docker Hub, только находиться он будет в окружении под вашим управлением.

Запустим локальный репозиторий в контейнере:

docker run -d -p 5000:5000 --restart=always --name registry registry:2

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

docker tag my_image localhost:5000/my_image
docker push localhost:5000/my_image
docker pull localhost:5000/my_image

Частный репозиторий готов к работе.

Заключение

В статье мы рассмотрели работу с контейнерами на основе Docker, их создание, удаление и размещение в Docker Hub и локальном репозитории. Docker сильно упрощает работу разработчиков и системных администраторов. Легковесные контейнеры потребляют меньшее количество ресурсов (в отличие от виртуальных машин) и полноценно готовы к работе за считанные минуты.