#!/bin/bash ############################################## # Docker Installation Script for Ubuntu # Installa la versione ufficiale più recente # di Docker Engine su Ubuntu Linux ############################################## set -e # Esce se un comando fallisce # Colori per l'output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # Funzione per stampare messaggi print_header() { echo -e "\n${GREEN}=== $1 ===${NC}\n" } print_info() { echo -e "${GREEN}✓${NC} $1" } print_error() { echo -e "${RED}✗${NC} $1" } print_warning() { echo -e "${YELLOW}⚠${NC} $1" } # Installazione facoltativa di Portainer install_portainer() { local repo_url="https://git.pyconetwork.it/francesco/portainer.git" local target_dir="/opt/portainer" print_header "Installazione di Portainer (opzionale)" if ! command -v git &> /dev/null; then print_warning "git non trovato. Installazione in corso" apt-get install -y git print_info "git installato" fi if [ -d "$target_dir/.git" ]; then print_warning "Repository gia presente in $target_dir. Aggiorno" git -C "$target_dir" pull else rm -rf "$target_dir" git clone "$repo_url" "$target_dir" fi if [ -f "$target_dir/docker-compose.yml" ] || [ -f "$target_dir/compose.yaml" ]; then print_info "Avvio dei servizi con Docker Compose" docker compose -f "$target_dir/docker-compose.yml" up -d 2>/dev/null || \ docker compose -f "$target_dir/compose.yaml" up -d print_info "Portainer avviato" return fi if [ -f "$target_dir/install.sh" ]; then print_info "Esecuzione dello script di installazione del repository" bash "$target_dir/install.sh" print_info "Installazione completata" return fi print_warning "Nessun file di avvio trovato (docker-compose.yml/compose.yaml/install.sh)" print_warning "Controlla il repository in $target_dir per i passi manuali" } # Verifica che lo script sia eseguito con privilegi sudo if [[ $EUID -ne 0 ]]; then print_error "Questo script deve essere eseguito con sudo" echo "Usa: sudo bash install_docker.sh" exit 1 fi # Verifica che il sistema sia Ubuntu/Debian if ! command -v lsb_release &> /dev/null; then print_error "lsb_release non trovato. Assicurati di usare Ubuntu o Debian" exit 1 fi OS_VERSION=$(lsb_release -cs) print_header "Installazione di Docker su Ubuntu ($OS_VERSION)" # Step 1: Aggiornamento dei repository e installazione dipendenze print_header "Step 1: Aggiornamento del sistema e installazione dipendenze" apt-get update apt-get install -y apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release print_info "Dipendenze installate" # Step 2: Aggiunta della GPG key di Docker print_header "Step 2: Aggiunta della GPG key ufficiale di Docker" mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg chmod a+r /etc/apt/keyrings/docker.gpg print_info "GPG key aggiunta" # Step 3: Aggiunta del repository di Docker print_header "Step 3: Configurazione del repository di Docker" echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null apt-get update print_info "Repository di Docker aggiunto" # Step 4: Installazione di Docker print_header "Step 4: Installazione di Docker Engine, CLI e containerd" apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin print_info "Docker installato con successo" # Step 5: Avvio e abilitazione del servizio Docker print_header "Step 5: Configurazione del servizio Docker" systemctl start docker systemctl enable docker print_info "Servizio Docker avviato e abilitato al boot" # Step 6: Configurazione permessi per l'utente corrente print_header "Step 6: Configurazione permessi per l'utente Docker" # Se lo script è stato eseguito con sudo da un utente normale if [ ! -z "$SUDO_USER" ]; then usermod -aG docker "$SUDO_USER" print_info "Utente $SUDO_USER aggiunto al gruppo docker" print_warning "Effettua il logout e login per attivare i permessi del gruppo docker" else print_warning "Lo script è stato eseguito come root. Per usare Docker senza sudo:" print_warning " 1. Crea un utente non-root" print_warning " 2. Esegui: sudo usermod -aG docker " print_warning " 3. Effettua il logout/login" fi # Step 7: Verifica dell'installazione print_header "Step 7: Verifica dell'installazione" # Versione di Docker DOCKER_VERSION=$(docker --version) print_info "Docker version: $DOCKER_VERSION" # Verifica che il servizio sia attivo if systemctl is-active --quiet docker; then print_info "Servizio Docker: ATTIVO" else print_error "Servizio Docker: INATTIVO" exit 1 fi # Test con hello-world print_header "Esecuzione del test con l'immagine hello-world" if [ ! -z "$SUDO_USER" ]; then sudo -u "$SUDO_USER" docker run --rm hello-world > /dev/null 2>&1 else docker run --rm hello-world > /dev/null 2>&1 fi if [ $? -eq 0 ]; then print_info "Test hello-world completato con successo" else print_warning "Il test hello-world ha riscontrato problemi" fi # Step 8: Installazione facoltativa di Portainer read -r -p "Vuoi installare Portainer? [y/N]: " INSTALL_PORTAINER case "$INSTALL_PORTAINER" in y|Y|yes|YES) install_portainer ;; *) print_info "Installazione di Portainer saltata" ;; esac # Riepilogo finale print_header "Installazione completata!" echo -e "${GREEN}Docker è pronto per l'uso${NC}" echo "" echo "Comandi utili:" echo " docker --version # Mostra la versione di Docker" echo " docker ps # Elenca i container attivi" echo " docker images # Elenca le immagini disponibili" echo " docker run # Esegui una nuova immagine" echo " docker compose --version # Mostra la versione di Docker Compose" echo "" print_info "Documentazione: https://docs.docker.com"