如果我在特权模式下运行一个容器,它是否具有所有内核功能或者我需要单独添加它们?
如果我在特权模式下运行一个容器,它是否具有所有内核功能或者我需要单独添加它们?
在特权模式下运行确实使容器具备所有功能。但是最好的做法是始终给容器提供其所需的最小要求。
Docker run命令文档提到了此标志:
完整的容器能力 (--privileged)
--privileged标志赋予容器所有能力,并且还解除了设备cgroup控制器强制执行的所有限制。换句话说,容器几乎可以做主机能做的一切。这个标志存在是为了允许特殊用例,比如在 Docker 中运行 Docker。
您可以使用 --cap-add
标志来赋予特定的能力。有关这些功能的更多信息,请参见man 7 capabilities
。可以使用文字名称,例如 --cap-add CAP_FOWNER
。
您永远不应该使用--privileged
来运行容器。
我在我的笔记本电脑上进行此操作,它具有NVMe驱动器,但它适用于任何主机:
docker run --privileged -t -i --rm ubuntu:latest bash
首先,让我们做一些小事情,测试/proc文件系统。
从容器中:
root@507aeb767c7e:/# cat /proc/sys/vm/swappiness
60
root@507aeb767c7e:/# echo "61" > /proc/sys/vm/swappiness
root@507aeb767c7e:/# cat /proc/sys/vm/swappiness
60
$ cat /proc/sys/vm/swappiness
61
root@507aeb767c7e:/proc# cat /sys/block/nvme1n1/dev
259:2
好的,在一个dbus规则不会自动扫描的位置创建设备文件:
root@507aeb767c7e:/proc# mknod /devnvme1n1 b 259 2
root@507aeb767c7e:/proc# sfdisk -d /devnvme1n1
label: gpt
label-id: 1BE1DF1D-3523-4F22-B22A-29FEF19F019E
device: /devnvme1n1
unit: sectors
first-lba: 34
last-lba: 2000409230
<SNIP>
好的,我们可以读取启动磁盘,让我们为其中一个分区制作设备文件。虽然我们不能挂载它,因为它将是打开的,但我们仍然可以使用dd
进行复制。
root@507aeb767c7e:/proc# mknod /devnvme1n1p1 b 259 3
root@507aeb767c7e:/# dd if=devnvme1n1p1 of=foo.img
532480+0 records in
532480+0 records out
272629760 bytes (273 MB, 260 MiB) copied, 0.74277 s, 367 MB/s
好的,让我们将其挂载并查看我们的努力是否奏效!
root@507aeb767c7e:/# mount -o loop foo.img /foo
root@507aeb767c7e:/# ls foo
EFI
root@507aeb767c7e:/# ls foo/EFI/
Boot Microsoft ubuntu
--privileged
容器的容器主机都等同于将根访问权限授予该主机上每个容器的用户。--privileged
。这里有一篇来自RedHat的好文章,涵盖了相关内容。
尽管 Docker 容器运行时以“root”身份比主机上的 root 权限少,但根据您的用例(作为开发环境使用还是共享生产集群),它仍然可能需要加固。
与其改变swappiness,您可以将相同的值写入其中,并检查返回的结果:
非特权docker:
root@8191892d9f7f:/# cat /proc/sys/vm/swappiness
20
root@8191892d9f7f:/# echo 20 > /proc/sys/vm/swappiness
bash: /proc/sys/vm/swappiness: Read-only file system
特权 Docker:
root@7c6c0a793ca0:/# cat /proc/sys/vm/swappiness
20
root@7c6c0a793ca0:/# echo 20 > /proc/sys/vm/swappiness
root@7c6c0a793ca0:/#