In my last post I covered all of the basics of getting started with Docker. In this post, I'll dive more deeply into the most common uses for the Docker CLI. I'm assuming that you've already got a working local Docker install. If not, you can refer back to my previous post.
Running Containers
docker run
This is the most important, and likely the most commonly used Docker command. This is the command that is used to run container images. You can use it with images that you've built yourself, or you can use it to run images from a remote repository like DockerHub.
docker run IMAGE
This is the most basic way to use the run command. Docker will look for the named image locally first, and if it cannot find it, it will check to see if it's available from Docker Hub and download it. The image runs in the foreground and can be exited by pressing ctrl+c.
docker run IMAGE COMMAND [ARGS]
Most Docker images will define a specific command to be executed when the container is run, but you can specify a custom command to run instead by adding it to your docker run command after the image tag. Optionally, you can also append any arguments that should be passed to your custom command. Keep in mind that the container will only run as long as the command executed continues to run. If your custom command exits for any reason, so will the container.
docker run -it IMAGE
By default, you cannot provide any input to a running container via STDIN. In order to respond to prompts, you need to add the --interactive
option to run the image in interactive mode, and the --tty
option to connect your terminal's STDIN to the container's. You can combine both options using the shorthand option -it
.
docker run -p HOST_PORT:CONTAINER_PORT
Often when running a container, you will want to make a connection from your local host machine into your local docker container. This is only possible if you use the --port
or -p
option to specify a local host port to connect to the internal port exposed by the container.
docker run -d IMAGE
If you don't need to interact with your container and you'd rather not block your terminal shell, you can use --detach
or -d
to run your container in the background.
NOTE: All of these options can be combined as desired.
docker exec
You can use exec
to run arbitrary commands inside of a running container. I use this most often when troubleshooting problems in containers that I'm building. If your container has bash
or another shell available, you can use it to get an interactive shell inside of a container.
docker exec CONTAINER COMMAND [ARGS]
This is similar to docker run, but instead of giving it the name of a container image, you provide the ID or name of a running container. The command you specify will run inside the specified container in the foreground of your shell. You can use the -it
and -d
options with exec
just like you can with run
.
Managing Containers and Images
docker list
List all of your running containers with their metadata
docker list -a
List all containers including inactive ones
docker stop CONTAINER
Terminate the container specified by the given ID or name via SIGTERM
. This is the most graceful way to stop a container.
docker kill CONTAINER
Terminate the container specified by the given ID or name via SIGKILL
.
docker rm CONTAINER
Delete the container specified by the given ID. This will completely remove it and it will no longer appear in docker ps -a
docker stats
Starts a real-time display of stats like CPU and memory usage for your running containers. Press Ctrl + c to exit.
docker image list
List all the container images present in your local docker registry.
docker image remove IMAGE_NAME[:TAG]
Delete the given image from your local repository
docker image prune -a
Over time, you will accumulate a lot of images that take up disk space but are not in use. This command will bulk delete any image you have stored locally that isn't currently being used in a container (including stopped containers).
Building Images
Aside from run
, docker build
is the the other crucial docker command. This command builds a portable container image from your Dockerfile and stores it in your local Docker registry.
docker build PATH
This is the most basic usage for build
. PATH is a relative path for the folder your dockerfile is in. The image is stored within docker and tagged with a hash derived from the image's contents.
docker build -t REPOSITORY_NAME[:VERSION_TAG] PATH
The automatically generated hash image names aren't easy to remember or refer back to, so I usually add a custom tag at build time using the --tag
or -t
option. If you don't provide a version tag, it will default to latest
Publishing Images
docker tag
You may find that you need to re-tag an image after it's built. This is what docker tag
is for.
docker tag SOURCE_IMAGE[:VERSION_TAG] TARGET_IMAGE[:VERSION_TAG]
To use tag
you simply need to provide a source image repository name and version tag and repository name and version tag for the new tag. As always, the version tags are optional and default to latest
.
docker login
In order to pull images from private registries, you'll need to use docker login.
docker login [REGISTRY_HOST]
registry host defaults to hub.docker.com. You will be prompted for your username and password.
docker push
push
is used to publish docker images to a remote registry.
docker push REPOSITORY_NAME[:VERSION_TAG]
Publish the specified image to a registry. If your repository name does not include a registry host, it will be published to [Docker Hub][https://hub.docker.sh]. If you want to use a custom registry, you will need to use docker tag
to re-tag the image such that the repository name includes the registry host name (ex: docker tag my-image-repo my-registry.com/my-image-repo
). You will most likely need to use docker login
to login to your registry first.
Conclusion
Congratulations! You're on your way to being a Docker expert. However, it's worth noting that this list really only scratches the surface of the commands available in the Docker CLI. For more information check out the CLI docs or simply type docker --help
at your shell. You can also use --help
with most other docker CLI commands.