Very confused, I just need someone to help it click in my brain what I am missing here

Please help understand Docker disk space usage inside a running container.
For example if I use the official amazonlinux image

Don’t have it yet:
$ docker image list

REPOSITORY TAG IMAGE ID CREATED SIZE
haproxy 1.7 5b9524daa586 2 weeks ago 136 MB

Get it:
$ docker pull amazonlinux
Using default tag: latest
latest: Pulling from library/amazonlinux
d156a59f90d6: Already exists
Digest: sha256:cbf93d4d2c01aa2da7cfaa157682296651219f245aad92ea12f8a85be6042eef
Status: Downloaded newer image for amazonlinux:latest

Now I have it:
$ docker image list

REPOSITORY TAG IMAGE ID CREATED SIZE
haproxy 1.7 5b9524daa586 2 weeks ago 136 MB
amazonlinux latest 657ee1370452 8 days ago 162 MB

Run it to show df -h output lists 60GB disk, with 16 GB used? WTF…
$ docker run -it -h amazonlinux amazonlinux

bash-4.2# df -h
Filesystem Size Used Avail Use% Mounted on
none 60G 16G 41G 29% /
tmpfs 1000M 0 1000M 0% /dev
tmpfs 1000M 0 1000M 0% /sys/fs/cgroup
/dev/vda2 60G 16G 41G 29% /etc/hosts
shm 64M 0 64M 0% /dev/shm
tmpfs 1000M 0 1000M 0% /sys/firmware

bash-4.2# exit
exit

When I look at the Dockerfile for amazonlinux it basically boils down to ‘scratch’ which is nothing, and a root_fs.tar.gz file.

Official amazonlinux Dockerfile

FROM scratch
ADD amzn-container-minimal-2017.03.1.20170812-x86_64.tar.xz /
CMD ["/bin/bash"]

If I download amzn-container-minimal-2017.03.1.20170812-x86_64.tar.xz and extract it I can not find anything that would configure a 40gb disk or use 10gb.

On my local laptop I have extracted the downloaded root_fs tar gz file to a directory named aws_root_fs

Show size of root fs when extracted:
$ du -hs aws_root_fs
169M aws_root_fs

$ cd aws_root_fs/

$ ls -la
total 0
drwxr-xr-x@ 22 ubuckza PEROOT\Domain Users 748 Sep 7 09:43 .
drwxr-xr-x 8 ubuckza PEROOT\Domain Users 272 Sep 7 09:43 …
dr-xr-xr-x@ 50 ubuckza PEROOT\Domain Users 1700 Aug 12 19:15 bin
dr-xr-xr-x@ 2 ubuckza PEROOT\Domain Users 68 Jan 6 2012 boot
drwxr-xr-x@ 3 ubuckza PEROOT\Domain Users 102 Jan 6 2012 dev
drwxr-xr-x@ 87 ubuckza PEROOT\Domain Users 2958 Sep 7 09:46 etc
drwxr-xr-x@ 2 ubuckza PEROOT\Domain Users 68 Jan 6 2012 home
dr-xr-xr-x@ 4 ubuckza PEROOT\Domain Users 136 Aug 12 19:15 lib
dr-xr-xr-x@ 99 ubuckza PEROOT\Domain Users 3366 Aug 12 19:15 lib64
drwxr-xr-x@ 2 ubuckza PEROOT\Domain Users 68 Aug 12 19:15 local
drwxr-xr-x@ 2 ubuckza PEROOT\Domain Users 68 Jan 6 2012 media
drwxr-xr-x@ 2 ubuckza PEROOT\Domain Users 68 Jan 6 2012 mnt
drwxr-xr-x@ 2 ubuckza PEROOT\Domain Users 68 Jan 6 2012 opt
drwxr-xr-x@ 2 ubuckza PEROOT\Domain Users 68 Aug 12 19:15 proc
dr-xr-x—@ 2 ubuckza PEROOT\Domain Users 68 Jan 6 2012 root
dr-xr-xr-x@ 6 ubuckza PEROOT\Domain Users 204 Aug 12 19:15 sbin
drwxr-xr-x@ 2 ubuckza PEROOT\Domain Users 68 Jan 6 2012 selinux
drwxr-xr-x@ 2 ubuckza PEROOT\Domain Users 68 Jan 6 2012 srv
drwxr-xr-x@ 2 ubuckza PEROOT\Domain Users 68 Aug 12 19:15 sys
drwxr-xr-x@ 2 ubuckza PEROOT\Domain Users 68 Aug 12 19:15 tmp
drwxr-xr-x@ 14 ubuckza PEROOT\Domain Users 476 Aug 12 19:15 usr
drwxr-xr-x@ 19 ubuckza PEROOT\Domain Users 646 Aug 12 19:15 var

$ du -hs *
3.7M bin
0B boot
4.0K dev
4.4M etc
0B home
32K lib
11M lib64
0B local
0B media
0B mnt
0B opt
0B proc
0B root
1.8M sbin
0B selinux
0B srv
0B sys
0B tmp
140M usr
8.0M var

Back inside the running container:

bash-4.2# cat /etc/fstab

LABEL=/ / auto defaults,noatime 1 1
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
bash-4.2#

bash-4.2# cat mounts
none / aufs rw,relatime,si=7759fedf590fd1ea,dio,dirperm1 0 0
proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0
tmpfs /dev tmpfs rw,nosuid,mode=755 0 0
devpts /dev/pts devpts rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=666 0 0
sysfs /sys sysfs ro,nosuid,nodev,noexec,relatime 0 0
tmpfs /sys/fs/cgroup tmpfs ro,nosuid,nodev,noexec,relatime,mode=755 0 0
openrc /sys/fs/cgroup/openrc cgroup ro,nosuid,nodev,noexec,relatime,release_agent=/lib/rc/sh/cgroup-release-agent.sh,name=openrc 0 0
cpuset /sys/fs/cgroup/cpuset cgroup ro,nosuid,nodev,noexec,relatime,cpuset 0 0
cpu /sys/fs/cgroup/cpu cgroup ro,nosuid,nodev,noexec,relatime,cpu 0 0
cpuacct /sys/fs/cgroup/cpuacct cgroup ro,nosuid,nodev,noexec,relatime,cpuacct 0 0
blkio /sys/fs/cgroup/blkio cgroup ro,nosuid,nodev,noexec,relatime,blkio 0 0
memory /sys/fs/cgroup/memory cgroup ro,nosuid,nodev,noexec,relatime,memory 0 0
devices /sys/fs/cgroup/devices cgroup ro,nosuid,nodev,noexec,relatime,devices 0 0
freezer /sys/fs/cgroup/freezer cgroup ro,nosuid,nodev,noexec,relatime,freezer 0 0
net_cls /sys/fs/cgroup/net_cls cgroup ro,nosuid,nodev,noexec,relatime,net_cls 0 0
perf_event /sys/fs/cgroup/perf_event cgroup ro,nosuid,nodev,noexec,relatime,perf_event 0 0
net_prio /sys/fs/cgroup/net_prio cgroup ro,nosuid,nodev,noexec,relatime,net_prio 0 0
hugetlb /sys/fs/cgroup/hugetlb cgroup ro,nosuid,nodev,noexec,relatime,hugetlb 0 0
pids /sys/fs/cgroup/pids cgroup ro,nosuid,nodev,noexec,relatime,pids 0 0
cgroup /sys/fs/cgroup/systemd cgroup ro,nosuid,nodev,noexec,relatime,name=systemd 0 0
mqueue /dev/mqueue mqueue rw,nosuid,nodev,noexec,relatime 0 0
/dev/vda2 /etc/resolv.conf ext4 rw,relatime,data=ordered 0 0
/dev/vda2 /etc/hostname ext4 rw,relatime,data=ordered 0 0
/dev/vda2 /etc/hosts ext4 rw,relatime,data=ordered 0 0
shm /dev/shm tmpfs rw,nosuid,nodev,noexec,relatime,size=65536k 0 0
devpts /dev/console devpts rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0
proc /proc/bus proc ro,nosuid,nodev,noexec,relatime 0 0
proc /proc/fs proc ro,nosuid,nodev,noexec,relatime 0 0
proc /proc/irq proc ro,nosuid,nodev,noexec,relatime 0 0
proc /proc/sys proc ro,nosuid,nodev,noexec,relatime 0 0
proc /proc/sysrq-trigger proc ro,nosuid,nodev,noexec,relatime 0 0
tmpfs /proc/kcore tmpfs rw,nosuid,mode=755 0 0
tmpfs /proc/timer_list tmpfs rw,nosuid,mode=755 0 0
tmpfs /proc/sched_debug tmpfs rw,nosuid,mode=755 0 0
tmpfs /sys/firmware tmpfs ro,relatime 0 0
bash-4.2#

Please help me understand what I am missing here?

docker does not define disk partititions like virtual box/machine/pc.
docker just uses your host filesystem. So if your host has 100gb, docker just uses this.

Thank you, it is still not clear on where this is configured. My local laptop has 165 GB free, not sure why Docker is just showing 60gb. Somewhere inside Docker it’s told to reserve a certain part of my OS (Docker Instance) disk space for containers to use. I am just trying to truly understand what is happening under the hood.

I pulled alpine linux this morning which is one of the smallest docker images available and did the same test.

$ docker pull alpine
Using default tag: latest
latest: Pulling from library/alpine
88286f41530e: Pull complete
Digest: sha256:1072e499f3f655a032e88542330cf75b02e7bdf673278f701d7ba61629ee3ebe
Status: Downloaded newer image for alpine:latest

$ docker run -it -h alpine alpine
/ # df -h
Filesystem Size Used Available Use% Mounted on
none 59.0G 15.7G 40.3G 28% /
tmpfs 999.4M 0 999.4M 0% /dev
tmpfs 999.4M 0 999.4M 0% /sys/fs/cgroup
/dev/vda2 59.0G 15.7G 40.3G 28% /etc/resolv.conf
/dev/vda2 59.0G 15.7G 40.3G 28% /etc/hostname
/dev/vda2 59.0G 15.7G 40.3G 28% /etc/hosts
shm 64.0M 0 64.0M 0% /dev/shm
tmpfs 999.4M 0 999.4M 0% /proc/kcore
tmpfs 999.4M 0 999.4M 0% /proc/timer_list
tmpfs 999.4M 0 999.4M 0% /proc/sched_debug
tmpfs 999.4M 0 999.4M 0% /sys/firmware
/ #

Can you recommend a link that will give me very low level info on this?

This is the closest I can find so far.

1 Like

The link you found is the best technical information on this.

On a non-technical level, if you’re trying to store an amount of data where the amount of available disk is interesting, you should use the Docker volume mechanism to store the data in question elsewhere (in a managed directory in /var/lib/docker, in a known host location, somewhere else entirely). This is doubly true since you should expect to routinely stop and delete containers, which will destroy all of the data that only lives inside the running container.

1 Like