136 lines
3.9 KiB
Bash
136 lines
3.9 KiB
Bash
#!/bin/bash
|
|
|
|
# Script to install Docker on Ubuntu 24.04
|
|
# Must be run with root privileges
|
|
|
|
# Error handling
|
|
set -e
|
|
trap 'echo "Error on line $LINENO. Exit code: $?"' ERR
|
|
|
|
# Utility functions
|
|
log_message() {
|
|
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
|
|
}
|
|
|
|
is_step_completed() {
|
|
[ -f "/var/log/docker_install/$1" ]
|
|
}
|
|
|
|
save_checkpoint() {
|
|
mkdir -p /var/log/docker_install
|
|
touch "/var/log/docker_install/$1"
|
|
}
|
|
|
|
# Check if script is run as root
|
|
if [ "$EUID" -ne 0 ]; then
|
|
echo "Please run as root"
|
|
exit 1
|
|
fi
|
|
|
|
# Check Ubuntu version
|
|
if ! grep -q "Ubuntu 24.04" /etc/os-release; then
|
|
log_message "Warning: This script is designed for Ubuntu 24.04. Your version may differ."
|
|
read -p "Do you want to continue? (y/N) " -n 1 -r
|
|
echo
|
|
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
# Remove old versions if exist
|
|
if ! is_step_completed "old_versions_removed"; then
|
|
log_message "Removing old Docker versions if they exist..."
|
|
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do
|
|
apt-get remove -y $pkg >/dev/null 2>&1 || true
|
|
done
|
|
save_checkpoint "old_versions_removed"
|
|
fi
|
|
|
|
# Install prerequisites
|
|
if ! is_step_completed "prerequisites_installed"; then
|
|
log_message "Installing prerequisites..."
|
|
apt-get update
|
|
apt-get install -y \
|
|
ca-certificates \
|
|
curl \
|
|
gnupg \
|
|
lsb-release
|
|
save_checkpoint "prerequisites_installed"
|
|
fi
|
|
|
|
# Install Docker
|
|
if ! is_step_completed "docker_installed"; then
|
|
log_message "Installing Docker..."
|
|
install -m 0755 -d /etc/apt/keyrings
|
|
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
|
|
chmod a+r /etc/apt/keyrings/docker.asc
|
|
|
|
echo \
|
|
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
|
|
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
|
|
tee /etc/apt/sources.list.d/docker.list > /dev/null
|
|
|
|
apt-get update
|
|
apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
|
|
|
# Create docker user if not exists
|
|
if ! id "dockeruser" &>/dev/null; then
|
|
useradd -m -s /bin/bash dockeruser
|
|
usermod -aG docker dockeruser
|
|
fi
|
|
|
|
save_checkpoint "docker_installed"
|
|
fi
|
|
|
|
# Verify installation
|
|
if ! is_step_completed "installation_verified"; then
|
|
log_message "Verifying Docker installation..."
|
|
if ! docker run hello-world > /dev/null; then
|
|
log_message "Error: Docker installation verification failed"
|
|
exit 1
|
|
fi
|
|
save_checkpoint "installation_verified"
|
|
fi
|
|
|
|
# Configure Docker to start on boot
|
|
if ! is_step_completed "docker_configured"; then
|
|
log_message "Configuring Docker..."
|
|
systemctl enable docker.service
|
|
systemctl enable containerd.service
|
|
save_checkpoint "docker_configured"
|
|
fi
|
|
|
|
# Set up Docker daemon configuration
|
|
if ! is_step_completed "daemon_configured"; then
|
|
log_message "Setting up Docker daemon configuration..."
|
|
mkdir -p /etc/docker
|
|
cat > /etc/docker/daemon.json <<EOF
|
|
{
|
|
"log-driver": "json-file",
|
|
"log-opts": {
|
|
"max-size": "100m",
|
|
"max-file": "3"
|
|
},
|
|
"default-address-pools": [
|
|
{
|
|
"base": "172.17.0.0/16",
|
|
"size": 24
|
|
}
|
|
]
|
|
}
|
|
EOF
|
|
save_checkpoint "daemon_configured"
|
|
fi
|
|
|
|
# Restart Docker to apply changes
|
|
if ! is_step_completed "final_restart"; then
|
|
log_message "Restarting Docker service..."
|
|
systemctl restart docker
|
|
save_checkpoint "final_restart"
|
|
fi
|
|
|
|
log_message "Docker installation completed successfully!"
|
|
log_message "Docker version: $(docker --version)"
|
|
log_message "Docker Compose version: $(docker compose version)"
|
|
log_message "Docker user 'dockeruser' has been created and added to the docker group"
|
|
log_message "You may need to log out and back in for group changes to take effect"
|