Command To Create Docker Container

Command To Create Docker Container

Reading time1 min
#Docker#Containers#DevOps#DockerRun#Containerization#CLI

Mastering docker run: Precision Container Creation via CLI

Deploying containers at scale demands efficiency and repeatability. In most production environments, GUIs rarely make the cut—fine-grained container lifecycle management relies on direct use of the docker run CLI.


Classic scenario: You're handed a Docker image, told, "Spin this up and map port 3000." You could fumble with GUI orchestrators, but it’s three words at the prompt—docker run -p 3000:8080 myimage—and you're done. The engineering reality is, mastering these options pays dividends in speed, traceability, and automation.


Core Mechanics: What Happens During docker run?

Fundamentally, docker run both creates and starts a new container from a specified image. If the image tag isn't found locally, Docker will attempt to pull it from the default registry (usually Docker Hub), introducing latency and potential surprise version mismatches. docker run provides direct access to options governing the process namespace, host networking, volume mounts, cgroup resources, and entrypoint overrides.

Syntax:

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

Common parameters include:

OptionPurposeExample
--nameAssign a human-friendly container name--name backend1
-dDetached/background mode-d
-pPort mapping: host:container-p 8080:80
-vVolume mount: host_path:container_path-v /data:/var/lib/mysql
-eSet environment variable(s)-e "ENV=production"
-itInteractive TTY attached-it
--rmRemove container when it exits--rm

Note: Order matters—arguments after the image override the default entrypoint.


Common Patterns and Practical Gotchas

Deterministic Naming with --name

By default, Docker assigns containers random names (e.g., flamboyant_wright). Name clashes will trigger:

docker: Error response from daemon: Conflict. The container name "/web" is already in use...

If scripting repeated runs, always include docker rm web or use --rm for disposable workloads.

Detached, Persistent Services: -d

Detached mode is essential for CI/deployment scripts. However, if your entrypoint process fails, the container will exit immediately. Check using:

docker ps -a
docker logs <container>

MISCONFIGURATION EXAMPLE:

docker run -d busybox
# Container exits instantly—no default command.

Mitigate by specifying a foreground command (e.g., tail -f /dev/null).

Port Mapping: -p

Mapping -p 8080:80 is not bi-directional NAT; it exposes the container's TCP/UDP port to the host network. Verify with ss -tlnp on the host. Known issue: binding 0.0.0.0 may expose to all interfaces.

Volume Mounting: -v

Data persistence requires careful bind-mount or named volume strategies. For MySQL:

docker run -d -v mysql_data:/var/lib/mysql mysql:8.0

Warning: Mounting local directories into containers with mismatched user IDs (UIDs) can cause permission errors:

[ERROR] --initialize specified but the data directory has files in it. Aborting.

Align ownership or use docker volume for consistent behavior across hosts.

Environment Variables and Secrets: -e

Passing secrets via -e exposes them in the host process list (ps aux | grep docker). For production, consider Docker secrets (Swarm) or use file mounts.


End-to-End: Real-World References

1. Local Development Shell
Temporarily test code in Python 3.11:

docker run --rm -it python:3.11 python

On exit, container is destroyed—nothing left behind.

2. Persisting Postgres Data

docker volume create pgdata
docker run -d --name db \
  -e POSTGRES_PASSWORD=strongpass \
  -v pgdata:/var/lib/postgresql/data \
  -p 5432:5432 \
  postgres:15.3

Data persists after container removal.
Gotcha: Always create named volumes; bind-mounts risk host permission/SELinux headaches.

3. Debugging Inside Busybox
Get an ephemeral shell, run diagnostics, and exit:

docker run --rm -it busybox sh

Optimization, Automation, and Clean-up

  • Chain flags for succinct scripts.
    Example:

    docker run -dit --name scratchbox --rm alpine:3.18 sh
    
  • Use shell aliases for repeated invocations.

    alias dsh='docker run --rm -it alpine:3.18 sh'
    
  • Prune stopped containers and unused images. (Careful: this is destructive.)

    docker system prune -af
    

    Reminder: Volumes are not removed by default; include --volumes for deep clean.

  • Leverage official images first. Images with the official marker on Docker Hub are maintained and scanned regularly. Avoids surprises with out-of-date or poorly secured third-party images.


Side Notes from Daily Ops

  • Containers started interactively (-it) are not ideal for production, but crucial for troubleshooting or exploring ephemeral state.
  • To override CMD in an image, append your custom command:
    docker run ... ubuntu:22.04 bash -c "echo hello"
  • docker run does not provide orchestration—scaling, rolling updates, or health checks beyond process exit status. For app lifecycle management, look to Docker Compose or Kubernetes Deployments.

Summary

Precision with docker run enables rapid prototyping, controlled deployments, and effective troubleshooting across development and production environments. While alternative container runtimes and orchestrators exist, day-to-day efficiency still leans heavily on understanding these core parameters—and their side effects.

For persistent workloads, always use named volumes. For one-offs, add --rm to keep your node tidy. For sensitive environments, avoid exposing secrets via -e.
And when in doubt, always check the logs:

docker logs <container>

It’s rarely perfect—there’s always a trade-off between flexibility and reproducibility.


Have a nuanced use case, or spotted a subtlety missing here? Engineers learn best from one another—reach out with edge cases.