Finally we get to the point where we actually start to use Docker.

On Linux and macOS open the Terminal, on Windows open the Command Prompt (click on the Windows button on your keyboard, type in "cmd" and press ENTER). I'd also recommend you enlarge this window so you will see more content.

Type in the following command:

docker run hello-world

At this point Docker will try to start a container using the latest version of the image called hello-world. If this is the first time you try to do this, you won't have this images on your computer so you will see a warning:

Unable to find image 'hello-world:latest' locally

Then Docker will automatically try to download the image from the Docker HUB and will let you know about this:

latest: Pulling from library/hello-world

It shows you some progress and that it managed to download it:

2db29710123e: Pull complete
Digest: sha256:c77be1d3a47d0caf71a82dd893ee61ce01f32fc758031a6ec4cf1389248bb833
Status: Downloaded newer image for hello-world:latest

Then it will start a Docker container based on the hello-world:latest image.

This will print some text on the screen starting with

Hello from Docker!

The full output will look similar to this:

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:c77be1d3a47d0caf71a82dd893ee61ce01f32fc758031a6ec4cf1389248bb833
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

Once the text is printed to the screen the container will stop running.

This is not a very sophisticated image, it can only print this text and has no further functionality.

After Hello World - check the status

Before going on and trying to do more complex things with other images, let's look around to see what happened on the hard-disk of our computer.

Run

docker ps -as

This will show you a report with a number of columns. The -a tells it to show all the containers and the -s told it to include the SIZE column.

This list all the containers that have ran and are still around on your disk.

IF this is a clean computer where you only ran the above command then this is more or less what you will see.

In the first column you will see the CONTAINER ID. This will be different as it is the ID of the container which is the runtime version of the image. It changes from run to run.

The 2nd column is the name of the IMAGE which is hello-world as that's what we used.

COMMAND is the command that was executed inside the container. This was the default command baked in the image.

CREATED is the time when the container was created.

STATUS is, well the status of the container. Currently it reports that this container has stopped running.

PORTS is not interesting now.

NAME holds the name of the container. If the user does not provide a name, and we did not provide a name, than docker will pick a random name created from two random words.

SIZE is how much space the container takes up on the disk.

The command:

docker ps -as

The output:

CONTAINER ID   IMAGE        COMMAND   CREATED         STATUS                     PORTS  NAMES          SIZE
20dc20bcac8f   hello-world  "/hello"  31 minutes ago  Exited (0) 31 minutes ago         jovial_bouman  0B (virtual 13.3kB)

docker ps

If I ran docker ps without the extra parameters then it would only show the titles as the command without the -a (all) flag only shows the currently running containers and ours has already finished running.

docker ps -a

shows all the containers that are running and all the containers that have stopped but have not been deleted yet.

docker images

If you type in

docker images

you will see the list of images on your computer.

REPOSITORY              TAG                IMAGE ID       CREATED         SIZE
hello-world             latest             feb5d9fea6a5   14 months ago   13.3kB

Here you can see the images that were downloaded or that were created locally.

You remember as we ran the docker run ... command docker told us that it cannot find the images locally and so it downloaded the image called hello-world with the latest tag.

In the first column you can see the name of the image. The second column is the tag. In this case it is latest.

The IMAGE ID is a short version of the unique ID of the image.

CREATED shows when was the image created. In our case this is an image that was created 14 month ago.

SIZE is the size of the whole image.

As you can see this is a really, really small image. Basically just the text we saw.

We can see that there are images and containers which are the runtime copies of the images.

Run Hello World again

docker run hello-world

This time it does not say that it can't find the image, and it does not need to download the image as we already have it locally. It only prints the text starting with Hello from Docker!.

Now we take a look at the status of the containers:

docker ps -as

The result will look something like this:

CONTAINER ID   IMAGE        COMMAND   CREATED        STATUS                    PORTS NAMES             SIZE
f4b4ef0de525   hello-world  "/hello"  7 seconds ago  Exited (0) 6 seconds ago        focused_margulis  0B (virtual 13.3kB)
20dc20bcac8f   hello-world  "/hello"  8 minutes ago  Exited (0) 8 minutes ago        jovial_bouman     0B (virtual 13.3kB)

Now we have two lines. The second line is the same as we had earlier, except of the CREATED and STATUS columns that shows relative time and that has changed.

As you can see the CONTAINER ID is different in the two rows and the NAMES are different, but the IMAGE and the COMMAND are the same.

If we list the images using docker images we can see that the list of images has not changed. We still has that single image on our computer.

Remove container

The last thing we would like to see now is how to get rid of these containers that were created and saved on the disk.

We can use the CONTAINER ID to remote a container.

docker rm 20dc20bcac8f

If we run again

docker ps -as

Then you can see that only one line remained:

CONTAINER ID   IMAGE        COMMAND   CREATED        STATUS                    PORTS NAMES             SIZE
f4b4ef0de525   hello-world  "/hello"  27 seconds ago  Exited (0) 26 seconds ago      focused_margulis  0B (virtual 13.3kB)

We can also remove the other container in the same way after which there are no more containers left on the system as you can verify by running docker ps -as again.

Remove a Docker image

The image is still there as you can see by running docker images.

In order to remove that we can use the rmi command:

docker rmi hello-world

Untagged: hello-world:latest
Untagged: hello-world@sha256:c77be1d3a47d0caf71a82dd893ee61ce01f32fc758031a6ec4cf1389248bb833
Deleted: sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412
Deleted: sha256:e07ee1baac5fae6a26f30cabfe54a36d3402f96afda318fe0a96cec4ca393359

If we run again docker images then we can see it is gone.

Next

Next we are going to see a slightly more complex example using the busybox, but before you go there I'd recommend you try the commands you just saw.