如何在 docker swarm 模式服务调用中设置 Linux 功能

如何在 docker swarm 模式服务调用中设置 Linux 功能

我正在研究在 swarm (1.12.x) 下运行的 vault 的概念。

单个容器将通过以下方式启动: docker run -d --cap-add IPC_LOCK -p 8200:8200 -p 8215:8125 --name vault --volume /vagrant/vault:/vagrant/vault vault server -config=/path/to/vault.hcl

但是当我想在 Swarm 中将其作为服务运行时,似乎没有办法指定功能IPC_LOCK,以便在这种情况下锁定 Vault 服务的加密交换。

如何在使用命令启动 Swarm 模式服务时设置 --cap-add 标志docker service create

答案1

从 20.10 开始,可以通过docker service create以下方式获取--cap-add

$ docker service create --help
...
      --cap-add list                       Add Linux capabilities
      --cap-drop list                      Drop Linux capabilities

docker stack deploy或者在使用与版本 2 文件相同的语法的撰写文件中:

version: "3.9"
services:
  app:
    image: your-image:tag
    cap_add:
    - CAP_NAME1
    - CAP_NAME2
    cap_drop:
    - CAP_NAME3
    - CAP_NAME4

[ 20.10 之前的原始答案 ]

目前不支持,但 Docker 正在研究解决方案。盲目不包含该选项的逻辑--cap-add是,在大型集群中,管理器向工作器提交具有附加权限的容器可能会存在安全问题。工作器可能信任无法访问主机的安全容器,但不想允许通过特权容器对主机进行远程 root 访问。

关于此问题的讨论已在 github 上结束:

https://github.com/docker/docker/pull/26849#issuecomment-252704844

https://github.com/docker/swarmkit/issues/1030

https://github.com/docker/swarmkit/pull/1722

https://github.com/moby/moby/issues/25885#issuecomment-557790402https://github.com/docker/cli/pull/2199

答案2

这里的所有其他答案都是旧的。Docker20.10.0 及更高版本现在支持通过以下方式指定 Swarm 服务的功能docker service命令行Docker Stack YAML 文件格式

在命令行上,只需指定--cap-add [capability]--cap-drop [capability]

以下是在 Docker Stack YAML 文件中添加功能的示例:

version: "3.9"
services:
  your-service:
    cap_add:
      - CAP_SYS_ADMIN

答案3

我找到了解决这个问题的方法,并且可以cap_net_admin在群体模式下使用。

您可以修改运行时源代码以添加您需要的功能(它将是本地默认设置)。

例如,我将添加CAP_NET_ADMIN到我的运行时(使用nvidia-container-runtimewanyvic/nvidia-container-runtime

之后我重建了它,启动了一个容器(使用 swarm 模式),输入:capsh --print并且可以找到 CAP_NET_ADMIN:

root@25303a54ebb3:/# capsh --print
Current:=cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_admin,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap+eip
Bounding set =cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_admin,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap
Securebits: 00/0x0/1'b0
 secure-noroot: no (unlocked)
 secure-no-suid-fixup: no (unlocked)
 secure-keep-caps: no (unlocked)
uid=0(root)
gid=0(root)
groups=

但这个方法并不好。

我也无法设置或cap_add,但我找不到解决方法。cap_dropdocker-compose.yml

答案4

https://hub.docker.com/r/ixdotai/swarm-launcher

该 repo 基于此评论/想法:https://github.com/moby/moby/issues/25885#issuecomment-573355530

/var/run/docker.sock根据使用情况,一种解决方法是从群集主机绑定挂载到服务,然后运行docker run --privileged ...docker run --cap-add ...从服务执行您的实际特权命令。(您必须在服务的映像中安装 docker cli。)以这种方式运行的最内层容器将具有群集主机的权限/功能,而不是服务的权限/功能,并且服务只会变成一个薄容器层。

相关内容