Я изучаю понятие хранилища, работающего под роем (1.12.x).
Один контейнер будет запускаться с: 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
возможность, чтобы заблокировать зашифрованный обмен для службы хранилища в этом случае.
Как установить флаги --cap-add при запуске службы режима роя с docker service create
команда?
В настоящее время он не поддерживается, но Docker работает над решением. Логика исключения --cap-add
вариант вслепую находится в большом кластере, могут возникнуть проблемы с безопасностью диспетчера, отправляющего контейнеры с дополнительными привилегиями работнику. Рабочий может доверять запущенным безопасным контейнерам, которые не могут получить доступ к хосту, но не хотят разрешать удаленный корневой доступ к хосту через привилегированный контейнер.
Обсуждение этого окончено на 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
Я нашел решение проблемы и могу использовать cap_net_admin
в режиме роя.
Вы можете изменить исходный код среды выполнения, чтобы добавить необходимые вам возможности (это будет локальная настройка по умолчанию).
Например, я добавил CAP_NET_ADMIN
к моей среде выполнения (используется nvidia-container-runtime
) wanyvic / nvidia-контейнер-время выполнения.
После этого я перестроил его, запустил контейнер (использовать режим роя), ввел: 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
, но я не могу найти способ решить эту проблему.
Видеть https://hub.docker.com/r/ixdotai/swarm-launcher
Это репо основано на этом комментарии / идее: https://github.com/moby/moby/issues/25885#issuecomment-573355530
В зависимости от варианта использования обходной путь - привязать-монтировать
/var/run/docker.sock
от хоста (ов) роя к службе, затем запуститеdocker run --privileged ...
илиdocker run --cap-add ...
из службы для выполнения ваших реальных привилегированных команд. (Вам нужно будет установить docker cli в образе для службы.) Самый внутренний контейнер, который вы запускаете таким образом, будет иметь привилегии / возможности узла роя, а не службы, и служба просто станет тонкой контейнерный слой.