Basic Docker Commands for Beginners.
Tags: docker, devops, beginners, cloudnative
Published: 2022-07-11 16:18:18

The first part of this article introduces you to Docker, monolithic and microservice architecture, virtual environment, and containers. 

With this general knowledge of Docker and containers, it's time to jump right into running applications in containers. 

If you're just getting started with Docker, you'll learn some practical Docker commands in this post that will let you pull and run a Docker image locally, start and stop a container, list all currently running containers, and debug containers.

This blog post also provides some background information that will clarify the precise difference between a container and a Docker image.


To get the most out of this post, ensure to practice each step to get a feel for working with applications in Docker.

##**Prerequisites**

1. **Install Docker**
Before you begin you should have Docker installed and running. If you haven’t, please see Docker’s official documentation on how to install Docker and make sure to install the stable version. Docker can be installed on [Linux](https://docs.docker.com/desktop/linux/install/), [Windows](https://docs.docker.com/desktop/windows/install/), and [macOS](https://docs.docker.com/desktop/mac/install/).

2. **Terminal**
Launch your preferred terminal, which could be Terminal on Mac, a Bash shell on Linux, or PowerShell on Windows.

3. **Create a DockerHub Account**
DockerHub is a public registry where applications are published.  DockerHub is like GitHub but for Docker images.
 
4. **Internet connection**
You'll need an internet connection for some commands to execute.
 
#**The Difference Between  Docker image and Container** 

**Docker image** is simply a file that represents a container. For example, when you package an application with all its dependencies and push it to DockerHub or your private registry, the file in the registry is an image that represents your container.

**A container** can be viewed as a "box". In this box is an application that is packaged with its dependencies needed to run the application. 

This application has its distinct virtual environment- the hostname, disk, and IP address, which is managed by Docker. The application inside the box cannot have any interaction with the outside environment.  

The box is called the container because it contains the application with its dependencies. Containers share the host operating system (OS), CPU, and memory. 

A container is an instance of a Docker image and a running environment of an image.

To understand exactly the difference between container and image let's practice some commands.

This tutorial uses redis for illustration. You could choose to use a different image or container and it'll still work the same.

##**docker pull** 
Usage: docker pull IMAGE NAME

docker pull is used to download or pull an image from the repository to your local machine. To access an image locally you must pull it first.

let's pull a redis image from DockerHub to our local machine.

Search for Redis in the search bar and click on the image. 
![What is docker DockerHub](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/735ezthbih7asiteea09.png)

In your terminal, run the following command: `docker pull redis`

![What is docker pull](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1jv9ja8aqscsdhi7c6ni.png)
The image is pulled, downloaded, and extracted by Docker when you run the command.

The application package consists of six layers coupled together to run the application.

**Note:** The latest tag is automatically pulled when you pull an image without specifying a tag. A tag is the same as a version.

##**docker images**
To ensure that the image has been downloaded, run the following command in your terminal `docker images`. This will list all existing images. 

![what is a docker image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ayvpml0hcdouub03xrjc.png)

In the above, there's just one image with the REPOSITORY-redis, TAG-latest, image ID, when it was CREATED, and SIZE of the application.

**Note:** You could specify a version or tag if you don't want Docker to download the default tag.

##**Tag**
You could specify the image tag by running the command `docker pull redis:10.1.`
**10.1** is the version specified. Remember the version is always followed after a semicolon.

Now, you need to get redis running to make it reachable by your application.


##**docker run** 
Usage: docker run IMAGE NAME

The run command is used to create a container of an image. The first time you use the run command, Docker informs you that the image doesn't exist locally so it'll search for it on DockerHub, pulls and starts the image.

If the image already exists locally, docker goes ahead to run a container of the image.

But if the image doesn't exist in DockerHub or your local machine, you'll get no error message from Docker.

At the point at which the image is running, the image is no more regarded as an image but as a container. 

To run the just downloaded image, use `docker run redis`. It'll run a container called redis.

![how to use docker run](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nr81c044ft0cs26fjsra.png)

In the above image, the docker run command starts the redis image in a container.

##**docker run -d**
Usage:  docker run [OPTIONS]  IMAGE NAME

![how to use docker run -d](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zjxwor1doe2jik6mfe26.png)

The `-d` is one of several docker run options. It is used to run a container in a detached mood.

##**docker ps**

The `docker ps` command lists all running containers. This command allows you to track your container’s progress. If you ever get an empty list from running the command, ensure that your container is running.

![what is docker ps](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ger7ragwtyal2saxzov1.png)

**Note:** You could use a separate terminal window to run the container and another for the docker ps command. 

##**docker ps -a**
Usage: docker ps [OPTIONS]

Several options could be used with the docker ps command such as `-a`, `-f`, `-s`, etc. For instance, the `-a` option lists all the exited and running containers. This allows you to track the status of a container. Run the command `docker ps -a` to view all your containers.

![docker ps -a explained](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nn7aook7xd2xnxwaiss7.png)

This image shows all containers in their current status.

##**docker stop**
Usage: docker stop CONTAINER ID

Containers can be terminated by using the stop command. There are several reasons why you may want to stop a container. 

An error or a crash might require you to stop a container. You'll need the ID of the container that you want to stop.
In your terminal run `docker stop "Container ID"` 

![docker stop command](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2v0nyu7qgfv1qojct2zk.png)

#**docker start**
Usage: docker start CONTAINER ID

Using this command, you can restart a stopped container. You can do this by running the docker start "container ID" command.

![docker start command](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ozicb2ku48j2v51yqlcx.png)
The container specified will be started with this command.


##**Working With Containers**

The next part of this blog post will walk you through the steps and basic commands of working with a running container. For your application to connect to the container, the container must be reachable. 

To connect the container to your application, you'll need to bind the host port to the container’s port. The diagram below illustrates how host binding works.

![how to bind the host and container ports in docker](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2r8hqakoeff97tia6kp1.png)

A host port is a port on your computer that your container binds to. Whereas, a container's port is a port on which the container runs and is used to access the services or dependencies inside the container.

For instance, the port of the container below is **6379/tcp**

![what is a container port in docker](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ygwes8x8udlb9xr9hlu4.png)
You must first specify the host port before binding the port of the container to it

Execute the following command in your terminal: `docker run -p8080:6379 redis`

![how to bind a host port to redid container port in docker](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5qj8lx4rbumk5bsf8b13.png)
The `-p` flag in the command means port.

**Note:** Before executing the command, make sure the container has been stopped.

To check that the host and the container's port have been connected, let's run the `docker ps` command.

![docker ps command explained](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j0x94rzn6xd2kc01cu47.png)
In the image above the host’s port **0.0.0.0:8080** has been connected to the container’s port **6379/tcp**.


##**docker logs**
Usage: docker logs [OPTIONS] CONTAINER ID

You can look through a container's logs using this command. It is utilized to debug or troubleshoot containers.

![how to use docker logs command](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uyhfewn0veizvfpm8cr8.png)

> **Note:** This command is only functional for containers that are started with the json-file or journald logging driver. -- Docker

##**docker exec**
Usage: docker exec [OPTIONS]  CONTAINER ID /bin/bash

This command is used to access a container's terminal. In the container's terminal, you could navigate directories and issue commands just like on your command line.

Run `docker exec -it "container ID" /bin/bash`, for instance, to access the redis container terminal.

![docker exec command](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1xqupfeq61leoh0tdlns.png)

The `-it` flag means interactive and indicates that you would like to assess the terminal inside the container.

In the first line, we executed the command and got access to the root directory. In the second line, the `pwd` command lists our working directory. We navigate to the directory in line 3 and use the `ls` command in line 4 to list all the directories inside the root directory -- `/data`.

##**docker rm**
Usage: docker rm [OPTIONS] CONTAINER ID

If you want to clean up or remove containers or application packages  after following the exercises, you can run this command: `docker rm -f CONTAINER ID`

![docker rm or remove command](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ycql57rp2nlc8q1lfs5n.png)

##**Summary**

In this blog post, you’ve practiced working with basic Docker commands such as pull, run – which pulls and launches an image, stop, start, logs, exec, rm, etc. You learned how to bind a host and container ports as well as the difference between container and Docker image.

In addition to the Docker commands that were covered in this article, there are many others that you might want to look into. If you'd like to learn more about the Docker command line, please use the link in the resource section.

 
##**Resources:**

[Introducing Docker Concepts, Containers and More.](https://dev.to/roselinebassey/introducing-docker-concepts-containers-and-more-17hc)

[How to Use the Docker command line](https://docs.docker.com/engine/reference/commandline/cli/)