Search code examples
dockerstoragedockerfilewindows-server-2016

Docker Storage - Getting a Layman's answer


I am just discovering Docker - I am finding so much information, but I can't seem to get a straight answer on this option. If someone could give me a clear explanation based on my understanding I have of it so far it would be appreciated.

I am downloading a docker image locally - say the default one from Microsoft, using microsoft/dotnet-samples:dotnetapp-nanoserver I am lost as to where this is downloaded to? Is this downloaded and installed as a program on the host machine, with a isolated script that controls the container? The download is about 1.3 gigs because it includes .Net Core

In another example, if I download apache2 to run as a web server, does it install it in the default paths on the host system, but every container I want to use taps into that - or does every container contain it's isolated version of apache2?

I ask this because I can't find files that mimic the file size of these programs.

I know they are not complete VM's but where can I find the files associated with a container?

I am using Windows Server 2016 and a Mac since I want to do some trials with containers.


Solution

  • An image is a filesystem

    Docker images are encapsulated filesystems. The software and files inside are not being directly installed onto your system.

    You can think of a Docker image sort of the way you think of a .zip file. You can download a .zip file from somewhere, and it is a single file. Contained inside it might be one file, or dozens of files, or a nested tree of directories and files. But on your disk, it exists as one file.

    A Docker image is similar (conceptually, at least... the details are more complicated).

    Image storage

    Where images are stored varies by platform. On a Linux system, they are usually under /var/lib/docker. I don't know where they are stored on Windows, but this is a more or less opaque store. Poking around inside will not reveal very much to you anyway.

    To see what you have, you should use the docker images command. It will show you the images you have stored locally.

    Like I said earlier, each image may consist of multiple layers. By default, that command will only show you the top layer, which is the one you'll care about, to run containers from. Technically, there are other layers, and you can see all of them using docker images -a.

    Where is the software installed?

    When you download an Apache image, nothing is installed on your system at all. The image file(s) are downloaded and stored. Hiding inside is Apache and everything Apache needs in order to run, but Apache is not installed onto your Windows OS anywhere.

    When you want to use Apache, you would run a container. Docker takes the Apache image and, using it as a starting template, creates a running process container, inside of which Apache is running. This is isolated from your operating system. Apache is only running inside of the container.

    If you run a second container from the Apache image, you now have two completely separate Apache instances running, each in their own isolated filesystem environment.

    Where can I find the files?

    If you just want to poke around in the container filesystem, you can start the container in interactive mode, and run a shell instead of whatever it normally runs (like Apache). For instance, if you have an image apache:latest, you can do this:

    docker run --rm -it apache:latest bash
    

    This will run an instance of apache:latest, but instead of launching Apache, it will run a bash shell and drop you into it.

    The --rm flag is convenient for cases like this. It tells Docker to remove the running container when its process exits. That way for a "just looking at something" container like this one, it cleans up after itself.

    The -it is actually two flags. -i is interactive mode, and -t allocates a terminal. This is a common flag to pass when you want to directly interact with the container.

    Once inside, you can use the usual commands to look at files and directory listings. Note that many containers are stripped-down, though. You don't always have all of the tools you are used to having. Things like ls in Linux are typically there, but a lot of things will not be.

    Simply exit when you're done looking around to exit.

    Looking around while the process is running

    You can also look at the container while Apache is running. First start it normally.

    docker run -d apache:latest
    

    This will return a container ID. You can also get the ID from docker ps. Then you can attach to the container with that ID by executing a shell.

    docker exec -it <container_id> bash
    

    Now you're in the container in a shell, but Apache is in there running.