You can experiment this by starting a basic ubuntu image and create a test file or dir. The soon you exit the container all your changes will disappear.

Shell

1

2

3

4

docker run-t-iubuntu/bin/bash

touch/my_file

ls->you will see my_file

exit

Let’s try to bring that container up again:

Shell

1

2

docker run-t-iubuntu/bin/bash

ls->my_file isGONE

Thankfully Docker provides the solution to keep data persistent.

Docker Data Volumes

Docker data volumes are used when:

You want to persist data, even through container restarts

You want to share data between the host filesystem and the Docker container

You want to share data with other Docker containers.

Data persist

There’s no way to directly create a “data volume” in Docker, so instead we create a data volume containerwith a volume attached to it. For any other containers that you then want to connect to this data volume container, use the Docker’s –volumes-from option to grab the volume from this container and apply them to the current container.

Le’s create a data volume container to store our volume:

Shell

1

2

docker create-v/data--name datacontainer ubuntu

docker volume ls

Shell

1

2

DRIVER VOLUME NAME

local c8b7031de3a7504c677b38617426ee22b28e3718c87331758d5022fd485b1e26

This created a container named datacontainer based on ubuntu image and in the directory /data.

If we reiterate our initial test with –volumes-from flag, anything we write to /data directory into current container will be saved to the /data volume of our datacontainer.

Shell

1

docker run-t-i--volumes-from datacontainer ubuntu/bin/bash

Shell

1

2

root@60c6e7f8307c:/# touch /data/my_file

exit

Now rerun the container and check if /data/my_file is persisted.

Shell

1

2

docker run-t-i--volumes-from datacontainer ubuntu/bin/bash

ls/data/

You can also create as many data volume containers as you’d like but you are restricted to choose the mount inside the container (/data in our example).

Sharing data between containers – shared volumes

There is the need to share data between host and container itself. Docker gives you the option to run a container and override one of its directories with the contents of a directory on the host system.

Let’s imagine you’re running your application and you want to keep the logs out of container.

C#

1

2

mkdir~/nginxlogs

docker run-d-v~/nginxlogs:/var/log/nginx-p8080:80-inginx

We set up a volume that links the /var/log/nginx directory from the nginx container to ~/nginxlogs on our host.

C#

1

2

curl localhost:80800

tail~/nginxlogs/access.log

If you make any changes to the ~/nginxlogs folder, you’ll be able to see them from inside the Docker container in real-time as well.

Docker is a great tool but for complex applications with a lot of components, orchestrating all the containers to start up and shut down together (not to mention talk to each other) can quickly become difficult.

Docker Images

Docker at its core is a way to separate an application and the dependencies needed to run it from the operating system itself. To make this possible Docker uses containers and images.

A Docker image is basically a template for a filesystem. When you run a Docker image, an instance of this filesystem is made live and runs on your system inside a Docker container. By default this container can’t touch the original image itself or the filesystem of the host where Docker is running. It’s a self-contained environment.

Containers

Docker containers wrap up your application in a complete filesystem that contains everything it needs to run: code, runtime, system tools, system libraries – anything you can install on a server. This guarantees that it will always run the same, regardless of the environment it is running in.

Containers are for software, not for data

Docker containers are consumables. Docker containers should be used to scale applications, for firing more app servers with the same setup etc. Data belongs onto the filesystem but not into a container that can neither be cloned in an easy way nor incrementally backed up in a reasonable way. Containers are for software, not for data.