install-docker.sh 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. #!/bin/bash
  2. set -e
  3. echo "🐳 Installing Docker and Docker Compose..."
  4. # Function to detect OS
  5. detect_os() {
  6. if [ -f /etc/os-release ]; then
  7. . /etc/os-release
  8. OS=$ID
  9. VERSION=$VERSION_ID
  10. CODENAME=${VERSION_CODENAME:-$VERSION_ID}
  11. elif [ -f /etc/redhat-release ]; then
  12. OS="rhel"
  13. VERSION=$(grep -oE '[0-9]+\.[0-9]+' /etc/redhat-release | head -1)
  14. elif [ -f /etc/debian_version ]; then
  15. OS="debian"
  16. VERSION=$(cat /etc/debian_version)
  17. else
  18. echo "❌ Cannot detect Linux distribution"
  19. exit 1
  20. fi
  21. echo "📋 Detected: $OS $VERSION"
  22. }
  23. # Function to install prerequisites
  24. install_prerequisites() {
  25. case $OS in
  26. ubuntu|debian)
  27. echo "📦 Installing prerequisites for Debian/Ubuntu..."
  28. $SUDO apt-get update
  29. $SUDO apt-get install -y \
  30. ca-certificates \
  31. curl \
  32. gnupg \
  33. lsb-release \
  34. apt-transport-https \
  35. software-properties-common
  36. ;;
  37. centos|rhel|rocky|almalinux)
  38. echo "📦 Installing prerequisites for RHEL/CentOS..."
  39. $SUDO yum install -y \
  40. ca-certificates \
  41. curl \
  42. gnupg \
  43. yum-utils \
  44. device-mapper-persistent-data \
  45. lvm2
  46. ;;
  47. fedora)
  48. echo "📦 Installing prerequisites for Fedora..."
  49. $SUDO dnf install -y \
  50. ca-certificates \
  51. curl \
  52. gnupg \
  53. dnf-plugins-core \
  54. device-mapper-persistent-data \
  55. lvm2
  56. ;;
  57. opensuse*|sles)
  58. echo "📦 Installing prerequisites for openSUSE/SLES..."
  59. $SUDO zypper install -y \
  60. ca-certificates \
  61. curl \
  62. gnupg \
  63. libdevmapper1_03 \
  64. liblvm2app2_2
  65. ;;
  66. arch|manjaro)
  67. echo "📦 Installing prerequisites for Arch/Manjaro..."
  68. $SUDO pacman -S --noconfirm \
  69. ca-certificates \
  70. curl \
  71. gnupg \
  72. lvm2 \
  73. device-mapper
  74. ;;
  75. alpine)
  76. echo "📦 Installing prerequisites for Alpine..."
  77. $SUDO apk add --no-cache \
  78. ca-certificates \
  79. curl \
  80. gnupg \
  81. device-mapper \
  82. lvm2
  83. ;;
  84. *)
  85. echo "⚠️ Unsupported OS: $OS"
  86. echo "🔄 Trying generic Docker installation..."
  87. ;;
  88. esac
  89. }
  90. # Function to remove old Docker versions
  91. remove_old_docker() {
  92. case $OS in
  93. ubuntu|debian)
  94. $SUDO apt-get remove -y docker docker-engine docker.io containerd runc 2>/dev/null || true
  95. ;;
  96. centos|rhel|rocky|almalinux)
  97. $SUDO yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 2>/dev/null || true
  98. ;;
  99. fedora)
  100. $SUDO dnf remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine 2>/dev/null || true
  101. ;;
  102. opensuse*|sles)
  103. $SUDO zypper remove -y docker docker-runc docker-containerd 2>/dev/null || true
  104. ;;
  105. arch|manjaro)
  106. $SUDO pacman -Rns --noconfirm docker docker-compose 2>/dev/null || true
  107. ;;
  108. alpine)
  109. $SUDO apk del docker docker-compose 2>/dev/null || true
  110. ;;
  111. esac
  112. }
  113. # Function to install Docker
  114. install_docker() {
  115. case $OS in
  116. ubuntu|debian)
  117. echo "🐳 Installing Docker for Ubuntu/Debian..."
  118. # Add Docker's GPG key
  119. $SUDO mkdir -p /etc/apt/keyrings
  120. curl -fsSL https://download.docker.com/linux/$OS/gpg | $SUDO gpg --dearmor -o /etc/apt/keyrings/docker.gpg
  121. $SUDO chmod a+r /etc/apt/keyrings/docker.gpg
  122. # Add repository
  123. echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/$OS $(lsb_release -cs) stable" | $SUDO tee /etc/apt/sources.list.d/docker.list > /dev/null
  124. # Install Docker
  125. $SUDO apt-get update
  126. $SUDO apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  127. ;;
  128. centos|rhel|rocky|almalinux)
  129. echo "🐳 Installing Docker for RHEL/CentOS..."
  130. $SUDO yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  131. $SUDO yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  132. ;;
  133. fedora)
  134. echo "🐳 Installing Docker for Fedora..."
  135. $SUDO dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo
  136. $SUDO dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  137. ;;
  138. opensuse*|sles)
  139. echo "🐳 Installing Docker for openSUSE/SLES..."
  140. $SUDO zypper addrepo https://download.docker.com/linux/sles/docker-ce.repo
  141. $SUDO zypper refresh
  142. $SUDO zypper install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin
  143. ;;
  144. arch|manjaro)
  145. echo "🐳 Installing Docker for Arch/Manjaro..."
  146. $SUDO pacman -S --noconfirm docker docker-compose
  147. ;;
  148. alpine)
  149. echo "🐳 Installing Docker for Alpine..."
  150. $SUDO apk add --no-cache docker docker-compose
  151. ;;
  152. *)
  153. echo "🐳 Using universal Docker installation script..."
  154. curl -fsSL https://get.docker.com | $SUDO bash
  155. ;;
  156. esac
  157. }
  158. # Function to install Docker Compose (standalone)
  159. install_docker_compose() {
  160. # Check if Docker Compose plugin is available
  161. if docker compose version &>/dev/null; then
  162. echo "✅ Docker Compose v2 plugin is already available"
  163. return 0
  164. fi
  165. echo "📥 Installing standalone Docker Compose..."
  166. DOCKER_COMPOSE_VERSION=$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep 'tag_name' | cut -d\" -f4)
  167. case $OS in
  168. arch|manjaro)
  169. # Arch has docker-compose in repos
  170. if ! command -v docker-compose &>/dev/null; then
  171. $SUDO pacman -S --noconfirm docker-compose
  172. fi
  173. ;;
  174. alpine)
  175. # Alpine has docker-compose in repos
  176. if ! command -v docker-compose &>/dev/null; then
  177. $SUDO apk add --no-cache docker-compose
  178. fi
  179. ;;
  180. *)
  181. # Download binary for other systems
  182. $SUDO curl -L "https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  183. $SUDO chmod +x /usr/local/bin/docker-compose
  184. $SUDO ln -sf /usr/local/bin/docker-compose /usr/bin/docker-compose 2>/dev/null || true
  185. ;;
  186. esac
  187. }
  188. # Function to start Docker service
  189. start_docker() {
  190. case $OS in
  191. arch|manjaro|alpine)
  192. if command -v systemctl &>/dev/null; then
  193. $SUDO systemctl start docker
  194. $SUDO systemctl enable docker
  195. elif command -v service &>/dev/null; then
  196. $SUDO service docker start
  197. elif command -v rc-service &>/dev/null; then
  198. $SUDO rc-service docker start
  199. $SUDO rc-update add docker default
  200. fi
  201. ;;
  202. *)
  203. $SUDO systemctl start docker
  204. $SUDO systemctl enable docker
  205. ;;
  206. esac
  207. }
  208. # Main installation process
  209. detect_os
  210. # Check if running as root
  211. if [ "$EUID" -eq 0 ]; then
  212. SUDO=""
  213. echo "🔑 Running as root"
  214. else
  215. SUDO="sudo"
  216. echo "🔑 Running with sudo"
  217. fi
  218. echo "🧹 Removing old Docker versions..."
  219. remove_old_docker
  220. echo "📦 Installing prerequisites..."
  221. install_prerequisites
  222. echo "🐳 Installing Docker..."
  223. install_docker
  224. echo "🔨 Setting up Docker Compose..."
  225. install_docker_compose
  226. echo "🚀 Starting Docker service..."
  227. start_docker
  228. # Add user to docker group (if not root)
  229. if [ "$EUID" -ne 0 ]; then
  230. echo "👤 Adding user to docker group..."
  231. $SUDO usermod -aG docker $USER
  232. echo "⚠️ You need to log out and back in for group changes to take effect"
  233. echo " Or run: newgrp docker"
  234. fi
  235. # Test Docker installation
  236. echo "🧪 Testing Docker installation..."
  237. if $SUDO docker run --rm hello-world &>/dev/null; then
  238. echo "✅ Docker installed successfully!"
  239. else
  240. echo "❌ Docker installation test failed"
  241. exit 1
  242. fi
  243. # Test Docker Compose installation
  244. echo "🧪 Testing Docker Compose installation..."
  245. if command -v docker-compose &>/dev/null; then
  246. COMPOSE_VERSION=$(docker-compose --version)
  247. echo "✅ Docker Compose installed: $COMPOSE_VERSION"
  248. elif docker compose version &>/dev/null; then
  249. COMPOSE_VERSION=$(docker compose version)
  250. echo "✅ Docker Compose plugin installed: $COMPOSE_VERSION"
  251. else
  252. echo "❌ Docker Compose installation failed"
  253. exit 1
  254. fi
  255. echo ""
  256. echo "🎉 Installation completed successfully!"
  257. echo "📋 Summary:"
  258. echo " - OS: $OS $VERSION"
  259. echo " - Docker Engine: $(docker --version)"
  260. if command -v docker-compose &>/dev/null; then
  261. echo " - Docker Compose: $(docker-compose --version)"
  262. elif docker compose version &>/dev/null; then
  263. echo " - Docker Compose: $(docker compose version)"
  264. fi
  265. echo ""
  266. if [ "$EUID" -ne 0 ]; then
  267. echo "⚠️ Remember to log out and back in, or run 'newgrp docker' to use Docker without sudo"
  268. fi