Skip to content

Instantly share code, notes, and snippets.

@jasenmichael
Last active March 15, 2025 20:55
Show Gist options
  • Save jasenmichael/4aea6c4a698296fc7a3105b6d0998b06 to your computer and use it in GitHub Desktop.
Save jasenmichael/4aea6c4a698296fc7a3105b6d0998b06 to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash
# shellcheck disable=SC1091
if [ "$1" != "--reinstall" ]; then
# exit if docker is already installed
if [[ $(which docker) && $(docker --version) ]]; then
echo "Docker already installed"
echo "Use --reinstall to reinstall"
exit 0
fi
echo "Installing Docker..."
else
echo "Reinstalling Docker..."
fi
sleep 2
# https://docs.docker.com/engine/install/ubuntu/
is_ubuntu() {
if [ -f /etc/os-release ]; then
. /etc/os-release
if [[ "$ID_LIKE" == *"ubuntu"* || -z "${UBUNTU_CODENAME:-}" ]]; then
return 0
fi
fi
return 1
}
remove_docker_packages() {
# remove old docker packages
echo "## Removing old docker packages..."
sudo apt-get remove docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc -y &>/dev/null || true
# remove newer docker packages
echo "## Removing newer docker packages..."
sudo apt-get remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y &>/dev/null || true
}
remove_docker_keys() {
# remove any old keys
echo "## Removing old keys..."
sudo rm -f /etc/apt/keyrings/docker.asc &>/dev/null
sudo rm -f /etc/apt/keyrings/docker.gpg &>/dev/null
sudo rm -f /etc/apt/sources.list.d/docker.list &>/dev/null
}
install_docker_keys() {
# Add Docker's official GPG key:
echo "## Adding Docker's official GPG key..."
sudo apt-get update -y
sudo apt-get install ca-certificates curl -y
sudo install -m 0755 -d /etc/apt/keyrings
if is_ubuntu; then
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
else
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
fi
}
add_docker_repository() {
# Add the repository to Apt sources:
if is_ubuntu; then
echo "## Adding Docker repository for Ubuntu..."
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" |
sudo tee /etc/apt/sources.list.d/docker.list >/dev/null
else
echo "## Adding Docker repository for Debian..."
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" |
sudo tee /etc/apt/sources.list.d/docker.list >/dev/null
fi
sudo apt-get update
}
install_docker_packages() {
echo "## Installing Docker packages..."
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
}
post_install() {
echo "## Docker post installation..."
sudo ln -sf /usr/libexec/docker/cli-plugins/docker-compose /usr/bin/docker-compose
sudo groupadd docker &>/dev/null || true
sudo usermod -aG docker "$USER" &>/dev/null || true
mkdir -p "$HOME/.docker" &>/dev/null || true
sudo chown "$USER":"$USER" "$HOME/.docker" -R &>/dev/null || true
sudo chmod g+rwx "$HOME/.docker" -R &>/dev/null || true
# newgrp docker &>/dev/null || true
echo "Added $USER to the docker group"
}
confirm_docker_installation() {
# check if docker installed
if [[ $(which docker) && $(docker --version) ]]; then
echo "## Docker installed successfully"
else
echo "## Docker installation failed"
exit 1
fi
}
# do it
remove_docker_packages &&
remove_docker_keys &&
install_docker_keys &&
add_docker_repository &&
install_docker_packages &&
post_install &&
confirm_docker_installation &&
echo "" &&
docker --version &&
docker compose version
@jasenmichael
Copy link
Author

jasenmichael commented Mar 14, 2025

Docker Installer Script

This script automatically installs the latest version of Docker and Docker Compose on Debian, Ubuntu-based systems (Ubuntu, Pop!_OS), and Windows WSL environments. It handles the entire installation process including removing old versions, adding Docker's official repository, configuring permissions, and adding your user to the Docker group for rootless operation.

Installation Options

Run directly from CLI

curl -fsSL https://gist.githubusercontent.com/jasenmichael/4aea6c4a698296fc7a3105b6d0998b06/raw/install-docker.sh | bash
# or reinstall existing Docker installation
# curl -fsSL https://gist.githubusercontent.com/jasenmichael/4aea6c4a698296fc7a3105b6d0998b06/raw/install-docker.sh | bash -s -- --reinstall

Download and run locally

cd <your-scripts-dir>
curl -fsSL https://gist.githubusercontent.com/jasenmichael/4aea6c4a698296fc7a3105b6d0998b06/raw/install-docker.sh -o ./install-docker.sh
chmod +x ./install-docker.sh
./install-docker.sh

# or reinstall existing Docker installation
# ./install-docker.sh --reinstall

After installation, you may need to log out and back in for group permissions to take effect, or run newgrp docker to use Docker without restarting your session.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment