Created
January 6, 2026 12:03
-
-
Save thanhleviet/c800558d695e45f859bbc08530970657 to your computer and use it in GitHub Desktop.
install-docker
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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