Provided that FUSE is installed and loaded on your kernel, which is easily checked running:
~ $ sudo modprobe --first-time fuse
modprobe: ERROR: could not insert 'fuse': Module already in kernelyou can start a docker container, say from a vanilla centos:6 based image:
~ $ docker run docker run --rm -it --cap-add SYS_ADMIN --device /dev/fuse centos:6 /bin/bashAssuming you are happy with using docker alongside apparmor, you're probably aware that a MAC (Mandatory Access Control) context can limit access to inodes even though you are root.
(All credits for this image go to: This Source )
In a nuteshell: even adding the right linux-capabilities to our container execution, in order to allow mount or ptrace, if your generic MAC profile is too restrictive, you actually won't be able to mount anything inside your container.
Thus you need to declare a proper profile in order to be allowed (by SELinux or Apparmor) to enable those capabilities.
Docker comes with a default profile located in /etc/apparmor.d/docker. Its content should be something like (current Docker version: Docker version 1.11.1, build 5604cbe):
#include <tunables/global>
profile docker-default flags=(attach_disconnected,mediate_deleted) {
#include <abstractions/base>
network,
capability,
file,
umount,
deny @{PROC}/* w, # deny write for all files directly in /proc (not in a subdir)
# deny write to files not in /proc/<number>/** or /proc/sys/**
deny @{PROC}/{[^1-9],[^1-9][^0-9],[^1-9s][^0-9y][^0-9s],[^1-9][^0-9][^0-9][^0-9]*}/** w,
deny @{PROC}/sys/[^k]** w, # deny /proc/sys except /proc/sys/k* (effectively /proc/sys/kernel)
deny @{PROC}/sys/kernel/{?,??,[^s][^h][^m]**} w, # deny everything except shm* in /proc/sys/kernel/
deny @{PROC}/sysrq-trigger rwklx,
deny @{PROC}/mem rwklx,
deny @{PROC}/kmem rwklx,
deny @{PROC}/kcore rwklx,
deny mount,
deny /sys/[^f]*/** wklx,
deny /sys/f[^s]*/** wklx,
deny /sys/fs/[^c]*/** wklx,
deny /sys/fs/c[^g]*/** wklx,
deny /sys/fs/cg[^r]*/** wklx,
deny /sys/firmware/efi/efivars/** rwklx,
deny /sys/kernel/security/** rwklx,
# suppress ptrace denials when using 'docker ps' or using 'ps' inside a container
ptrace (trace,read) peer=docker-default,
}
As you can see the line deny mount, is self-explained.
What we are going to do is to allow containers to perform ptrace() calls and mount CVMFS devices (FUSE).
According with the only decent guide found on the internet, I edited the previous file:
#include <tunables/global>
profile docker-cvmfs flags=(attach_disconnected,mediate_deleted) {
#include <abstractions/base>
network,
capability,
file,
umount,
mount,
ptrace,
deny @{PROC}/* w, # deny write for all files directly in /proc (not in a subdir)
# deny write to files not in /proc/<number>/** or /proc/sys/**
deny @{PROC}/{[^1-9],[^1-9][^0-9],[^1-9s][^0-9y][^0-9s],[^1-9][^0-9][^0-9][^0-9]*}/** w,
deny @{PROC}/sys/[^k]** w, # deny /proc/sys except /proc/sys/k* (effectively /proc/sys/kernel)
deny @{PROC}/sys/kernel/{?,??,[^s][^h][^m]**} w, # deny everything except shm* in /proc/sys/kernel/
deny @{PROC}/sysrq-trigger rwklx,
deny @{PROC}/mem rwklx,
deny @{PROC}/kmem rwklx,
deny @{PROC}/kcore rwklx,
# deny mount,
deny /sys/[^f]*/** wklx,
deny /sys/f[^s]*/** wklx,
deny /sys/fs/[^c]*/** wklx,
deny /sys/fs/c[^g]*/** wklx,
deny /sys/fs/cg[^r]*/** wklx,
deny /sys/firmware/efi/efivars/** rwklx,
deny /sys/kernel/security/** rwklx,
# suppress ptrace denials when using 'docker ps' or using 'ps' inside a container
# ptrace (trace,read) peer=docker-default,
}
Add this profile assuming it is located in /etc/apparmor.d/docker-cvmfs to apparmor:
~ # apparmor_parser -rW /etc/apparmor.d/docker-cvmfsNow you should be able to apply a --security-opt apparmor=<profile> flag.
For example:
~ $ docker run --rm -it --cap-add SYS_ADMIN --device /dev/fuse --security-opt apparmor=docker-cvmfs alisw/slc6-cvmfs /bin/bashFor further informations: SYS_ADMIN capability.
Create a file named /etc/yum.repos.d/cvmfs.repo with the following content:
[cvmfs]
name=CernVM-FS Stable
baseurl=http://cvmrepo.web.cern.ch/cvmrepo/yum/cvmfs/EL/$releasever/$basearch
enabled=1
gpgcheck=0
Now install CVMFS:
~ # yum install -y cvmfsand, for example:
~ # mount -t cvmfs alice.cern.ch /cvmfs
More doc: https://cernvm.cern.ch/portal/filesystem/docker