我正在研究在 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-557790402和https://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-runtime
)
wanyvic/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_drop
docker-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。)以这种方式运行的最内层容器将具有群集主机的权限/功能,而不是服务的权限/功能,并且服务只会变成一个薄容器层。