Command To Run Docker

Command To Run Docker

Reading time1 min
#Docker#DevOps#Containers#DockerRun#ContainerManagement#DockerCommands

Mastering the Essential docker run Command: Real-World Usage for Engineers

The docker run command is essential in container operations. Most treat it as a quick launcher, but this single command can sharply influence resource control, availability, and application consistency—especially in production deployments where ephemeral containers can undermine stability.

Not Just a Launcher: Deep Dive into docker run

A common sight:

docker run ubuntu

This will start an Ubuntu container—only to exit immediately, as no interactive shell or process is specified. Surprising, but predictable if you’ve sifted through enough logs:

docker: Error response from daemon: No command specified.

The real power emerges from the precision options available at runtime. Beyond starting containers, docker run provides toggles for networking, data, runtime constraints, and process control—parameters which, if omitted, often cause subtler failures days into production.


Routine Operations, Strategic Flags

Interactive Sessions & Troubleshooting

Opening an interactive shell is typical for debugging images or running ad-hoc commands:

docker run -it --rm debian:11 bash
  • -i (keep STDIN open)
  • -t (allocate a pseudo-TTY)
  • --rm (auto-remove container on exit; avoids clutter)

Notice versioned image (debian:11)—using latest can yield non-reproducible environments if upstreams move rapidly.


Assigning a Readable Name

Dynamic IDs are readable to Docker, less so to humans:

docker run --name data_job_runner busybox:1.35 sh -c "date"

Subsequent actions (docker logs data_job_runner, docker rm data_job_runner) become trivial.


Persistent Data: Mounting Host Volumes

Stateless containers disappear; stateful workloads (Postgres, Redis, CI caches) require volume mapping:

docker run -v /srv/postgres-data:/var/lib/postgresql/data -e POSTGRES_PASSWORD=s3cret postgres:15.2
  • Local directory /srv/postgres-data survives container restarts.
  • Note: SELinux/AppArmor or NFS permissions can trigger:
initdb: could not create directory "/var/lib/postgresql/data/global": Permission denied

Always verify host directory ownership. For production, configure distinct Docker volumes instead of raw host paths.


Environment Configuration

Runtime secrets, toggling feature flags, or pointing at different service endpoints—use -e:

docker run -e NODE_ENV=production -e API_URL=https://api-internal.cluster.local app:7.1.3

Multiple -e flags allowed. Prefer Docker secrets for sensitive values in real deployments.


Exposing and Mapping Ports

Services requiring inbound traffic must explicitly map ports:

docker run -p 5432:5432 --name local_pg postgres:15.2
  • Host port 5432 mapped to container port 5432.
  • Multiple, custom mappings possible (-p 8080:80 -p 8443:443).

Note: Binding -p 0.0.0.0:8080:80 exposes to all interfaces. Review firewall policies before use.


Automatic Restarts and Resilience

Mission-critical workloads recover automatically using restart policies:

PolicyDescription
noNever restart (default)
on-failureRestart on non-zero exit
alwaysRestart (including daemon restarts)
unless-stoppedLike always but not after manual stop
docker run --restart unless-stopped -d --name api_gateway api:2.1.0

Long-running services use unless-stopped as a baseline in distributed systems or CI runners.


Limiting CPU & Memory Resources

Multi-tenant hosts require defensive boundaries. Set hard limits:

docker run --cpus="2.5" --memory=1g worker:latest
  • --cpus can be fractional.
  • Memory in bytes, k, m, or g.
  • Exceeding limits triggers OOM kills; check logs for Killed exit statuses.

Gotcha: Some images (e.g., Java) require additional tuning (-XX:MaxRAMPercentage) for JVM memory detection within constrained cgroups.


Complex Workflow: Full Command Construction

Case: Persistent Redis with crash resilience, accessible on localhost

docker run -d \
  --name redis99 \
  -v /opt/redis-data:/data \
  --restart on-failure:3 \
  -p 127.0.0.1:6379:6379 \
  redis:7.0.12 \
  redis-server --appendonly yes --maxmemory 256mb --maxmemory-policy allkeys-lru
  • Specific tag ensures reproducibility.
  • Volume ensures data durability.
  • Bound to loopback interface only—reduces accidental exposure.
  • on-failure:3—will restart Redis at most three times after consecutive failures.
  • Server parameters adjust persistence strategy and memory policy.

Actual logs on OOM:

OOM command not allowed when used memory > 'maxmemory'.

Advanced: Entrypoint and Override Patterns

Not all images start as expected. Override their default entrypoint:

docker run --entrypoint "/bin/custom-start.sh" app:7.1.3 --init-flag

Useful for bootstrap logic or custom test harnesses. If you hit:

standard_init_linux.go:228: exec user process caused: no such file or directory

— check that scripts have Unix line endings and correct shebangs.


Practical Tips and Not-so-Obvious Realities

  • Volume mounting with named volumes (-v myvol:/data) is more portable for CI/CD and multi-host setups versus absolute host paths.
  • Avoid running stateful databases with :latest tags in production; minor image changes can introduce incompatible defaults.
  • --network host gives containers direct access to host stack—but disables port mapping and introduces security risks. Use with caution.
  • Overlay2 is preferred storage driver for production as of Docker 23.x; check with docker info.
  • Remove exited containers regularly; dead accumulations slow down Docker performance.

Final Take

docker run can launch a trivial Alpine container or define tightly sandboxed, production-grade services with predictable behavior. The sophistication is in the flags, not the image name. Disregarding these options often leads to post-mortem investigations days later.

Before deploying, ask: What will happen if this container crashes, outgrows its resources, or needs to persist logs across restarts? Design your docker run command for the failure modes you can anticipate—and the ones you can’t.


For more nuanced container orchestration (health checks, rolling updates), invest time learning docker-compose or Kubernetes—but for one-off processes or local dev, mastering docker run remains essential.

Keep the command reference close. The real test: when systems fail, can you recover with a single line?