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

Обновлено Обновлено: Опубликовано Опубликовано:

Используемые термины: DockerLinux.

Мы рассмотрим процесс установки Docker на популярные системы семейства Linux.

Ubuntu / Debian

Обновляем список пакетов:

apt update

Устанавливаем докер командой:

apt install docker.io

Astra Linux

Docker на Astra Linux также ставится, относительно, просто.

Обновляем список пакетов:

apt update

Устанавливаем докер командой:

apt install docker.io

Rocky Linux / CentOS (версии 8 и 9)

Устанавливаем wget:

dnf install wget

Скачиваем конфигурационный файл для репозитория докер:

wget -P /etc/yum.repos.d/ https://download.docker.com/linux/centos/docker-ce.repo

Теперь устанавливаем docker:

dnf install docker-ce docker-ce-cli

И разрешаем автозапуск сервиса и стартуем его:

systemctl enable docker --now

CentOS 7

Устанавливаем wget:

yum install wget

Скачиваем файл репозитория:

wget -P /etc/yum.repos.d/ https://download.docker.com/linux/centos/docker-ce.repo

Устанавливаем docker:

yum install docker-ce docker-ce-cli containerd.io

Запускаем его и разрешаем автозапуск:

systemctl enable docker --now

Fedora

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

dnf install dnf-plugins-core

В зависимости от версии Fedora Linux добавление репозитория будет выполняться, немного, разными командами.

а) Fedora 41 и выше (от DNF 5):

dnf config-manager addrepo --from-repofile=https://download.docker.com/linux/fedora/docker-ce.repo

б) Fedora до 40 версии включительно:

dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo

Репозиторий добавлен.

Устанавливаем docker:

dnf install docker-ce docker-ce-cli containerd.io

Запускаем его и разрешаем автозапуск:

systemctl enable docker --now

РЕД ОС

Выполняется одной командой:

yum install docker-ce

Запускаем его и разрешаем автозапуск:

systemctl enable docker --now

Рекомендуемая настройка

После того, как мы установили Docker стоит внести некоторые настройки.

Создаем файл:

vi /etc/docker/daemon.json

{
  "storage-driver": "overlay2",
  "log-driver": "json-file",
  "log-opts": {
     "max-size": "10m",
     "max-file": "3"
  },
  "default-ulimits": {
    "nofile": {
      "Name": "nofile",
      "Hard": 262144,
      "Soft": 262144
    }
  }
}

* где:

  • storage-driver — драйвер хранилища. На данный момент рекомендуется использовать overlay2.
  • log-driver — драйвер перехвата и хранения логов. Мы выставляем json-file, который для ведения журнала использует файловое хранилище.
  • log-opts — опции журнала. В данном примере мы ограничиваем объем 30 мб — 3 файла по 10 мб.
  • default-ulimits / nofile — задаем ограничение на количество открываемых файлов докером. По умолчанию, значение не большое, из-за чего некоторые процессы могут подвисать.

Для применения настроек перезапустим docker:

systemctl restart docker

Проверка после установки и настройки

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

docker run --rm hello-world

Сначала система обнаружит, что нужного образа нет и загрузит его:

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Already exists 
Digest: sha256:308866a43596e83578c7dfa15e27a73011bdd402185a84c5cd7f32a88b501a24
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...

Docker работает корректно.

Установка Compose

Команда docker-compose позволяет развернуть многоконтейнерные Docker-приложения. Для установки программного обеспечения достаточно скачать уже скомпилированного бинарника с Github.

Для этого сначала убедимся в наличие пакета curl.

а) На системы DEB:

apt install curl

б) На системы RPM:

yum install curl

После продолжаем установку docker-compose.

Задаем переменную с последней версией docker-compose скрипта:

COMVER=$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep 'tag_name' | cut -d\" -f4)

* в данном примере с помощью обращения к API на Github будет автоматически определена последняя версия docker-compose. Результат будет занесен в переменную COMVER.

Если нам нужна не последняя версия, переходим на страницу github.com/docker/compose/releases/latest и смотрим список доступных версий docker-compose. После создаем переменную, например:

COMVER=v2.29.7

* в данном примере мы хотим установить версию 2.29.7.

Теперь скачиваем скрипт docker-compose и помещаем его в каталог /usr/bin:

curl -L "https://github.com/docker/compose/releases/download/$COMVER/docker-compose-$(uname -s)-$(uname -m)" -o /usr/bin/docker-compose

Даем права файлу на исполнение:

chmod +x /usr/bin/docker-compose

Запускаем docker-compose с выводом его версии:

docker-compose --version

Возможные проблемы

1. undefined symbol: seccomp_api_set

Сервис докера не запускается, а в логе можно увидеть следующий текст ошибки:

/usr/bin/containerd: symbol lookup error: /usr/bin/containerd: undefined symbol: seccomp_api_set

Причина: ошибка возникает, если установить свежую версию containerd на систему с необновленной библиотекой libseccomp.

Решение: обновляем libseccomp.

а) в CentOS:

yum update libseccomp

б) в Ubuntu:

apt --only-upgrade install libseccomp2

2. error initializing network controller list bridge addresses failed no available network

Сервис докера не запускается, а в логе можно увидеть следующий текст ошибки:

error initializing network controller list bridge addresses failed no available network

Причина: система не может создать docker-интерфейс.

Решение: создаем docker-интерфейс вручную. Устанавливаем утилиту для работы с bridge-интерфейсами.

а) в CentOS:

yum install bridge-utils

б) в Ubuntu:

apt install bridge-utils

Создаем интерфейс:

brctl addbr docker0

Назначаем IP-адреса на созданный интерфейс:

ip addr add 192.168.84.1/24 dev docker0

* в нашем примере для docker мы задали адрес 192.168.84.1.

Включаем созданный интерфейс:

ip link set dev docker0 up

Можно запускать docker:

systemctl start docker

Из контейнера нет подключения по веб-портам

Как правило, это проявляется в невозможности установить пакет или обновить кэш репозитория. Пинг по сети Интернет работает, но любые попытки подключится по портам 80 или 443 заканчиваются ошибкой.

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

Решение: в настройках docker задаем значение MTU, равное 1450. Для этого открываем файл:

vi /etc/docker/daemon.json

Дописываем опцию: 

{
  "mtu": 1450,
  ...
}

Перезапустим docker:

systemctl restart docker

Читайте также

Другие полезные инструкции:

1. Создание собственного образа Docker.

2. Настройка веб-сервера в Docker (NGINX + PHP + MariaDB).

3. Шпаргалка по работе с docker-compose.

4. Docker-compose для создания nginx entrypoint.

# CentOS # DevOps # Linux # Ubuntu # Виртуализация
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет