How to Use docker exec
— Complete Guide to Running Commands Inside Containers
Introduction to docker exec
If you work with Docker, you’ll quickly discover the need to inspect, troubleshoot, or interact with containers while they are running. The docker exec
command is one of the most useful tools for this purpose. It lets you run commands directly inside a running container without stopping or restarting it. Whether you want to debug logs, install software, or access a shell session, docker exec
is your go-to command.
In this guide, we’ll cover everything you need to know about using docker exec
effectively, from basic usage to advanced options. By the end, you’ll be able to confidently manage your containers and streamline your workflow.
Why Use docker exec
?
There are several reasons developers and system administrators rely on docker exec
:
- Debug and Inspect: Quickly check logs, browse directories, or inspect files inside the container.
- Run Administrative Tasks: Update packages, install missing dependencies, or configure files without restarting services.
- Testing and Validation: Run quick commands to confirm if services are working as expected.
- Automation: Execute scripts and commands in live containers as part of automated pipelines or deployments.
Before You Start
To use docker exec
effectively, make sure of the following:
- Docker is installed and running on your system.
- Your user has proper permissions (either in the
docker
group or usingsudo
). - The container is running. This command will not work with stopped or paused containers.
Basic Syntax
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
The command requires the container name (or ID) and the command you want to execute. Options provide additional flexibility.
Most Useful Options
-d, --detach
: Run the command in the background.-i, --interactive
: Keep STDIN open even when not attached.-t, --tty
: Allocate a pseudo-TTY, useful for interactive terminals.-u, --user
: Specify the user or UID to run the command as.-w, --workdir
: Set the working directory inside the container.-e, --env
: Add environment variables to your command execution.
Step-by-Step Examples
1. Start a Container
docker run -d --name mywebserver nginx
This example starts an Nginx container named mywebserver
in detached mode. It will keep running in the background while you interact with it.
2. Check Running Containers
docker ps
The output lists all running containers, including their IDs, names, and ports. You’ll need the name or ID for docker exec
.
3. Run a Command (Non-Interactive)
docker exec mywebserver nginx -v
This checks the Nginx version inside the container without opening a shell session.
4. Open an Interactive Shell
docker exec -it mywebserver bash
This drops you into a Bash shell inside the container, allowing you to run multiple commands just as if you had logged into a remote server.
Advanced docker exec
Options
Run in the Background:
docker exec -d mycontainer touch /tmp/testfile
Change Working Directory:
docker exec -w /var/log mycontainer ls
Execute as Another User:
docker exec --user guest mycontainer whoami
Use Environment Variables:
docker exec -e APP_ENV=production mycontainer printenv APP_ENV
Best Practices
- Always make sure your container is running before using
docker exec
. - Use non-root users whenever possible for security best practices.
- Combine
-i
and-t
flags when starting an interactive shell. - Avoid making long-term changes with
docker exec
. Instead, update Dockerfiles and rebuild images for consistency.
Quick Reference Table
Task | Command Example |
---|---|
Run background command | docker exec -d mycontainer touch /tmp/test |
Open interactive shell | docker exec -it mycontainer bash |
Change working directory | docker exec -w /root mycontainer pwd |
Execute as another user | docker exec --user guest mycontainer whoami |
Set environment variable | docker exec -e VAR=value mycontainer env |
Conclusion
The docker exec
command is a must-know for anyone working with containers. It allows you to troubleshoot, inspect, and manage containers without downtime. From quick one-liners to interactive shell sessions, mastering docker exec
helps you save time and increase efficiency. Remember to follow best practices such as using non-root users, combining -it
for shells, and applying permanent changes through Dockerfiles instead of manual edits. With these tips, you’ll be able to handle Docker containers like a pro.