Docker CLI Deep Dive
Tags: docker
Published: 2020-12-17 21:39:45

---
title: Docker CLI Deep Dive
published: true
date: 2020-12-17 20:19:38 UTC
tags: Docker
canonical_url: https://www.thisdot.co/blog/docker-cli-deep-dive
---

In [my last post](https://www.thisdot.co/blog/getting-started-with-docker) 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](https://hub.docker.com).

**`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](https://docs.docker.com/engine/reference/commandline/docker/) or simply type `docker --help` at your shell. You can also use `--help` with most other docker CLI commands.

_This Dot Labs is a modern web consultancy focused on helping companies realize their digital transformation efforts. For expert architectural guidance, training, or consulting in React, Angular, Vue, Web Components, GraphQL, Node, Bazel, or Polymer, visit [thisdotlabs.com](https://www.thisdotlabs.com)._

_This Dot Media is focused on creating an inclusive and educational web for all. We keep you up to date with advancements in the modern web through events, podcasts, and free content. To learn, visit [thisdot.co](https://www.thisdot.co)._