Docker Auto Setup on Ubuntu
Script to automatically setup docker, docker-compose, ctop and watchtower on a newly installed Ubuntu 24.04 Server.
Filename: ubuntu-docker.sh
#!/bin/bash
# Filename: ubuntu-docker.sh
# Perform basic config/tuning of docker and tools on a newly installed Ubuntu server.
# Run this script only once!
#
# To run to run use one of the below commands:
# wget -O - -q https://go.poorna.net/go/ubuntu-docker.sh | bash
# curl -s https://go.poorna.net/go/ubuntu-docker.sh | bash
# Check that we are running this as root
if [ "$(id -u)" -ne 0 ]; then
echo 'ERROR: This script must be run as root.'
exit 1
fi
# Ensure that we are running on an ubuntu host
. /etc/os-release
if [ "$ID" != "ubuntu" ]; then
echo 'ERROR: This script is intended to run only on an Ubuntu host.'
exit 1
fi
# Ensure we run on x86_64 architecture only, ctop/docker-compose download URLs are hardcoded
if [ "$(arch)" != "x86_64" ]; then
echo 'ERROR: This script is intended to run only on x86_64 architecture.'
exit 1
fi
set -eoux pipefail
echo 'Installing docker jq logrotate'
apt update; apt install -y docker.io jq logrotate; apt clean
echo 'Setting docker daemon.json'
cat > /etc/docker/daemon.json <<EOT
{
"log-driver": "local",
"log-opts": {
"max-size": "15m",
"max-file": "5"
}
}
EOT
echo 'Restarting docker with new config'
systemctl restart docker
# Install docker-compose from Github releases
wget -q -O - https://api.github.com/repos/docker/compose/releases/latest | \
jq -r '.assets[] | select(.name=="docker-compose-linux-x86_64") | .browser_download_url' | \
wget -i /dev/stdin -O /usr/local/bin/docker-compose
chmod 755 /usr/local/bin/docker-compose
ln -s docker-compose /usr/local/bin/d
# For "docker compose" also to work
mkdir -p /usr/local/lib/docker/cli-plugin
ln -s ../../../bin/docker-compose /usr/local/lib/docker/cli-plugins/
# Install ctop from Github releases
wget -q -O - https://api.github.com/repos/bcicen/ctop/releases/latest | \
jq -r '.assets[] | select(.name | test("linux-amd64$")) | .browser_download_url' | \
wget -i /dev/stdin -O /usr/local/bin/ctop
chmod 755 /usr/local/bin/ctop
# Creating watchtower docker container
echo 'Creating watchtower docker container'
mkdir -p /opt/watchtower
cat > /opt/watchtower/docker-compose.yml <<EOT
# docker-compose file to start up watchtower, docker container auto updating service
# to start the container run:
# docker-compose up -d
#
# Note: nickfedor/watchtower service will auto update this container
name: watchtower-localhost
services:
watchtower:
image: nickfedor/watchtower
container_name: watchtower.localhost
restart: always
mem_limit: 128M
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /etc/localtime:/etc/localtime:ro
labels:
- com.centurylinklabs.watchtower.enable=true
# Update containers at 4.15am and delete old images after update
command: --label-enable --cleanup --schedule "0 15 4 * * *"
EOT
echo 'Starting watchtower docker container'
docker-compose -f /opt/watchtower/docker-compose.yml up -d
echo 'Installing run.sh to run watchtower manually'
cat > /opt/watchtower/run.sh <<EOT
#!/bin/sh
# Filename: run.sh
# Manually run watchtower once to update all docker containers
docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
nickfedor/watchtower --cleanup --label-enable --run-once
EOT
chmod 755 /opt/watchtower/run.sh
echo 'SUCCESS: docker and other packages installed successfully'