Как настроить возможности Linux при вызовах служб в режиме docker swarm

Я изучаю понятие хранилища, работающего под управлением swarm (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 командовать?

По состоянию на 20.10, это доступно с docker service create с --cap-add:

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

Или в файле compose, используемом с 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 вариант вслепую находится в большом кластере, могут возникнуть проблемы с безопасностью, связанные с тем, что менеджер отправляет контейнеры с дополнительными привилегиями рабочему. Работник может доверять запущенным защищенным контейнерам, которые не могут получить доступ к хосту, но не хотят разрешать удаленный корневой доступ к хосту через привилегированный контейнер.

Обсуждение этого вопроса завершено на 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

Все остальные ответы здесь старые. Докер 20.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

Я нашел решение для решения этой проблемы, и я могу использовать cap_net_admin в режиме роя.

Вы можете изменить исходный код среды выполнения, чтобы добавить необходимые вам возможности (это будет локальная настройка по умолчанию).

Например, я добавил CAP_NET_ADMIN к моей среде выполнения (используется nvidia-container-runtime)wanyvic/nvidia-контейнер-среда выполнения.

После этого я перестроил его, запустил контейнер (используйте режим роя), ввел: capsh --print и CAP_NET_ADMIN можно найти:

root@25303a54ebb3:/# capsh --printCurrent:=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+eipBounding 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_setfcapSecurebits: 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 в образе для службы.) Самый внутренний контейнер, который вы запускаете в docker таким образом, будет иметь привилегии / возможности узла swarm, а не службы, и служба просто станет тонким слоем контейнера.