Docker 5 🐳 Installing Docker Engine on Linux, macOS, and Windows (WSL2 Architecture)
Docker Engine does not install the same way on every operating system, and the differences are not cosmetic. On Linux, Docker Engine runs natively as a daemon that talks directly to the kernel’s namespaces and cgroups. On macOS, Docker Engine cannot run natively because macOS is not Linux — it has no namespaces and no cgroups. On Windows, the situation is more nuanced: Docker Desktop can run Linux containers through a Linux virtual machine or through the Windows Subsystem for Linux 2, and it can run Windows containers natively through the Hyper-V backend.
These platform differences determine what you install, how you configure it, and what performance characteristics to expect. Choosing the right installation method for your platform is the first practical decision in any Docker workflow, and misunderstanding the architecture beneath the installer leads to confusion later when containers behave differently than expected.
This chapter covers the installation process on all three major platforms: Docker Engine from Docker’s official apt repository on Ubuntu and Debian, Docker Desktop on macOS, and Docker Desktop on Windows with both the WSL2 and Hyper-V backends. We will examine the WSL2 architecture in detail because it is the default and recommended approach on Windows, and it is the most architecturally interesting of the three.
Key point: Linux runs Docker Engine natively; macOS runs it inside a lightweight virtual machine because macOS lacks the kernel features containers require; Windows runs Linux containers through WSL2 or Hyper-V and Windows containers through Hyper-V only.
Why installation differs across platforms
The kernel dependency problem. Containers depend on Linux kernel features — namespaces for isolation and cgroups for resource control. Docker Engine is not a virtual machine monitor; it is a process manager that uses these kernel interfaces. On macOS, there is no Linux kernel, so Docker Desktop must run a Linux VM under the hood to provide those interfaces. On Windows, the same limitation applies to Linux containers, though Windows has its own container technology that uses different kernel primitives.
The package management problem. Linux distributions have mature package management systems, so Docker Engine is distributed through apt, yum, and dnf repositories. macOS has no system-wide package manager that ships with the OS, so Docker Desktop is distributed as a .dmg or .pkg installer. Windows uses .exe installers and MSI packages. Each platform’s distribution mechanism shapes the installation experience.
The backend choice problem. On Windows, Docker Desktop supports two backends for Linux containers: WSL2 and Hyper-V. WSL2 is the default and recommended option because it uses a lightweight, dynamically allocated Linux kernel that starts in under ten seconds and only consumes the CPU and memory it needs . Hyper-V creates a full virtual machine with fixed resource allocation. The backend choice affects performance, resource usage, and which Windows editions are supported.
The user permission problem. On Linux, Docker commands require sudo by default because the daemon socket is owned by root. The recommended fix is adding your user to the docker group, which grants access to the socket without sudo . On Docker Desktop for macOS and Windows, the installation handles permissions automatically because the daemon runs inside a managed VM, not directly on the host.
a. Installing Docker Engine on Ubuntu and Debian
Docker Engine on Linux is installed from Docker’s official apt repository, not from the distribution’s default repositories. The distro-shipped packages (docker.io, docker-compose, etc.) lag behind Docker’s releases and can conflict with the official packages. The first step is always removing any existing Docker packages:
sudo apt remove docker.io docker-compose docker-doc podman-docker containerd runc
Docker Engine bundles containerd and runc as a single dependency called containerd.io. If these are installed separately, they must be removed before installing the official packages .
The installation begins by adding Docker’s GPG key and repository to apt:
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
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
The repository URL depends on the distribution. 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
For Debian, replace ubuntu with debian in the URL . After updating the package index, install the Docker packages:
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
This installs the Docker Engine, the CLI, containerd, the Buildx plugin, and the Compose plugin. Omitting docker-buildx-plugin and docker-compose-plugin is a common mistake that leaves docker compose and docker buildx unavailable .
After installation, verify that the daemon is running and test with a container:
sudo systemctl status docker
sudo docker run hello-world
If sudo is required for every Docker command, add your user to the docker group :
sudo usermod -aG docker $USER
newgrp docker
b. Installing Docker Desktop on macOS
Docker Desktop for macOS is distributed as a .dmg installer from Docker’s website. The system requirements are a supported version of macOS (current and two previous major releases) and at least 4 GB of RAM . Rosetta 2 is recommended for some optional command-line tools when using the AMD64 architecture on Apple Silicon .
The installation is straightforward: download Docker.dmg, open it, and drag the Docker icon to the Applications folder. When you first launch Docker Desktop, it presents the Docker Subscription Service Agreement. Docker Desktop is free for personal use, education, non-commercial open source projects, and small businesses (fewer than 250 employees and less than $10 million in annual revenue). Larger commercial use requires a paid subscription .
For command-line installation, the .dmg can be mounted and the installer executed directly:
sudo hdiutil attach Docker.dmg
sudo /Volumes/Docker/Docker.app/Contents/MacOS/install
sudo hdiutil detach /Volumes/Docker
The installer accepts flags for automation, including --accept-license, --user=<username> to perform privileged configuration during installation, and --allowed-org=<org name> to require Docker Hub organization membership .
Under the hood, Docker Desktop on macOS runs a lightweight Linux VM. The GUI hides the VM entirely; you interact with docker commands as if the daemon were native. The VM is managed by Docker Desktop and is not accessible for general development. This architecture is why macOS containers cannot use the host kernel’s namespaces and cgroups directly — they are inside the VM’s Linux kernel.
c. Installing Docker Desktop on Windows with WSL2
Windows Subsystem for Linux 2 is a full Linux kernel built by Microsoft that runs without managing traditional virtual machines . Docker Desktop uses WSL2 as its default backend for Linux containers because it provides better performance, dynamic resource allocation, and faster cold-start times than the Hyper-V backend .
Before installing Docker Desktop, verify that WSL is installed and meets the minimum version requirement (2.1.5 or later). Run:
wsl --version
If version details do not appear, WSL must be installed or updated:
wsl --install
wsl --update
After WSL is ready, download and run the Docker Desktop Installer executable. The installer supports per-user installation without administrator privileges using the --user flag, which is the recommended mode for most users :
Start-Process 'Docker Desktop Installer.exe' -Wait -ArgumentList 'install', '--user'
The --backend flag selects the default backend; wsl-2 is the default . During installation, Docker Desktop may prompt to enable WSL 2 integration. Once installed, docker commands are available from any Windows terminal and from any WSL distribution with integration enabled.
WSL2 uses dynamic memory allocation, so Docker Desktop requests only the CPU and memory it actually needs. This frees resources for the rest of the system while still allowing memory-intensive tasks like multi-stage image builds to run at full speed . The Docker daemon starts in under ten seconds on a cold start, compared to almost a minute with the previous Hyper-V-based approach .
Docker Desktop creates a docker-desktop WSL distribution that runs the Docker engine. Earlier versions also created a docker-desktop-data distribution for storing images and containers, but Docker Desktop 4.30 and later are moving toward a simplified single-distribution model . Neither distribution is intended for general development.
For the best file system performance when bind-mounting files into Linux containers, store your source code in the Linux filesystem rather than the Windows filesystem. Files stored under /mnt/c (the Windows mount point) are remote-mounted and perform significantly worse than files stored in the native Linux filesystem . Linux containers only receive file change events (inotify) for files stored in the Linux filesystem, which matters for workflows that rely on automatic reloading when files change.
d. Windows containers and the Hyper-V backend
Docker Desktop on Windows can also run Windows containers natively through the Hyper-V backend. This requires Windows 10 or 11 Professional or Enterprise Edition; Windows Home and Education editions can only run Linux containers . The Hyper-V backend uses a full virtual machine with pre-allocated resources, unlike WSL2’s dynamic allocation.
The --backend installer flag selects the default backend. wsl-2 is recommended for Linux container development. hyper-v is required for Windows containers. The --no-windows-containers flag disables the Windows containers integration entirely, which can improve security for environments that only need Linux containers .
For all-users installation on Windows, the installing administrator may need to add user accounts to the docker-users group to grant access to features that require higher privileges, such as managing the Hyper-V VM or using Windows containers . Membership in docker-users grants access to the Docker daemon socket, which is equivalent to administrative privileges on the host. Only add users who require it. For Linux containers using the WSL2 backend, this group membership is not required.
Complete Example Session
# ============================================
# PART 1: REMOVE OLD DOCKER PACKAGES (LINUX)
# ============================================
# Conflicting packages must be removed before
# installing from Docker's official repository.
sudo apt remove docker.io docker-compose docker-compose-v2 docker-doc docker-buildx podman-docker containerd runc
# ============================================
# PART 2: ADD DOCKER'S GPG KEY AND REPOSITORY
# ============================================
# Ubuntu example. For Debian, change the URL.
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
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
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
# ============================================
# PART 3: INSTALL DOCKER ENGINE (LINUX)
# ============================================
# Installs engine, CLI, containerd, Buildx, and Compose.
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# ============================================
# PART 4: VERIFY DOCKER ENGINE (LINUX)
# ============================================
# Check daemon status and run hello-world.
sudo systemctl status docker
sudo docker run hello-world
# ============================================
# PART 5: POST-INSTALL PERMISSIONS (LINUX)
# ============================================
# Add user to docker group to avoid sudo.
sudo usermod -aG docker $USER
newgrp docker
docker run hello-world
# ============================================
# PART 6: INSTALL DOCKER DESKTOP (MACOS)
# ============================================
# Interactive: download Docker.dmg and drag to Applications.
# Command-line:
sudo hdiutil attach Docker.dmg
sudo /Volumes/Docker/Docker.app/Contents/MacOS/install
sudo hdiutil detach /Volumes/Docker
# ============================================
# PART 7: INSTALL WSL2 (WINDOWS)
# ============================================
# Verify WSL version and update if needed.
wsl --version
wsl --install
wsl --update
# ============================================
# PART 8: INSTALL DOCKER DESKTOP (WINDOWS)
# ============================================
# Per-user installation without admin privileges.
Start-Process 'Docker Desktop Installer.exe' -Wait -ArgumentList 'install', '--user'
# ============================================
# PART 9: VERIFY WSL2 INTEGRATION (WINDOWS)
# ============================================
# From a WSL distribution with integration enabled:
docker --version
docker run hello-world
# ============================================
# PART 10: CHECK BACKEND AND RESOURCES
# ============================================
# Inspect the active backend and resource allocation.
docker info | grep -i backend
docker info | grep -i memory
These ten parts cover the full installation lifecycle on all three platforms: removing conflicts, adding repositories, installing packages, verifying the installation, configuring permissions, and confirming that the backend is working. The Windows section emphasizes WSL2 because it is the default and recommended backend for Linux container development .
Quick Reference
Platform Installation Methods
| Platform | Method | Package/Installer |
|---|---|---|
| Ubuntu/Debian | apt repository | docker-ce, docker-ce-cli, containerd.io |
| RHEL/Fedora | dnf repository | docker-ce, docker-ce-cli, containerd.io |
| macOS | Docker Desktop .dmg | Docker.dmg from docker.com |
| Windows (Linux containers) | Docker Desktop with WSL2 | Docker Desktop Installer.exe |
| Windows (Windows containers) | Docker Desktop with Hyper-V | Same installer, --backend=hyper-v |
Linux Package Names
| Package | Purpose |
|---|---|
docker-ce | Docker Engine daemon |
docker-ce-cli | Docker CLI client |
containerd.io | Container runtime (containerd + runc) |
docker-buildx-plugin | Extended build capabilities |
docker-compose-plugin | Compose v2 integration |
WSL2 Requirements
| Requirement | Minimum |
|---|---|
| WSL version | 2.1.5 (latest recommended) |
| Windows version | Windows 10 22H2 (build 19045) or Windows 11 22H2 |
| RAM | 4 GB |
| Virtualization | Enabled in BIOS/UEFI |
Best Practices
✅ Do This:
sudo apt remove docker.io docker-compose containerd runc # Remove conflicts first
sudo usermod -aG docker $USER # Add user to docker group
wsl --update # Keep WSL current
# Store source code in Linux filesystem for bind mounts
docker run -v ~/project:/src myimage # Linux path, not /mnt/c
❌ Don’t Do This:
sudo apt install docker.io # ❌ Distro package, outdated
sudo docker run hello-world # ❌ Permanent sudo; add user to group
wsl --install # ❌ Without updating first
docker run -v /mnt/c/Users/me/project:/src myimage # ❌ Poor performance
sudo apt install docker-ce docker-ce-cli # ❌ Missing containerd and plugins
Common Pitfalls
| Pitfall | Why It Happens | Fix |
|---|---|---|
docker: command not found | PATH not updated after install | Restart terminal or newgrp docker |
| Permission denied on socket | User not in docker group | sudo usermod -aG docker $USER |
| WSL version too old | Inbox WSL not updated | Run wsl --update |
| Docker Desktop won’t start on Windows | Virtualization disabled in BIOS | Enable SLAT and virtualization |
| Slow file access in WSL2 | Files stored on Windows filesystem | Move project to Linux filesystem |
docker compose not found | Compose plugin not installed | Install docker-compose-plugin |
| macOS containers crash | Rosetta 2 not installed (Apple Silicon) | softwareupdate --install-rosetta |
Real-World Examples
1. Ubuntu Server Installation
sudo apt update && sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list
sudo apt update && sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
2. Debian VPS Installation
sudo apt install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list
sudo apt update && sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
3. macOS Command-Line Install
sudo hdiutil attach Docker.dmg
sudo /Volumes/Docker/Docker.app/Contents/MacOS/install --accept-license
sudo hdiutil detach /Volumes/Docker
4. Windows Per-User Install
Start-Process 'Docker Desktop Installer.exe' -Wait -ArgumentList 'install', '--user', '--accept-license'
5. WSL2 Update and Install
wsl --update
wsl --install
wsl --version
6. Enable WSL Integration for a Distribution
# In Docker Desktop: Settings → Resources → WSL Integration
# Toggle on for the desired distribution
docker context use default
7. Verify Installation
docker version
docker info
docker run hello-world
8. Check Available Disk Space
docker system df
9. Remove Docker Engine Completely
sudo apt purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
10. Check Backend on Windows
docker info | findstr /i backend
Visual
Platform Architecture Comparison
┌──────────────────────────────────────────────────────────────┐
│ HOW DOCKER RUNS ON EACH PLATFORM │
│ │
│ LINUX: │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ docker CLI │ │
│ │ dockerd (native process) │ │
│ │ containerd │ │
│ │ runc │ │
│ │ Linux Kernel (namespaces + cgroups) │ │
│ └────────────────────────────────────────────────────────┘ │
│ No VM. Direct kernel access. │
│ │
│ macOS: │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ docker CLI (macOS) │ │
│ │ Docker Desktop GUI │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ Linux VM (managed by Docker Desktop) │ │ │
│ │ │ dockerd → containerd → runc │ │ │
│ │ │ Linux Kernel │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ └────────────────────────────────────────────────────────┘ │
│ macOS has no Linux kernel. Docker Desktop runs one. │
│ │
│ WINDOWS (WSL2 backend): │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ docker CLI (Windows) │ │
│ │ Docker Desktop GUI │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ WSL2 utility VM │ │ │
│ │ │ Linux Kernel (Microsoft-built) │ │ │
│ │ │ docker-desktop WSL distribution │ │ │
│ │ │ dockerd → containerd → runc │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ └────────────────────────────────────────────────────────┘ │
│ WSL2 provides a shared Linux kernel with dynamic │
│ memory allocation. No full VM management. │
└──────────────────────────────────────────────────────────────┘
WSL2 Architecture Detail
┌──────────────────────────────────────────────────────────────┐
│ WSL2: LINUX KERNEL + DOCKER DESKTOP │
│ │
│ WINDOWS HOST │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ Docker Desktop GUI │ │
│ │ docker CLI (from Windows terminal) │ │
│ └────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ WSL2 UTILITY VM │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ Linux Kernel (shared, Microsoft-built) │ │ │
│ │ ├──────────────────────────────────────────────────┤ │ │
│ │ │ docker-desktop distribution │ │ │
│ │ │ ┌────────────────────────────────────────────┐ │ │ │
│ │ │ │ dockerd │ │ │ │
│ │ │ │ containerd │ │ │ │
│ │ │ │ runc │ │ │ │
│ │ │ └────────────────────────────────────────────┘ │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ └────────────────────────────────────────────────────────┘ │
│ │
│ Dynamic memory: WSL2 grows and shrinks as needed. │
│ Cold start: < 10 seconds. │
│ Bind mounts: Linux filesystem performs better than Windows. │
└──────────────────────────────────────────────────────────────┘
Linux Installation Flow
┌──────────────────────────────────────────────────────────────┐
│ LINUX INSTALLATION SEQUENCE │
│ │
│ 1. Remove old packages │
│ docker.io, docker-compose, containerd, runc │
│ │
│ 2. Add Docker GPG key │
│ /etc/apt/keyrings/docker.asc │
│ │
│ 3. Add Docker apt repository │
│ /etc/apt/sources.list.d/docker.list │
│ │
│ 4. Install packages │
│ docker-ce, docker-ce-cli, containerd.io, │
│ docker-buildx-plugin, docker-compose-plugin │
│ │
│ 5. Start and enable daemon │
│ systemctl enable --now docker │
│ │
│ 6. Verify │
│ docker run hello-world │
│ │
│ 7. Add user to docker group (optional) │
│ usermod -aG docker $USER │
│ │
└──────────────────────────────────────────────────────────────┘
Windows Backend Comparison
┌──────────────────────────────────────────────────────────────┐
│ WSL2 vs HYPER-V BACKEND ON WINDOWS │
│ │
│ WSL2 (default, recommended for Linux containers): │
│ ├── Dynamic memory allocation │
│ ├── Startup: < 10 seconds │
│ ├── Works on Windows Home │
│ ├── Better file system performance with Linux paths │
│ └── Linux containers only │
│ │
│ HYPER-V (required for Windows containers): │
│ ├── Fixed resource allocation │
│ ├── Startup: ~1 minute │
│ ├── Requires Windows Pro/Enterprise │
│ ├── Supports Windows containers │
│ └── Full VM isolation │
│ │
│ Docker Desktop supports both simultaneously. │
│ Switch backends in Settings → General. │
│ │
│ For Linux container development on Windows: │
│ Use WSL2. It is faster, lighter, and works everywhere. │
└──────────────────────────────────────────────────────────────┘
Summary
| Item | Value |
|---|---|
| Linux install method | Docker’s apt/dnf repository |
| Linux packages | docker-ce, docker-ce-cli, containerd.io, plugins |
| Linux post-install | Add user to docker group |
| macOS install method | Docker Desktop .dmg |
| macOS architecture | Docker Desktop runs a lightweight Linux VM |
| Windows Linux containers | Docker Desktop with WSL2 backend |
| Windows Windows containers | Docker Desktop with Hyper-V backend |
| WSL2 minimum version | 2.1.5 or later |
| WSL2 startup time | Under 10 seconds |
| WSL2 memory | Dynamic allocation |
| Windows Home limitation | Linux containers only |
| Windows Pro requirement | Required for Windows containers |
Key takeaways:
- Linux runs Docker Engine natively. The daemon talks directly to the kernel’s namespaces and cgroups. Installation is from Docker’s official repository, not the distro’s packages.
- macOS runs Docker Engine inside a Linux VM. Docker Desktop manages the VM transparently. The
dockerCLI works from macOS, but the daemon runs in a Linux environment. - WSL2 is the default Windows backend. It provides a shared Linux kernel with dynamic memory allocation, fast startup, and better performance than the Hyper-V backend for Linux containers.
- Windows containers require Hyper-V and Windows Pro. Windows Home and Education editions cannot run Windows containers; they can only run Linux containers through WSL2.
- Remove conflicting packages before installing. The distro-shipped
docker.ioand related packages conflict with Docker’s official packages . - Add users to the
dockergroup on Linux. Without this, every Docker command requiressudo. Membership in the group grants access to the Docker daemon socket, which is equivalent to root privileges — add only trusted users. - Store bind-mounted source code in the Linux filesystem on WSL2. Files stored on the Windows filesystem (
/mnt/c) perform significantly worse and do not generateinotifyevents .
Remember: Docker installation is platform-specific because containers depend on Linux kernel features that macOS and Windows do not have natively. Linux gets Docker Engine directly. macOS gets Docker Desktop, which wraps a Linux VM. Windows gets Docker Desktop with WSL2 as the default backend for Linux containers and Hyper-V for Windows containers. The WSL2 architecture is notable because it provides a real Linux kernel without the overhead of a full virtual machine, using dynamic memory allocation and starting in under ten seconds. Understanding which architecture you are running explains why containers behave the way they do, why file system performance varies between paths, and why some Windows editions can run Windows containers while others cannot.
Stop using slow, ad-bloated tool sites! 🤮
🔎 Search “KandZ Tools” on Google to use many professional utilities for free.
KandZ.me is the ultimate minimalist hub for:
✅ Finance (Mortgage, Interest, Inflation)
✅ Tech (Base64, JSON, Dev Suite, IP)
✅ Health (BMI, BMR, TDEE)
✅ Productivity (Timer, Workspace, QR)
⚡️ Fast & Private
🔒 No data leaves your device
💎 100% Free
🔗 Use it now: https://tools.kandz.me
🔖 Bookmark it—you’ll need it later!