If you want to install Docker on Parrot Linux, you have two sensible routes: the docker.io package that ships in the Parrot repositories, or Docker’s own docker-ce packages from the upstream apt repository. Both work on Parrot 7.4, which is built on Debian 13, but they differ in how new the engine is, how updates arrive, and how much you have to maintain yourself. This guide walks through both methods, shows you how to run containers without sudo, explains the firewall side effects Docker introduces, and covers the most common errors you will hit on a fresh Parrot system.
Which Docker should you install on Parrot Linux?
Parrot OS is a Debian-based distribution, so anything that installs cleanly on Debian 13 (trixie) generally installs cleanly on Parrot. That gives you these options:
| Option | Package | Where it comes from | Best for |
|---|---|---|---|
| Distribution package | docker.io | Parrot / Debian repositories | Simplicity, updates through parrot-upgrade |
| Upstream Docker | docker-ce, docker-ce-cli, containerd.io | download.docker.com | Newest engine, Compose and Buildx plugins |
| Podman (alternative) | podman | Parrot / Debian repositories | Daemonless, rootless by default |
For a learning machine or a home lab, the distribution package is the easiest choice: one command, no extra repositories, and it stays in sync with the rest of the system. If you need the latest Docker Engine features or you follow upstream tutorials that assume docker compose (the plugin form), go with the upstream packages. Do not install both at the same time; they conflict.
Before you start
Update the system first so the package lists are fresh. Parrot has its own wrapper for this, and it is worth using it instead of a raw apt upgrade (see how to update and upgrade Parrot Linux safely):
sudo parrot-upgradeCheck that your kernel and CPU support what Docker needs. Any 64-bit Parrot 7.x install qualifies, but a quick look does not hurt:
uname -r
grep -c processor /proc/cpuinfo
cat /etc/os-releaseTake note of the VERSION_CODENAME line in /etc/os-release. On Parrot it shows the Parrot codename, not the Debian one, and that detail matters later when you add Docker’s repository.
Method 1: Install Docker from the Parrot repositories
This is the quickest way to get a working engine:
sudo apt update
sudo apt install docker.ioIf you also want Compose, check what your repository offers before installing. Debian 13 carries a Compose package, but the version and name can change between releases, so verify it on your own system:
apt-cache policy docker-compose docker-compose-v2 2>/dev/nullInstall whichever one is listed with a candidate version. Then enable and start the service:
sudo systemctl enable --now docker
systemctl status docker --no-pagerYou should see active (running). Skip ahead to the post-install section to run Docker without sudo.
Method 2: Install Docker CE from the upstream repository
Docker publishes apt packages per Debian codename. Because Parrot reports its own codename, you cannot use the usual $(lsb_release -cs) trick that most tutorials rely on; it would produce a repository path that does not exist. Instead, hard-code the Debian release that your Parrot version is built on. For Parrot 7.4 that is trixie (Debian 13).
Step 1: Remove conflicting packages
sudo apt remove docker.io docker-doc docker-compose podman-docker containerd runcIt is fine if apt reports that none of these are installed.
Step 2: Add Docker’s signing key
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.ascStep 3: Add the repository with the Debian codename
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian trixie stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt updateIf apt update ends without errors mentioning download.docker.com, the codename is right. If you see a 404 for the release file, you typed the wrong codename; double-check which Debian release your Parrot version tracks on the Parrot 7.4 release notes.
Step 4: Install the engine and plugins
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl enable --now dockerConfirm the version that landed:
docker --version
docker compose versionPost-install: run Docker without sudo
By default the Docker socket is owned by root and the docker group. Adding your user to that group lets you run containers without prefixing every command with sudo:
sudo usermod -aG docker $USER
newgrp dockerLog out and back in (or reboot) for the group change to apply to every shell. Then test:
docker run --rm hello-worldOne security note that matters on a distribution like Parrot: membership in the docker group is effectively root access, because a member can mount the host filesystem inside a container. On a shared machine, consider rootless Docker instead:
sudo apt install uidmap dbus-user-session
dockerd-rootless-setuptool.sh installThe setup script prints the environment variables you need to add to your shell profile. Rootless mode has limitations (no privileged ports below 1024 without extra configuration, some network drivers unavailable), but it keeps the daemon out of root.
Docker and the Parrot firewall
When the daemon starts it inserts its own chains into the packet filter to handle NAT for container networks and published ports. Two consequences surprise people:
- A port you publish with
-p 8080:80is reachable from your LAN even ifufwis set to deny incoming connections, because Docker’s rules are evaluated before the ufw chains. - If you flush your rules manually (for example with
nft flush ruleset), containers lose outbound connectivity until you restart thedockerservice.
If you only want containers to listen locally, bind them to the loopback address: -p 127.0.0.1:8080:80. For the bigger picture of how nftables and ufw are arranged on this distribution, read the Parrot Linux firewall setup guide before exposing anything.
Running the official Parrot container images
Once Docker is running, a popular first experiment is to launch Parrot itself inside a container, which is handy for keeping tools isolated from your desktop. The project publishes images on Docker Hub, and the site already has a page listing the Docker images for Parrot OS together with a walkthrough on general Docker usage. Copy the exact image name from that page and start a minimal interactive session like this:
docker pull IMAGE_NAME
docker run --rm -it IMAGE_NAME bashInside the container, apt works exactly as it does on the host, so you can install individual tools without touching your main system.
Useful commands for your first week
# See what is running and what is stopped
docker ps -a
# Remove stopped containers, dangling images and unused networks
docker system prune
# Check how much disk Docker is using
docker system df
# Follow logs of a container
docker logs -f CONTAINER_NAME
# Start a Compose project in the background
docker compose up -dDocker stores images and container layers under /var/lib/docker. If your root partition is small, that directory fills up fast; docker system df tells you when to prune.
Troubleshooting Docker on Parrot Linux
“permission denied while trying to connect to the Docker daemon socket”
Your user is not yet in the docker group in the current session. Run groups to confirm. If docker is missing, log out and back in after the usermod command above.
“Cannot connect to the Docker daemon at unix:///var/run/docker.sock”
The service is not running. Start it with sudo systemctl start docker and read the reason for the failure with journalctl -u docker -b --no-pager | tail -n 30.
apt reports “The repository … does not have a Release file”
This is the codename problem described above. Edit /etc/apt/sources.list.d/docker.list so the line uses the Debian codename (trixie for Parrot 7.4), then run sudo apt update again.
Containers have no internet access
Most often a firewall rule set was flushed or AnonSurf changed routing while the daemon was running. Restart the service with sudo systemctl restart docker. If you use AnonSurf, stop it before working with containers that need outbound access, or route only the host through it.
Package conflicts between docker.io and docker-ce
Remove one set completely before installing the other. sudo apt purge docker.io or sudo apt purge docker-ce docker-ce-cli containerd.io and then reinstall your preferred option. Your images in /var/lib/docker survive the switch.
Keeping Docker updated
With the distribution package, Docker updates together with the rest of Parrot when you run parrot-upgrade. With the upstream repository, the same command pulls new docker-ce releases because the source is simply another apt entry; see the Parrot software management page for how the repositories fit together. After a Docker engine upgrade, running containers are stopped and restarted unless you have enabled live restore in /etc/docker/daemon.json:
{
"live-restore": true
}Apply it with sudo systemctl restart docker. The official documentation at docs.docker.com lists the current package names if they change in a future release.
FAQ
Is Docker preinstalled on Parrot Linux?
No edition ships with the Docker engine installed by default. You install it yourself with one of the two methods above. The Parrot project does, however, publish Parrot container images that you can run on any Docker host.
Should I use Docker or Podman on Parrot?
If you follow Docker tutorials, use Docker. If you prefer a daemonless tool that runs rootless out of the box and you are comfortable translating docker commands (the CLI is nearly identical), sudo apt install podman gets you there with no extra repositories.
Does Docker work in Parrot inside VirtualBox or VMware?
Yes. Docker uses kernel namespaces and cgroups, not hardware virtualization, so it runs fine inside a Parrot virtual machine. Give the VM at least 2 CPU cores and 4 GB of RAM if you plan to run several containers at once.