出于容器之间和容器与宿主机的安全隔离保护,在默认的Docker配置下,Docker容器是没有系统权限的。例如不能在一个Docker容器内,再运行一个Dokcer服务(译者注:或者在容器内修改系统时间)。这是因为在默认情况下,容器内的进程不允许访问任何宿主机上的设备。只有获得设备访问授权的容器,才可以访问所有设备(请参阅关于
cgroups
设备的文档)。
当容器管理员执行
docker run --privileged
时,将允许Docker容器访问宿主机上的所有设备,并在AppArmor或SELinux中设置一些配置,使容器内的进程可以与容器外运行的进程几乎一样权限来访问宿主机。(有关运行
--privileged
参数的更多信息,请访问
Docker博客
。)
如果想限制对特定设备的访问,可以使用
--device
参数。它允许您指定从容器内访问的一个或多个设备。
$ docker run --device=/dev/snd:/dev/snd ...
开启
--device
参数后,容器内的进程默认将获得这些设备的
read
、
write
和
mknod
权限。您也可以为每个
--device
参数,附加第三个
:rwm
选项来覆盖默认的设置:
$ docker run --device=/dev/sda:/dev/xvdc --rm -it ubuntu fdisk /dev/xvdc
Command (m for help): q
$ docker run --device=/dev/sda:/dev/xvdc:r --rm -it ubuntu fdisk /dev/xvdc
You will not be able to write the partition table.
Command (m for help): q
$ docker run --device=/dev/sda:/dev/xvdc:w --rm -it ubuntu fdisk /dev/xvdc
crash....
$ docker run --device=/dev/sda:/dev/xvdc:m --rm -it ubuntu fdisk /dev/xvdc
fdisk: unable to open /dev/xvdc: Operation not permitted
除了
--privileged
之外,操作员还可以使用
--cap-add
和
--cap-drop
对功能进行细粒度控制。默认情况下,Docker有一个保留的默认功能列表。
下表列出了Linux功能选项,这些选项是默认允许的,可以删除。
更多的参考信息可以在
capabilities(7) - Linux man page Linux
手册页中找到
--cap-add --cap-drop
两个参数都支持值
ALL
,所以如果Docker管理员想要获得除了
MKNOD
以外的所有Linux功能,可以使用:
$ docker run --cap-add=ALL --cap-drop=MKNOD ...
如果想与系统的网络堆栈进行交互,应该使用
--cap-add=NET_ADMIN
来修改网络接口,而不是使用
--privileged
。
$ docker run -it --rm ubuntu:14.04 ip link add dummy0 type dummy
RTNETLINK answers: Operation not permitted
$ docker run -it --rm --cap-add=NET_ADMIN ubuntu:14.04 ip link add dummy0 type dummy
要安装一个基于FUSE的文件系统,您需要结合
--cap-add
和
--device
:
$ docker run --rm -it --cap-add SYS_ADMIN sshfs sshfs sven@10.10.10.20:/home/sven /mnt
fuse: failed to open /dev/fuse: Operation not permitted
$ docker run --rm -it --device /dev/fuse sshfs sshfs sven@10.10.10.20:/home/sven /mnt
fusermount: mount failed: Operation not permitted
$ docker run --rm -it --cap-add SYS_ADMIN --device /dev/fuse sshfs
# sshfs sven@10.10.10.20:/home/sven /mnt
The authenticity of host '10.10.10.20 (10.10.10.20)' can't be established.
ECDSA key fingerprint is 25:34:85:75:25:b0:17:46:05:19:04:93:b5:dd:5f:c6.
Are you sure you want to continue connecting (yes/no)? yes
sven@10.10.10.20's password:
root@30aa0cfaf1b5:/# ls -la /mnt/src/docker
total 1516
drwxrwxr-x 1 1000 1000 4096 Dec 4 06:08 .
drwxrwxr-x 1 1000 1000 4096 Dec 4 11:46 ..
-rw-rw-r-- 1 1000 1000 16 Oct 8 00:09 .dockerignore
-rwxrwxr-x 1 1000 1000 464 Oct 8 00:09 .drone.yml
drwxrwxr-x 1 1000 1000 4096 Dec 4 06:11 .git
-rw-rw-r-- 1 1000 1000 461 Dec 4 06:08 .gitignore
默认的seccomp配置文件将根据所选的功能进行调整,以允许使用功能所允许的功能,所以从Docker1.12之后的版本,不应该对此进行调整。在Docker 1.10和1.11中没有这种情况,在添加功能时可能需要使用一个自定义的seccomp配置文件或使用--security-opt seccomp=unconfined
。
原文档链接: https://docs.docker.com/engine/reference/run/