How To Install Docker Ubuntu

How To Install Docker Ubuntu

Reading time1 min
#DevOps#OpenSource#Cloud#Docker#Ubuntu#Containerization

Mastering Docker Installation on Ubuntu: A Proven Workflow for Dependable Containerization

Container orchestration falls apart quickly if the container runtime itself wobbles. On Ubuntu, reliable Docker setup is more subtle than many guides admit. Backed by real production snafus, the following sequence ensures compatibility, upgradability, and minimal friction downstream—think long-term kubectl sanity, not just “docker run hello-world”.


The Impact of Initial Conditions

Side effects from a hasty or hybrid install:

  • Legacy or conflicting binaries (snap, apt default) choke upgrades
  • permission denied while trying to connect to the Docker daemon socket—a perennial favorite among support tickets
  • Package version drift (Docker 20.x lurking in apt’s provided docker.io, well behind the Docker CE release cadence)

Protocol: always build from the official Docker APT repository, clean out retro binaries, and lock out surprises.


1. Sanitize Your Environment

Remove old installations and clear out cruft:

sudo apt-get update
sudo apt-get remove -y docker docker-engine docker.io containerd runc snapd
sudo apt-get autoremove -y

Note: Snap-based Docker installs (common on recent Ubuntu desktops) tend to conflict at the unit/service layer. Audit for remnants:

snap list | grep docker

2. Install Essential Prerequisites

Configure the system to communicate with external, HTTPS repositories:

sudo apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release
  • gnupg for GPG key management
  • lsb-release ensures proper codename parsing in next steps

3. Register the Docker APT Repository GPG Key

Avoid MITM attacks by explicitly storing the Docker public key—not just piping to apt-key (deprecated):

curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
  | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Verify the fingerprint matches the official documentation (sudo gpg --show-keys /usr/share/keyrings/docker-archive-keyring.gpg).


4. Add the Stable Docker Repository

Use your actual codename (e.g., focal for 20.04, jammy for 22.04):

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] \
  https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" \
  | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Gotcha: Omitting signed-by often leads to GPG signature errors on installation.


5. Installation: Docker Engine and Containerd

Refresh package cache after registry change:

sudo apt-get update

Install Docker’s core components (prefer explicit versions in controlled environments):

sudo apt-get install -y docker-ce docker-ce-cli containerd.io

Table:

PackageRole
docker-ceEngine (daemon, REST API)
docker-ce-cliClient binary (docker)
containerd.ioLow-level container runtime (CNCF standard)

Want a specific patch-level version? List available releases:

apt-cache madison docker-ce

Pin version, if needed:

sudo apt-get install docker-ce=5:24.0.7-1~ubuntu.22.04~jammy

6. Post-Install: Validation and Permissions

Check version for assurance:

docker --version
# Expected: Docker version 24.0.7, build afdd53b

Sanity test: run a trusted, minimal image:

sudo docker run --rm hello-world

Expected output:

Hello from Docker!

Non-root Execution (Highly Recommended)

Add your user to the docker group. Avoid using this on shared/multi-user servers—docker group can escalate to root-equivalent privileges.

sudo usermod -aG docker $USER
newgrp docker  # refreshes group in current session

Reboot or log in again if unpredictably denied access.


7. Common Failure Modes & Remediation

  1. Daemon unavailable

    Cannot connect to the Docker daemon at unix:///var/run/docker.sock
    
    • Solution:
      Is the daemon running?
      sudo systemctl status docker
      
      Start if necessary:
      sudo systemctl start docker
      
  2. Old kernel, no cgroups v2

    • Symptom: Containers hang or refuse to start.
      Ubuntu 18.04 and earlier often lag here. Use uname -r and consider kernel upgrade if deploying Kubernetes.
  3. Snap-vs-APT collision

    • Remove snap completely before proceeding:
      sudo snap remove docker
      
    • Still see docker.socket or leftover symlinks? Look under /etc/systemd/system/ and purge.

8. Real-World Gotchas and Non-Obvious Tips

  • Network firewall:
    Outbound HTTPS (443) to download.docker.com is mandatory. Proxy or airgapped setups must sync DEB packages manually.
  • Rootless Docker alternative:
    If multi-tenancy or minimal privilege is essential, evaluate docker-ce-rootless-extras. Not covered here; switches runtime model, worth reading the docs.
  • Container runtime swapping:
    If you might move to CRI-O or containerd standalone, note Docker packages will bring and sometimes override versions of containerd. Plan CI pipelines accordingly.

Summary

Correct Docker installation on Ubuntu is less about cut-and-paste, more about anticipating future maintenance and avoiding legacy distribution pitfalls. Official repo, explicit keyring, rinse old versions—that’s the long-term stable baseline. Whether this sets the stage for Kubernetes, Nomad, or just clean local dev automation, don’t ignore the edge cases.

Any edge cases not mentioned? Something doesn’t quite work in your particular cloud image? That’s typical—diagnostics start with systemctl status, journalctl -xeu docker, and checking for conflicting binaries.


Questions about hardening Docker, custom Compose setups, or airgapped updates? I address operational outliers where docs don’t reach. Let’s get deployments actually stable.