Container-based filesystems in Docker are by default ephemeral, meaning that they are not persistent discs and you can expect data within them to go away at any time. It's not recommended to store data inside a container filesystem if you ever plan to change or modify the files within that container.
Docker has the concept of volumes, which allow you to mount persistent discs to one or many containers. Let's create a new named volume within Docker with the Docker volume create command. We'll provide the name Web Data so we can easily reference this volume later from any container.
Now let's run a new NGINX container. Start by typing Docker run, followed by the dash D flag, to run this container as a background daemon. We'll also give it a name so we can reference it later. Let's call it Web1.
Next is the dash D flag, which allows you to specify a volume from which to mount a disc from. Let's specify Web Data, the name of the volume we created before, followed by a colon and a path of where to mount this volume.
Since NGINX serves files from the user share NGINX html directory, we'll specify that directory here. We'll then expose NGINX to our post at port 8000 and map that to the default NGINX port 80. Finally, we'll use NGINX as the name of the image from which we'll start this container from.
Let's check to see the contents of NGINX with Curl by typing curl localhost:8000. We can see this is the standard welcome to NGINX output. Let's change the default index.html page that NGINX is serving. We can do that without directly entering the container with the Docker exec command. Type Docker exec, followed by the name of our running NGINX container, Web1.
Let's pass a command to BASH to indecipherable string and overwrite the default NGINX index.html file. Let's again check to see the contents of NGINX with Curl. Let's now stop and remove this container. We can do that with Docker stop Web1 and Docker rm Web1.
Let's verify that no containers currently exist by running Docker PSA-A. Let's create a new Docker container by typing the same line as before. We want to test to make sure our data is persisting after container halts and terminations. If we check the output with Curl again, we can see that our data is persisting.
Let's see if we can mount the same volume to multiple Docker containers by starting another container with the name Web2 and listening on port 8001. Then let's check the output with Curl.
Let's change the index.html output to make sure our data mount is propagating changes between both of our web servers. We should be able to make either Web1 or Web2 because the data is mounted to both containers. Then let's check the Curl output of both containers.
There are some other commands specific to Docker volumes that we can check out. We can use Docker inspect with a dash F flag to specify a format to filter results, followed by the name of the container we want to inspect.
We can see the names of the volumes mounted to a specific container, along with the locations of where the volumes are being mounted. We can also drill down to find more information about a specific volume by using Docker volume inspect, followed by the name of the volume. Docker volume ls lists all volumes available.
To remove a volume, all containers must be stopped and removed. You can do this by Docker stop Docker rm commands. Now we can remove the volume by running Docker volume rm followed by the name of the volume. We can then verify the volume was removed by running Docker volume ls.