Docker, my first container

Main commands for starting with Docker. How to run a container? How to see which container is running?

You will learn here to create and manage your first docker container.

This is a practical tutorial. You can find the theoretical part here: Docker, what is it?.

Let's take an example

As an example, let's install the web server Nginx. Our goal is to display "my first container with docker" when navigating to http://localhost:1337 using your usual browser.

First, you need to install docker: https://docs.docker.com/get-docker/.

For our example, here is the basic structure we will use:

  • The folder nginx-docker contains the resources to build the docker container.
  • The folder project contains the HTML file available for the web browser.
  • The Dockerfile contains the description of our image.
cd ~

mkdir nginx-docker project

echo "my first container with docker" > project/index.html

touch nginx-docker/Dockerfile

Build a Docker image

Docker hub already proposes an official image for nginx. Let's use it in the Dockerfile!

FROM nginx:1.18

This small Dockerfile is all you need for our example!

Next step, we need to build our docker image based on this Dockerfile. To make things clearer, you can give it a name.

docker build -t my_nginx_image ~/nginx-docker

Docker executes line by line the content of the Dockerfile. On the "FROM" instruction, it automatically downloads the basic image if it's missing. You can run the command a second time if you want to check that the download process is only executed the first time.

docker build takes a folder as argument and not directly the Dockerfile because the folder can contain other files and be used as a building "context".

You currently have 2 images: nginx 1.18 and my_nginx_image. You can see the images with:

docker image ls

Create a Docker container

Guess what? It's time to create your first container \o/.

Summary of the needs:

  • Accessing localhost:1337 must display index.html. Nginx is, by default, listening on the port 80: we need to bind the port 1337 of the host to the port 80 of the container.
  • It would be awesome to be able to change the content of index.html without having to restart the container: we need a "volume" linking the project "folder" of our host to the root folder used by nginx inside the container "/usr/share/nginx/html". This kind of detail is written on the nginx page of the docker hub: read it carefully.
docker run -p 1337:80 -v ~/project:/usr/share/nginx/html my_nginx_image

# -p : port redirection
# -v : creation of a volume. You must use absolute paths.

At http://localhost:1337 you can see "my first container with docker".

Congratulations, your first container is running!

You can see the running containers with:

docker ps

Some comments:

  • docker run did not give you back the prompt and continues to run upfront. The option -d turns on the detached mode.
  • The container has a weird name like nervous_chaplygin. Fun fact, a random name is generated each time you launch docker run without explicitly providing a name. You can find the algo here. The option --name gives a name to a container. The name can be used with most of the docker commands in the same way as the container ID.
  • By executing docker run several times, without naming it, you will each time create a new container.

For the next commands we will use as an example the container ID 61363317039f.

You can stop the container with:

docker stop 61363317039f

The container is not active and is not displayed anymore by docker ps.

However, the container still appears with docker ps --all, proving that it still lives and still consumes your machine's resources.

There is several ways of deleting a stopped container:

docker container rm 61363317039f

# it's an alias of docker container rm
docker rm 61363317039f

# remove all stopped containers
docker container prune

In this tutorial you learned to build an image, to create a container from this image then to delete it.


Continue your apprenticeship of docker in the tutorial Docker, basic commands.

Have a nice day :)