Last active 1752386953

A versatile, stable and fully automated script to install Docker on Ubuntu.

install-docker.sh Raw
1#!/bin/bash
2set -e
3
4# Оптимизиран Docker инсталатор за Ubuntu
5# Версия: 3.0 - Надежден и пълен с функции
6# Автор: Федя Серафиев
7# Сайт: https://urocibg.eu
8# Дата: $(date +%Y-%m-%d)
9
10# Конфигурация
11CHANNEL="stable"
12VERSION=""
13DOWNLOAD_URL="https://download.docker.com"
14COLOR_GREEN='\033[0;32m'
15COLOR_RED='\033[0;31m'
16COLOR_RESET='\033[0m'
17
18# Помощна функция за цветен изход
19info() {
20 echo -e "${COLOR_GREEN}[INFO]${COLOR_RESET} $1"
21}
22
23error() {
24 echo -e "${COLOR_RED}[ERROR]${COLOR_RESET} $1" >&2
25 exit 1
26}
27
28# Обработка на параметри
29show_help() {
30 cat <<EOF
31Употреба: $0 [опции]
32
33Опции:
34 --version VERSION Инсталира конкретна версия на Docker
35 --channel CHANNEL Избира канал (stable/test) (по подразбиране: stable)
36 --help Показва този помощен текст
37
38Примери:
39 $0 # Инсталира най-новата стабилна версия
40 $0 --version 24.0 # Инсталира Docker версия 24.0
41 $0 --channel test # Инсталира от test канала
42EOF
43 exit 0
44}
45
46while [[ $# -gt 0 ]]; do
47 case $1 in
48 --version)
49 VERSION="$2"
50 shift 2
51 ;;
52 --channel)
53 if [[ "$2" != "stable" && "$2" != "test" ]]; then
54 error "Невалиден канал. Използвайте 'stable' или 'test'"
55 fi
56 CHANNEL="$2"
57 shift 2
58 ;;
59 --help)
60 show_help
61 ;;
62 *)
63 error "Неизвестен параметър: $1\nИзползвайте --help за помощ"
64 ;;
65 esac
66done
67
68# Проверка за root права
69if [[ $EUID -ne 0 ]]; then
70 error "Този скрипт трябва да се изпълнява с root права или чрез sudo"
71fi
72
73# Проверка за Ubuntu
74if ! grep -q "ubuntu" /etc/os-release 2>/dev/null; then
75 error "Този скрипт е предназначен само за Ubuntu системи"
76fi
77
78# Получаване на версията на Ubuntu
79UBUNTU_VERSION=$(grep -oP 'VERSION_CODENAME=\K\w+' /etc/os-release 2>/dev/null || lsb_release -cs 2>/dev/null)
80
81if [[ -z "$UBUNTU_VERSION" ]]; then
82 error "Не може да се определи версията на Ubuntu"
83fi
84
85info "🐳 Започва инсталация на Docker Engine за Ubuntu $UBUNTU_VERSION ($CHANNEL канал)"
86
87# Проверка за вече инсталиран Docker
88if command -v docker &>/dev/null; then
89 info "ℹ️ Docker вече е инсталиран. Ще бъде актуализиран..."
90 sleep 2
91fi
92
93# Премахване на стари версии
94info "🧹 Премахване на стари Docker пакети (ако има такива)..."
95{
96 apt-get remove -y docker docker-engine docker.io containerd runc || true
97 apt-get purge -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin || true
98} >/dev/null 2>&1
99
100# Актуализиране на системата
101info "🔄 Актуализиране на списъка с пакети..."
102apt-get update -qq >/dev/null
103
104# Инсталиране на зависимости
105info "📦 Инсталиране на необходимите зависимости..."
106apt-get install -y -qq \
107 ca-certificates \
108 curl \
109 gnupg \
110 lsb-release \
111 software-properties-common \
112 apt-transport-https >/dev/null
113
114# Добавяне на Docker GPG ключ
115info "🔑 Добавяне на официалния Docker GPG ключ..."
116mkdir -p /etc/apt/keyrings
117curl -fsSL "$DOWNLOAD_URL/linux/ubuntu/gpg" | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
118chmod a+r /etc/apt/keyrings/docker.gpg
119
120# Добавяне на Docker хранилище
121info "📥 Добавяне на Docker хранилище за Ubuntu $UBUNTU_VERSION..."
122echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] $DOWNLOAD_URL/linux/ubuntu $UBUNTU_VERSION $CHANNEL" | \
123 tee /etc/apt/sources.list.d/docker.list >/dev/null
124
125# Актуализиране на пакетния индекс
126info "🔄 Актуализиране на списъка с пакети след добавяне на Docker хранилището..."
127apt-get update -qq >/dev/null
128
129# Определяне на пакетите за инсталиране
130PACKAGES="docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin"
131
132# Ако е зададена конкретна версия
133if [[ -n "$VERSION" ]]; then
134 info "🔍 Търсене на Docker версия $VERSION..."
135 PKG_VERSION=$(apt-cache madison docker-ce | awk -F"|" '{print $2}' | grep "$VERSION" | tr -d ' ' | head -1)
136
137 if [[ -z "$PKG_VERSION" ]]; then
138 error "Версия $VERSION не е намерена в хранилището!\nНалични версии:\n$(apt-cache madison docker-ce | head -10)"
139 fi
140
141 PACKAGES="docker-ce=$PKG_VERSION docker-ce-cli=$PKG_VERSION containerd.io docker-buildx-plugin docker-compose-plugin"
142 info "🎯 Ще бъде инсталирана версия $PKG_VERSION"
143fi
144
145# Инсталиране на Docker
146info "🚀 Инсталиране на Docker..."
147export DEBIAN_FRONTEND=noninteractive
148apt-get install -y -qq $PACKAGES >/dev/null
149
150# Стартиране и активиране на Docker услугата
151info "⚙️ Конфигуриране на Docker услугата..."
152systemctl enable --now docker >/dev/null 2>&1
153
154# Проверка на инсталацията
155DOCKER_VERSION=$(docker --version 2>/dev/null || true)
156if [[ -z "$DOCKER_VERSION" ]]; then
157 error "Docker не е инсталиран успешно"
158else
159 info "$DOCKER_VERSION е инсталиран успешно"
160fi
161
162# Тестване с hello-world
163info "🧪 Тестване на Docker инсталацията..."
164if docker run --rm hello-world >/dev/null 2>&1; then
165 info "🎉 Docker работи правилно!"
166else
167 error "Docker инсталацията има проблеми"
168fi
169
170# Добавяне на потребителя в docker групата
171CURRENT_USER=${SUDO_USER:-$(whoami)}
172if ! id -nG "$CURRENT_USER" | grep -qw "docker"; then
173 info "👥 Добавяне на потребител '$CURRENT_USER' към docker групата..."
174 usermod -aG docker "$CURRENT_USER"
175 info "ℹ️ За да влязат промените в сила, изпълнете:\n ${COLOR_GREEN}newgrp docker${COLOR_RESET}\nили излезте от системата и влезте отново"
176fi
177
178# Показване на полезни команди
179cat <<EOF
180
181${COLOR_GREEN}🎉 Docker е успешно инсталиран и конфигуриран!${COLOR_RESET}
182
183📝 Полезни команди:
184 docker --version # Проверка на версията
185 docker info # Информация за Docker
186 docker run hello-world # Тестване
187 docker ps # Списък на работещите контейнери
188 docker ps -a # Списък на всички контейнери
189 docker images # Списък на изображенията
190 docker exec -it <container> bash # Влизане в контейнер
191
192🔧 Управление на услугата:
193 sudo systemctl start docker # Стартиране на Docker
194 sudo systemctl stop docker # Спиране на Docker
195 sudo systemctl restart docker # Рестартиране на Docker
196
197ℹ️ За повече информация посетете: https://docs.docker.com
198EOF