Если вы ищете информацию о том, как установить 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) в качестве рабочего пространства:

Фактический процесс установки Docker в Ubuntu Server находится всего в двух командах. Ubuntu предоставляет Docker в качестве опции установки в менеджере пакетов по умолчанию, который поставляется с Ubuntu, известным как apt
.
В окне терминала SSH в VS Code выполните следующие две команды для установки Docker:
Во время установки Ubuntu Server вам могло быть предложено установить Docker как snap. Если вы это сделали, сначала удалите пакет snap, выполнив
sudo snap remove docker
Вы можете следить за установкой Docker в этой анимации:

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 — веб-сервер, известный своей простотой. Множество валидных конфигураций сервера можно развернуть, используя всего одну строку в файле. Простота — это хорошо, а также является отличным примером для начала.
- Сначала вам нужно найти образ Docker. На вашем компьютере с Windows перейдите по адресу https://hub.docker.com.
- Выполните поиск по запросу caddy в верхнем левом углу страницы. Вы должны увидеть страницу, аналогичную следующей:

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 контейнера. Эта функция называется отображением портов.
Большинство образов Docker Hub следуют конвенции именования <пользователь>/<название образа>. Однако образы, помеченные как “официальные” Docker, не имеют <пользователя> впереди (как caddy выше).
Запуск команды выше выводит что-то вроде следующего, с информацией журнала Caddy, отображаемой непосредственно в терминале:

Вы можете заметить, что почти все команды Docker предварены
sudo
, чтобы заставить команды выполняться от имени администратора. По умолчанию служба Docker запускается от имениroot
, и все изменения, внесенные в контейнеры или образы, должны выполняться от имени администратора.
И… вы уже запущены! Вот и все. Рады ли вы, что установили Docker на Ubuntu?
Теперь перейдите по адресу http://<ваш-IP> на своем компьютере с Windows, и вы должны увидеть страницу загрузки Caddy. Вы можете увидеть это ниже (IP этого руководства заменен на http://homelab-docker):

Контейнер caddy сейчас работает, но вы могли заметить проблему. Запуск этой docker
команды захватывает вашу командную строку. Вы не можете запускать больше никаких команд, и если сеанс завершается, работающий контейнер останавливается. Давайте решим эту проблему, запустив контейнер в фоновом режиме (также известном как отделение контейнера).
Запуск контейнеров Docker в фоновом режиме
Теперь у вас есть работающий контейнер, но ваша командная строка зависла. Вы не можете делать ничего другого. Вам нужен лучший способ запуска контейнера, запустив его в фоновом режиме, как службу. Чтобы сделать это:
- Остановите текущий контейнер, нажав control+c на командной строке. Это должно вернуть вам вашу командную строку.
- Теперь повторите ту же команду, что и раньше, только на этот раз с параметром
-d
, как показано ниже. Вы увидите, что Docker вернет идентификатор контейнера и передаст вам командную строку.

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

Существует множество других команд контейнера Docker для просмотра, изменения, проверки или даже удаленного подключения к контейнерам на вашем сервере. Вы можете просмотреть их все, запустив
sudo docker container --help
.
Несмотря на то, что вы теперь развернули веб-сервер в контейнере, работающем в фоновом режиме, у вас все еще нет способа размещения вашего собственного контента. В текущем состоянии Caddy просто обслуживает стандартную веб-страницу.
Давайте теперь посмотрим, как вы можете использовать образы Docker с концепцией, называемой смонтированная привязка, чтобы развертывать контейнеры с осмысленными данными.
Хранение данных контейнера с помощью смонтированных привязок
Docker работает на основе концепции образов (и создаваемых ими контейнеров) как временных или временных. Если произошло обновление программного обеспечения Caddy, вы не обновляете сервис, а выбрасываете всю информацию вместе с ванной и используете полностью новый образ с нуля.
Преимущества отказа от контейнеров и их повторного создания весьма значительны. Неустойчивость программного обеспечения постепенно появляется при постоянном обновлении возможно многолетнего программного обеспечения. Используя свежий образ каждый раз, Docker предоставляет стабильную, надежную, предположительно протестированную базу при каждом обновлении.
Эта концепция эквивалентна использованию свежей установки Windows каждый раз при обновлении программного обеспечения Windows. Не самая приятная идея в Windows, но чрезвычайно применима в Docker.
Однако, методология выбрасывания имеет явную проблему. Вы не хотите, чтобы существенные данные были выброшены, когда ваш текущий сервис уничтожается. Docker решает эту проблему с помощью концепции, называемой смонтированные привязки.
Давайте теперь рассмотрим, как создать смонтированную привязку для контейнера.
Создание структуры папок и очистка
Прежде чем использовать смонтированные привязки, вам необходимо создать место для хранения этих данных. В этом руководстве будет создана папка в вашей домашней директории. Чтобы сделать это в VS Code, оставаясь подключенным к вашему серверу Ubuntu:
- Щелкните правой кнопкой мыши в пустой области панели Explorer VS Code и выберите новую папку.
2. Дайте новой папке имя containers/caddy/files.
Имена папок могут быть любыми, главное, чтобы они были правильно определены в предстоящей команде docker. Используя косую черту, VS Code интерпретирует это как создание трех папок. Папка files является подкаталогом caddy, а caddy – подкаталогом containers. Вы не обязаны использовать эту структуру папок, но она имеет смысл, когда у вас есть несколько контейнеров на одном сервере.
Если вы этого еще не сделали, остановите и удалите все ранее созданные контейнеры следующим образом:
Вы можете увидеть эту команду на снимке экрана ниже:

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

2. Запустите контейнер с помощью следующей команды. Параметр -v ~/containers/caddy/files:/usr/share/caddy
отображает путь перед двоеточием (~/containers/caddy/files) на папку внутри контейнера (/usr/share/caddy). Это работает почти так же, как команда сопоставления портов: за исключением того, что вы отображаете папку, а не порт. Такой тип команды называется привязкой к папке.
тильда (~) в вышеприведенном коде относится к домашней папке. Для этой статьи это эквивалентно
/home/homelab
.
3. Откройте браузер и перейдите по адресу http вашего сервера. Вы заметите, что сервер теперь отображает страницу 404. Это ожидаемо, потому что в данный момент у вас нет файла index.html в ~/containers/caddy/files.
4. Создайте файл index.html в ~/containers/caddy/files на сервере Ubuntu в окне исследователя VS Code, который будет выглядеть следующим образом:
5. Перейдите по HTTP-адресу вашего сервера и убедитесь, что контейнер теперь отображает вашу новую страницу index.html.
Вы можете увидеть все вышеперечисленное на следующей анимации:

В отличие от команд управления докером, создаваемые вами файлы (например, index.html) не требуют прав администратора. Это потому, что вы являетесь владельцем контента, который сервер caddy обслуживает, поскольку они находятся в вашей домашней папке.
Проверка связывания монтирования
Отлично! Вы не только используете совершенно новый контейнер Docker, но и этот контейнер обслуживает контент, сохраненный локально в вашей домашней папке! Вы можете убедиться в этом, выполнив следующее:
- Остановите и удалите запущенный контейнер. Этот шаг полностью удаляет все, включая файл index.html, если вы не использовали связывания монтирования.
2. Создайте совершенно новый контейнер.
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.
- Остановите и удалите все запущенные контейнеры.
2. Перезапустите контейнер caddy с параметром --restart always
, чтобы этот новый контейнер запускался при перезагрузке хоста. С флагом --restart always
ваш контейнер теперь ведет себя как настоящий сервис: запускается автоматически при загрузке.
3. Перезапустите сервер.
4. Теперь убедитесь, что новый контейнер запускается и по-прежнему обслуживает файл index.html по адресу http://<ваш сервер>
.
Вы можете видеть ниже примененные следующие команды:

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