Большинство руководств по установке Docker предполагают systemd систему, которая позволяет пользователям Void Linux переводить команды на лету. Void использует Runit в качестве своей системы init, поэтому службы включения и управления работают по-разному.

Это руководство охватывает установку Docker Engine и Docker Compose на Void Linux, проверку работы всего, запуск многоконтейнерного приложения с Compose и управление службой Docker через рунит.

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

  • Сервер под управлением Void Linux.
  • Привилегии пользователя: пользователь root или не root с привилегиями sudo.

Конвенции

1
2
# - данные команды должны выполняться с правами root либо непосредственно от имени пользователя root, либо с помощью команды sudo.
$ - данные команды должны выполняться от имени обычного пользователя.

Обновите систему

Свежая установка Void Linux требует обновления пакетов до последних доступных версий.

1
sudo xbps-install -u xbps

После того, как xbps включен, запустите полное обновление системы.

1
sudo xbps-install -Syu

Система может нуждаться в перезагрузке после обновления.

1
sudo reboot -f

Установить Docker Engine

Docker поставляется в официальных хранилищах Void, поэтому сторонние репозитории не нужны.

1
sudo xbps-install docker

Это включает в себя Docker Engine, контейнер и инструменты CLI. Подтвердите установленную версию:

1
docker --version

На выходе должен быть показан Docker 29.4.0 или новее:

1
Docker version 29.4.0, build 7e5decf

Включить и запустить Docker

Void Linux использует рунит вместо systemd. Здесь нет возможности systemctl enable. Чтобы включить и запустить услугу, вы создаете симлинк из /etc/sv/ в /var/service/. Рунит поднимает его в течение пяти секунд и автоматически запускает демон.

1
sudo ln -s /etc/sv/docker /var/service/docker

Дайте руниту минуту, затем проверьте статус сервиса:

1
sudo sv status docker

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

1
run: docker: (pid 1842) 6s

Если Docker не создаст контейнеры позже с ошибками в /run/user/0, создайте этот каталог вручную. Это застает большинство людей врасплох на свежей установке Void:

1
sudo mkdir -p /run/user/0

Проверьте установку Docker

Команда docker info подтверждает работу и показывает конфигурацию хранилища и группы:

1
sudo docker info

Ключевые детали вывода:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
Client: Docker Engine - Community
 Version:    29.4.0
 Context:    default

Server:
 Server Version: 29.4.0
 Storage Driver: overlayfs
 Cgroup Driver: cgroupfs
 Cgroup Version: 2
 Operating System: Void
 OSType: linux
 Architecture: x86_64
 CPUs: 2
 Total Memory: 1.938GiB
 Docker Root Dir: /var/lib/docker

Обратите внимание на водителя cgroupfs. Void не использует systemd, поэтому Docker по умолчанию использует cgroupfs v2, что именно то, что вы хотите здесь.

Теперь тест с классическим контейнером Hello-world:

1
sudo docker run --rm hello-world

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
e6590344b1a5: Pull complete
Digest: sha256:d715f14f9eca81473d9112df50457893aa7a0a5e35d427c9fa9b1fa26a8de2e1
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

Установить Docker Compose

Docker Compose также доступен в хранилищах Void. Упакованная версия - это плагин Compose v2 на основе Python.

1
sudo xbps-install docker-compose

Проверьте установленную версию:

1
docker compose version

Результаты подтверждают Compose v5.1.2:

1
Docker Compose version v5.1.2

Развертывание многоконтейнерного приложения

Чтобы провести настоящий тест, создайте проект с Nginx и MariaDB. Это типичный шаблон для веб-приложений.

Создайте каталог проектов и файл Compose:

1
mkdir -p ~/compose-demo && cd ~/compose-demo

Откройте файл Compose для редактирования:

1
nano compose.yaml

Добавить следующую конфигурацию:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
services:
  web:
    image: nginx:alpine
    ports:
      - "8080:80"
    depends_on:
      - db
    restart: unless-stopped

  db:
    image: mariadb:11
    environment:
      MARIADB_ROOT_PASSWORD: S3cur3P@ssw0rd
      MARIADB_DATABASE: appdb
      MARIADB_USER: appuser
      MARIADB_PASSWORD: AppUs3rP@ss
    volumes:
      - dbdata:/var/lib/mysql
    restart: unless-stopped

volumes:
  dbdata:

Поднимите оба контейнера в отдельном режиме:

1
sudo docker compose up -d

Compose выводит изображения и запускает оба сервиса:

1
2
3
4
[+] Running 3/3
 ✔ Network compose-demo_default  Created
 ✔ Container compose-demo-db-1   Started
 ✔ Container compose-demo-web-1  Started

Убедитесь, что оба контейнера работают:

1
sudo docker ps

Оба должны показать статус Up:

1
2
3
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                  NAMES
a3f1b2c4d5e6   nginx:alpine   "/docker-entrypoint.…"   12 seconds ago   Up 10 seconds   0.0.0.0:8080->80/tcp   compose-demo-web-1
b7e8f9a0c1d2   mariadb:11     "docker-entrypoint.s…"   12 seconds ago   Up 11 seconds   3306/tcp               compose-demo-db-1

Испытайте контейнер Nginx с curl:

1
curl -s http://localhost:8080 | head -5

Страница приветствия Nginx по умолчанию подтверждает, что веб-контейнер обслуживает трафик:

1
2
3
4
5
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>

Чтобы снести стопку, когда закончите:

1
sudo docker compose down

Управляйте Docker как некорневым пользователем

Запуск каждой команды Docker с помощью sudo быстро устаревает. Добавьте пользователя в группу docker для запуска контейнеров без привилегий root.

1
sudo usermod -aG docker $(whoami)

Применить членство в группе без выхода из системы:

1
newgrp docker

Подтвердите, что он работает, запуская контейнер без sudo:

1
docker run --rm alpine echo "Docker works without sudo"

Вы должны увидеть:

1
Docker works without sudo

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

Обслуживание Runit

Модель Runit проще, чем systemd, но есть одно поведение, которое удивляет новичков: создание симлинка в /var/service/ позволяет и сразу же запускает сервис. Отдельного enable шага, ожидающего следующей перезагрузки, не существует. Рунит сканирует /var/service/ каждые пять секунд и запускает все новое.

Обратное также верно. Удаление симлика с помощью rm /var/service/docker останавливает работу службы и предотвращает ее запуск при загрузке. Это отличается от systemd, где отключение systemctl disable влияет только на поведение загрузки и не останавливает текущий сервис.

Завершение

Вы успешно узнали, как установить Docker на Void Linux, а также как создавать и использовать простые команды контейнера Docker.

Вы также можете поделиться статьей со своими друзьями в социальных сетях, которым может быть интересна эта статья, или просто оставить комментарий ниже. Спасибо.