Docker — это платформа контейнеризации, которая позволяет упаковывать приложения со всеми зависимостями в изолированные контейнеры. В этой статье мы разберём готовый bash-скрипт, который автоматизирует установку Docker Engine на Ubuntu по официальной инструкции Docker.
Ручная установка Docker состоит из нескольких шагов: удаление старых пакетов, добавление GPG-ключа, подключение репозитория, установка пакетов и настройка прав доступа. Скрипт объединяет всё это в один запуск и снижает риск ошибок.
Что делает скрипт
- Проверяет окружение — убеждается, что скрипт запущен от root и что система является Ubuntu (или производной, например Linux Mint).
- Удаляет конфликтующие пакеты — docker.io, docker-doc, docker-compose, podman-docker, containerd, runc и другие, если они были установлены ранее.
- Устанавливает зависимости — ca-certificates, curl, gnupg.
- Добавляет официальный GPG-ключ и репозиторий Docker.
- Устанавливает Docker Engine — docker-ce, docker-ce-cli, containerd.io, а также плагины docker-buildx-plugin и docker-compose-plugin.
- Включает автозапуск и запускает сервис Docker.
- Добавляет пользователя в группу docker — чтобы можно было работать с Docker без sudo.
- Проверяет установку — выводит версии Docker и Docker Compose.
Скрипт
Сохраните код ниже в файл install-docker.sh:
#!/usr/bin/env bash
#
# Установка Docker Engine на Ubuntu (по официальной инструкции Docker)
# Использование: sudo ./install-docker.sh
#
set -euo pipefail
# --- Проверки -----------------------------------------------------------------
if [[ $EUID -ne 0 ]]; then
echo "Запустите скрипт с правами root: sudo $0" >&2
exit 1
fi
if [[ ! -f /etc/os-release ]]; then
echo "Не удалось определить ОС (нет /etc/os-release)." >&2
exit 1
fi
# shellcheck disable=SC1091
. /etc/os-release
if [[ "${ID:-}" != "ubuntu" && "${ID_LIKE:-}" != *ubuntu* ]]; then
echo "Скрипт предназначен для Ubuntu. Обнаружено: ${PRETTY_NAME:-unknown}" >&2
exit 1
fi
# Для производных дистрибутивов (Linux Mint и т.п.) берём кодовое имя Ubuntu
CODENAME="${UBUNTU_CODENAME:-${VERSION_CODENAME:-}}"
ARCH="$(dpkg --print-architecture)"
echo ">>> Ubuntu: ${PRETTY_NAME} (${CODENAME}), архитектура: ${ARCH}"
# --- Удаление старых/неофициальных пакетов -----------------------------------
echo ">>> Удаляю конфликтующие пакеты (если есть)..."
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do
apt-get remove -y "$pkg" >/dev/null 2>&1 || true
done
# --- Зависимости --------------------------------------------------------------
echo ">>> Устанавливаю зависимости..."
apt-get update
apt-get install -y ca-certificates curl gnupg
# --- Репозиторий Docker -------------------------------------------------------
echo ">>> Добавляю GPG-ключ и репозиторий Docker..."
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=${ARCH} signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu ${CODENAME} stable" \
> /etc/apt/sources.list.d/docker.list
# --- Установка Docker ---------------------------------------------------------
echo ">>> Устанавливаю Docker Engine..."
apt-get update
apt-get install -y \
docker-ce \
docker-ce-cli \
containerd.io \
docker-buildx-plugin \
docker-compose-plugin
# --- Запуск сервиса -----------------------------------------------------------
echo ">>> Включаю автозапуск и запускаю сервис..."
systemctl enable --now docker
# --- Доступ без sudo ----------------------------------------------------------
TARGET_USER="${SUDO_USER:-}"
if [[ -n "$TARGET_USER" && "$TARGET_USER" != "root" ]]; then
echo ">>> Добавляю пользователя '${TARGET_USER}' в группу docker..."
usermod -aG docker "$TARGET_USER"
NEED_RELOGIN=1
else
NEED_RELOGIN=0
fi
# --- Проверка -----------------------------------------------------------------
echo ">>> Проверяю установку..."
docker --version
docker compose version
echo
echo "Готово! Docker успешно установлен."
if [[ "$NEED_RELOGIN" -eq 1 ]]; then
echo "Чтобы использовать docker без sudo, перезайдите в систему"
echo "или выполните: newgrp docker"
fi

