Овладейте Docker на Ubuntu: Руководство по развертыванию в реальном мире

Если вы ищете информацию о том, как установить Docker на Ubuntu, то вы попали по адресу. Более того, в качестве бонуса, этот учебник также научит вас основным командам Docker для запуска и управления контейнерами.

Используя удобные функции Visual Studio (VS) Code, вы также узнаете, как улучшить свои навыки работы с SSH. Давайте начнем!

Связанные статьи: Человек из мира Windows в мире Linux: VS Code и удаленный SSH

Предварительные требования

Если вы хотите идти в ногу шаг за шагом, в этом учебнике убедитесь, что у вас есть следующее:

  • A fresh install of Ubuntu Server LTS with SSH Enabled (This guide will be using Ubuntu Server LTS 20.04.1)
  • A Windows Machine with VSCode installed (This guide will be using Visual Studio Code 1.52.1)
  • Установленное официальное расширение SSH для VSCode и подключение к вашему серверу Ubuntu LTS

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

Давайте начнем с установки Docker на Ubuntu. На этом этапе учебник предполагает, что вы находитесь на своем локальном компьютере под управлением Windows с открытым VS Code, подключенным к вашему серверу Ubuntu через SSH. Узнайте, как настроить это удобное окружение в последней статье об использовании VS Code и SSH.

В приведенном ниже примере VSCode удаленно подключен к Ubuntu с открытой папкой home (в данном случае /home/homelab) в качестве рабочего пространства:

VSCode when SSHed into a Ubuntu Machine

Фактический процесс установки Docker в Ubuntu Server находится всего в двух командах. Ubuntu предоставляет Docker в качестве опции установки в менеджере пакетов по умолчанию, который поставляется с Ubuntu, известным как apt.

В окне терминала SSH в VS Code выполните следующие две команды для установки Docker:

sudo apt update -y
sudo apt install docker.io -y

Во время установки Ubuntu Server вам могло быть предложено установить Docker как snap. Если вы это сделали, сначала удалите пакет snap, выполнив sudo snap remove docker

Вы можете следить за установкой Docker в этой анимации:

The Installation Process for Docker on Ubuntu

Ubuntu достаточно любезна, чтобы автоматически включить и настроить службу для запуска при загрузке, поэтому вы готовы приступить к использованию Docker!

Создание и запуск контейнера Docker в Ubuntu

Теперь, когда у вас установлен Docker, что вы можете с ним сделать? Давайте начнем с создания контейнера Docker. В этом руководстве мы настроим статический веб-сервер как хороший пример Docker-контейнера. В этом разделе вы:

  • Настроите новый контейнер из репозитория образов Docker Hub для запуска службы HTTP
  • Используйте отображение портов для сопоставления порта HTTP внутри контейнера с вашим хостом Ubuntu
  • Настроите связывание монтирования для сопоставления важных данных изнутри контейнера с вашим хостом Ubuntu
  • Настройка сохранения при перезагрузке для вашего контейнера

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

Скачивание образа Docker

Первый вопрос, который нужно задать, — откуда будет браться этот контейнер? Давайте посмотрим на Docker Hub.

A large part of Docker is understanding image repositories. Rather than being distributed like packages, services in Docker get distributed as Docker Images.

A Docker Image is a snapshot of the software that the publisher wants to distribute and the entire filing system! This is analogous to creating .wim image of Windows.

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

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

Поскольку в этом учебнике настраивается статический веб-сервер, вам нужно скачать образ веб-сервера. Два самых популярных веб-сервера — Apache httpd и Nginx, но чтобы что-то изменить и, возможно, познакомить вас с новым веб-сервером, давайте воспользуемся одним, называемым Caddy.

Caddy — веб-сервер, известный своей простотой. Множество валидных конфигураций сервера можно развернуть, используя всего одну строку в файле. Простота — это хорошо, а также является отличным примером для начала.

  1. Сначала вам нужно найти образ Docker. На вашем компьютере с Windows перейдите по адресу https://hub.docker.com.
  2. Выполните поиск по запросу caddy в верхнем левом углу страницы. Вы должны увидеть страницу, аналогичную следующей:
Searching for caddy on the Docker Hub

A benefit (and downside) of Docker Hub is that anyone, even you, can create and upload Docker Images to the site.

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

3. Запомните название образа. На скриншоте выше название – caddy. Вам понадобится это название, чтобы указать его при дальнейших шагах.

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

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

Запуск контейнера из образа требует всего одной команды. В вашем SSH-терминале, подключенном к серверу Ubuntu, выполните следующую команду docker run.

Нижеприведенная команда проверяет наличие образа caddy на локальной машине. Если его нет, она загружает образ с Docker Hub, создает контейнер и запускает его. В этой команде используется ключ -p для сопоставления порта 80 сервера Ubuntu с портом 80 контейнера. Эта функция называется отображением портов.

sudo docker run -p 80:80 caddy

Большинство образов Docker Hub следуют конвенции именования <пользователь>/<название образа>. Однако образы, помеченные как “официальные” Docker, не имеют <пользователя> впереди (как caddy выше).

Запуск команды выше выводит что-то вроде следующего, с информацией журнала Caddy, отображаемой непосредственно в терминале:

Running the Caddy Docker container

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

И… вы уже запущены! Вот и все. Рады ли вы, что установили Docker на Ubuntu?

Теперь перейдите по адресу http://<ваш-IP> на своем компьютере с Windows, и вы должны увидеть страницу загрузки Caddy. Вы можете увидеть это ниже (IP этого руководства заменен на http://homelab-docker):

The default landing page for Caddy

Контейнер caddy сейчас работает, но вы могли заметить проблему. Запуск этой docker команды захватывает вашу командную строку. Вы не можете запускать больше никаких команд, и если сеанс завершается, работающий контейнер останавливается. Давайте решим эту проблему, запустив контейнер в фоновом режиме (также известном как отделение контейнера).

Запуск контейнеров Docker в фоновом режиме

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

  1. Остановите текущий контейнер, нажав control+c на командной строке. Это должно вернуть вам вашу командную строку.
  2. Теперь повторите ту же команду, что и раньше, только на этот раз с параметром -d, как показано ниже. Вы увидите, что Docker вернет идентификатор контейнера и передаст вам командную строку.
sudo docker run -d -p 80:80 caddy
Running a detached container

Управление фоновыми контейнерами с помощью команд Docker

После запуска одного или нескольких фоновых контейнеров вам потребуется как-то управлять ими. Docker предоставляет несколько команд для этого с использованием команд docker container.

  • sudo docker container list -a: Выводит список всех контейнеров (запущенных и остановленных) и их статус
  • sudo docker container stop <имя>: Останавливает контейнер Docker по его имени (или по его идентификатору)
  • sudo docker container start <имя>: Запускает контейнер Docker по его имени (или по его идентификатору)
  • sudo docker container prune: Уничтожает и удаляет все остановленные контейнеры

Вы можете увидеть все вышеперечисленные команды, использованные в контексте, на скриншоте ниже:

Managing detached containers using docker container commands

Существует множество других команд контейнера Docker для просмотра, изменения, проверки или даже удаленного подключения к контейнерам на вашем сервере. Вы можете просмотреть их все, запустив sudo docker container --help.

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

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

Хранение данных контейнера с помощью смонтированных привязок

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

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

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

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

Давайте теперь рассмотрим, как создать смонтированную привязку для контейнера.

Создание структуры папок и очистка

Прежде чем использовать смонтированные привязки, вам необходимо создать место для хранения этих данных. В этом руководстве будет создана папка в вашей домашней директории. Чтобы сделать это в VS Code, оставаясь подключенным к вашему серверу Ubuntu:

  1. Щелкните правой кнопкой мыши в пустой области панели Explorer VS Code и выберите новую папку.

2. Дайте новой папке имя containers/caddy/files.

Имена папок могут быть любыми, главное, чтобы они были правильно определены в предстоящей команде docker. Используя косую черту, VS Code интерпретирует это как создание трех папок. Папка files является подкаталогом caddy, а caddy – подкаталогом containers. Вы не обязаны использовать эту структуру папок, но она имеет смысл, когда у вас есть несколько контейнеров на одном сервере.

Если вы этого еще не сделали, остановите и удалите все ранее созданные контейнеры следующим образом:

# остановить и удалить ВСЕ текущие запущенные контейнеры.
# $(sudo docker ps -q) динамически захватывает все идентификаторы запущенных контейнеров
sudo docker container stop $(sudo docker ps -q)
sudo docker container prune

Вы можете увидеть эту команду на снимке экрана ниже:

Using the VSCode Explorer Window

Развертывание контейнера Caddy с привязкой к точкам монтирования

Теперь у вас есть построенная структура папок на сервере Ubuntu. Пришло время создать контейнер Caddy с привязками к точкам монтирования.

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

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

The Caddy documentation on Docker Hub

2. Запустите контейнер с помощью следующей команды. Параметр -v ~/containers/caddy/files:/usr/share/caddy отображает путь перед двоеточием (~/containers/caddy/files) на папку внутри контейнера (/usr/share/caddy). Это работает почти так же, как команда сопоставления портов: за исключением того, что вы отображаете папку, а не порт. Такой тип команды называется привязкой к папке.

# привязать папку на хосте (путь перед двоеточием) к
# /usr/share/caddy внутри контейнера
sudo docker run -d -p 80:80 -v ~/containers/caddy/files:/usr/share/caddy caddy

тильда (~) в вышеприведенном коде относится к домашней папке. Для этой статьи это эквивалентно /home/homelab.

3. Откройте браузер и перейдите по адресу http вашего сервера. Вы заметите, что сервер теперь отображает страницу 404. Это ожидаемо, потому что в данный момент у вас нет файла index.html в ~/containers/caddy/files.

4. Создайте файл index.html в ~/containers/caddy/files на сервере Ubuntu в окне исследователя VS Code, который будет выглядеть следующим образом:

<body><h2>hello world!</h2></body>

5. Перейдите по HTTP-адресу вашего сервера и убедитесь, что контейнер теперь отображает вашу новую страницу index.html.

Вы можете увидеть все вышеперечисленное на следующей анимации:

container is now serving your new index.html page.

В отличие от команд управления докером, создаваемые вами файлы (например, index.html) не требуют прав администратора. Это потому, что вы являетесь владельцем контента, который сервер caddy обслуживает, поскольку они находятся в вашей домашней папке.

Проверка связывания монтирования

Отлично! Вы не только используете совершенно новый контейнер Docker, но и этот контейнер обслуживает контент, сохраненный локально в вашей домашней папке! Вы можете убедиться в этом, выполнив следующее:

  1. Остановите и удалите запущенный контейнер. Этот шаг полностью удаляет все, включая файл index.html, если вы не использовали связывания монтирования.
sudo docker container stop $(sudo docker ps -q)
sudo docker container prune

2. Создайте совершенно новый контейнер.

sudo docker run -d -p 80:80 -v ~/containers/caddy/files:/usr/share/caddy caddy

3. Убедитесь, что новый контейнер по-прежнему обслуживает файл index.html по адресу http://<ваш сервер>.

Создание постоянных контейнеров Docker

A container isn’t that useful if it stops when the server reboots. By default, that’s what is going to happen if you don’t make it happen. To prevent this, let’s generate a new caddy container again but this time once that restarts when the Docker host, Ubuntu in this case, restarts.

  1. Остановите и удалите все запущенные контейнеры.
# остановите и удалите ВСЕ текущие запущенные контейнеры
sudo docker container stop $(sudo docker ps -q)
sudo docker container prune

2. Перезапустите контейнер caddy с параметром --restart always, чтобы этот новый контейнер запускался при перезагрузке хоста. С флагом --restart always ваш контейнер теперь ведет себя как настоящий сервис: запускается автоматически при загрузке.

sudo docker run -d -p 80:80 -v ~/containers/caddy/files:/usr/share/caddy --restart always caddy

3. Перезапустите сервер.

4. Теперь убедитесь, что новый контейнер запускается и по-прежнему обслуживает файл index.html по адресу http://<ваш сервер>.

Вы можете видеть ниже примененные следующие команды:

Setting caddy to restart on boot

Переходя

На данном этапе у вас должна быть рабочая среда Docker и базовое понимание образов и контейнеров. Вы можете вытягивать, запускать, останавливать и выполнять базовое управление вашими контейнерами. Вы также успешно создали работающий контейнер веб-службы с использованием привязки монтирования и отображения портов.

Есть еще много вопросов по Docker: Следите за этим разделом, так как в следующей статье будет рассмотрено расширенное управление Docker с использованием Docker Compose.

Source:
https://adamtheautomator.com/docker-ubuntu/