Skip to content

Instantly share code, notes, and snippets.

@thanhleviet
Created January 6, 2026 12:03
Show Gist options
  • Select an option

  • Save thanhleviet/c800558d695e45f859bbc08530970657 to your computer and use it in GitHub Desktop.

Select an option

Save thanhleviet/c800558d695e45f859bbc08530970657 to your computer and use it in GitHub Desktop.
install-docker
#!/bin/bash
#===============================================================================
# Docker & Docker Compose Installation Script for Ubuntu
# Based on: https://docs.docker.com/engine/install/ubuntu/
# Includes post-installation steps from: https://docs.docker.com/engine/install/linux-postinstall/
#===============================================================================
set -e # Exit on any error
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
print_status() {
echo -e "${GREEN}[INFO]${NC} $1"
}
print_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
print_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
#-------------------------------------------------------------------------------
# Check if running as root or with sudo
#-------------------------------------------------------------------------------
check_root() {
if [[ $EUID -ne 0 ]]; then
print_error "This script must be run as root or with sudo"
exit 1
fi
}
#-------------------------------------------------------------------------------
# Check OS compatibility
#-------------------------------------------------------------------------------
check_os() {
print_status "Checking OS compatibility..."
if [[ ! -f /etc/os-release ]]; then
print_error "Cannot determine OS. /etc/os-release not found."
exit 1
fi
. /etc/os-release
if [[ "$ID" != "ubuntu" ]]; then
print_warning "This script is designed for Ubuntu. Detected: $ID"
read -p "Do you want to continue anyway? (y/N): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
exit 1
fi
fi
print_status "Detected: $PRETTY_NAME"
}
#-------------------------------------------------------------------------------
# Uninstall old/conflicting versions
#-------------------------------------------------------------------------------
uninstall_old_versions() {
print_status "Removing any old or conflicting Docker packages..."
# List of packages to remove
local packages_to_remove=(
docker.io
docker-compose
docker-compose-v2
docker-doc
podman-docker
containerd
runc
)
# Get list of installed packages from the list
local installed_packages=""
for pkg in "${packages_to_remove[@]}"; do
if dpkg -l "$pkg" &>/dev/null 2>&1; then
installed_packages+=" $pkg"
fi
done
if [[ -n "$installed_packages" ]]; then
print_status "Removing:$installed_packages"
apt-get remove -y $installed_packages || true
else
print_status "No conflicting packages found."
fi
}
#-------------------------------------------------------------------------------
# Set up Docker's apt repository
#-------------------------------------------------------------------------------
setup_repository() {
print_status "Setting up Docker's apt repository..."
# Update package index
apt-get update
# Install prerequisites
print_status "Installing prerequisites (ca-certificates, curl)..."
apt-get install -y ca-certificates curl
# Create keyrings directory
install -m 0755 -d /etc/apt/keyrings
# Download and install Docker's official GPG key
print_status "Adding Docker's official GPG key..."
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to apt sources
print_status "Adding Docker repository to apt sources..."
# Get the Ubuntu codename
. /etc/os-release
CODENAME="${UBUNTU_CODENAME:-$VERSION_CODENAME}"
tee /etc/apt/sources.list.d/docker.sources > /dev/null <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: ${CODENAME}
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
EOF
# Update package index again
apt-get update
print_status "Docker repository configured successfully."
}
#-------------------------------------------------------------------------------
# Install Docker Engine packages
#-------------------------------------------------------------------------------
install_docker() {
print_status "Installing Docker Engine, CLI, containerd, and plugins..."
apt-get install -y \
docker-ce \
docker-ce-cli \
containerd.io \
docker-buildx-plugin \
docker-compose-plugin
print_status "Docker packages installed successfully."
}
#-------------------------------------------------------------------------------
# Post-installation: Configure docker group for non-root access
#-------------------------------------------------------------------------------
configure_docker_group() {
print_status "Configuring Docker group for non-root access..."
# Create docker group if it doesn't exist
if ! getent group docker > /dev/null 2>&1; then
groupadd docker
print_status "Created 'docker' group."
else
print_status "'docker' group already exists."
fi
# Get the actual user (not root when using sudo)
local ACTUAL_USER="${SUDO_USER:-$USER}"
if [[ "$ACTUAL_USER" != "root" ]]; then
# Add user to docker group
if ! groups "$ACTUAL_USER" | grep -q '\bdocker\b'; then
usermod -aG docker "$ACTUAL_USER"
print_status "Added user '$ACTUAL_USER' to the 'docker' group."
print_warning "You need to log out and back in for group changes to take effect."
print_warning "Or run: newgrp docker"
else
print_status "User '$ACTUAL_USER' is already in the 'docker' group."
fi
else
print_warning "Running as root. No user to add to docker group."
fi
}
#-------------------------------------------------------------------------------
# Post-installation: Enable Docker to start on boot
#-------------------------------------------------------------------------------
enable_docker_on_boot() {
print_status "Enabling Docker to start on boot..."
systemctl enable docker.service
systemctl enable containerd.service
print_status "Docker services enabled for startup."
}
#-------------------------------------------------------------------------------
# Start Docker service
#-------------------------------------------------------------------------------
start_docker() {
print_status "Starting Docker service..."
systemctl start docker
if systemctl is-active --quiet docker; then
print_status "Docker service is running."
else
print_error "Failed to start Docker service."
exit 1
fi
}
#-------------------------------------------------------------------------------
# Verify installation
#-------------------------------------------------------------------------------
verify_installation() {
print_status "Verifying Docker installation..."
echo ""
echo "========================================"
echo "Docker Version:"
echo "========================================"
docker version
echo ""
echo "========================================"
echo "Docker Compose Version:"
echo "========================================"
docker compose version
echo ""
print_status "Running hello-world container to verify..."
docker run --rm hello-world
echo ""
print_status "Installation verification complete!"
}
#-------------------------------------------------------------------------------
# Print summary
#-------------------------------------------------------------------------------
print_summary() {
echo ""
echo "========================================"
echo -e "${GREEN}Docker Installation Complete!${NC}"
echo "========================================"
echo ""
echo "Installed components:"
echo " - Docker Engine (docker-ce)"
echo " - Docker CLI (docker-ce-cli)"
echo " - containerd.io"
echo " - Docker Buildx plugin"
echo " - Docker Compose plugin"
echo ""
echo "Post-installation configuration:"
echo " - Docker group configured"
echo " - Docker enabled to start on boot"
echo ""
local ACTUAL_USER="${SUDO_USER:-$USER}"
if [[ "$ACTUAL_USER" != "root" ]]; then
echo -e "${YELLOW}IMPORTANT:${NC}"
echo " To run Docker without sudo, either:"
echo " 1. Log out and log back in, OR"
echo " 2. Run: newgrp docker"
echo ""
fi
echo "Useful commands:"
echo " docker --version # Check Docker version"
echo " docker compose version # Check Docker Compose version"
echo " docker info # Display system-wide information"
echo " docker run hello-world # Test Docker installation"
echo ""
}
#-------------------------------------------------------------------------------
# Main function
#-------------------------------------------------------------------------------
main() {
echo "========================================"
echo "Docker Installation Script for Ubuntu"
echo "========================================"
echo ""
check_root
check_os
echo ""
read -p "This will install Docker and Docker Compose. Continue? (Y/n): " -n 1 -r
echo ""
if [[ $REPLY =~ ^[Nn]$ ]]; then
print_status "Installation cancelled."
exit 0
fi
echo ""
uninstall_old_versions
setup_repository
install_docker
configure_docker_group
enable_docker_on_boot
start_docker
verify_installation
print_summary
}
# Run main function
main "$@"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment