Один из вариантов — предоставить прямой доступ к демону докера, как было предложено в предыдущих ответах, но для этого требуется настроить сертификаты и ключи TLS, что само по себе может быть сложным и трудоемким. Докер-машина может автоматизировать этот процесс, когда докер-машина использовалась для создания узлов.
У меня была та же проблема: я хотел создать секреты в рое, не загружая файл, содержащий секрет, в диспетчер роя. Кроме того, я хотел иметь возможность запускать файл стека развертывания (например, docker-compose.yml) без хлопот с первой загрузкой файла стека.
Я хотел иметь возможность создать несколько серверов, которые мне нужны, например. DigitalOcean, не обязательно использующий докер-машину, и иметь возможность воспроизводимо создавать секреты и запускать файл стека. В таких средах, как DigitalOcean и AWS, отдельный набор сертификатов TLS не используется, а для доступа к удаленному узлу по ssh используется ключ ssh на локальном компьютере.
Решение, которое сработало для меня, состояло в том, чтобы запускать команды докера с использованием отдельных команд через ssh
, что позволяет мне передать секрет и/или файл стека с помощью стандартного ввода.
Для этого вам сначала нужно создать дроплеты DigitalOcean и установить на них докер, возможно, из пользовательского образа или моментального снимка, или просто запустить команды для установки докера на каждом дроплете. Затем объедините капли в рой: ssh
в тот, который будет управляющим узлом, введите docker swarm init
(возможно, с опцией --advertise-addr
, если на этом узле более одного IP-адреса, например, если вы хотите сохранить трафик внутри роя в частной сети) и получить команду соединения для роя. Затем ssh
войдите в каждый из других узлов и выполните команду соединения, и ваш рой будет создан.
Затем экспортируйте команду ssh
, вам нужно будет выдавать команды на узле менеджера, например
export SSH_CMD='ssh [email protected]'
Теперь у вас есть несколько вариантов. Вы можете выполнять отдельные команды докера, например:
$SSH_CMD docker service ls
Вы можете создать секрет в своем рое, не копируя секретный файл в менеджер роя:
$SSH_CMD docker create secret my-secret - < /path/to/local/file
$SSH_CMD docker service create --name x --secrets my-secret image
(Используя -
, чтобы указать, что docker create secret
должен принять секрет на стандартный ввод, а затем передать файл на стандартный ввод с помощью ssh)
Вы также можете создать сценарий, чтобы иметь возможность воспроизводимо запускать команды для создания ваших секретов и вызывать стек с секретными файлами и файлами стека только на вашем локальном компьютере. Таким сценарием может быть:
$SSH_CMD docker secret create rabbitmq.config.01 - < rabbitmq/rabbitmq.config
$SSH_CMD docker secret create enabled_plugins.01 - < rabbitmq/enabled_plugins
$SSH_CMD docker secret create rmq_cacert.pem.01 - < rabbitmq/cacert.pem
$SSH_CMD docker secret create rmq_cert.pem.01 - < rabbitmq/cert.pem
$SSH_CMD docker secret create rmq_key.pem.01 - < rabbitmq/key.pem
$SSH_CMD docker stack up -c - rabbitmq_stack < rabbitmq.yml
где секреты используются для сертификатов и ключей, а также для файлов конфигурации rabbitmq.config и enabled_plugins, а файл стека — rabbitmq.yml, который может быть:
version: '3.1'
services:
rabbitmq:
image: rabbitmq
secrets:
- source: rabbitmq.config.01
target: /etc/rabbitmq/rabbitmq.config
- source: enabled_plugins.01
target: /etc/rabbitmq/enabled_plugins
- source: rmq_cacert.pem.01
target: /run/secrets/rmq_cacert.pem
- source: rmq_cert.pem.01
target: /run/secrets/rmq_cert.pem
- source: rmq_key.pem.01
target: /run/secrets/rmq_key.pem
ports:
# stomp, ssl:
- 61614:61614
# amqp, ssl:
- 5671:5671
# monitoring, ssl:
- 15671:15671
# monitoring, non ssl:
- 15672:15672
# nginx here is only to show another service in the stackfile
nginx:
image: nginx
ports:
- 80:80
secrets:
rabbitmq.config.01:
external: true
rmq_cacert.pem.01:
external: true
rmq_cert.pem.01:
external: true
rmq_key.pem.01:
external: true
enabled_plugins.01:
external: true
(Здесь файл rabbitmq.config настраивает порты прослушивания ssh для stomp, amqp и интерфейса мониторинга, а также указывает rabbitmq искать сертификаты и ключ в /run/secrets. Другой альтернативой этому конкретному образу может быть использование переменные среды, предоставляемые образом, указывают на файлы секретов, но я хотел более универсальное решение, которое не требовало настройки в образе)
Теперь, если вы хотите вызвать другой рой, ваш скрипт будет работать с этим роем, как только вы установите переменную окружения SSH_CMD
, и вам не нужно ни настраивать TLS, ни копировать секрет или стековые файлы в файловую систему роя.
Таким образом, это не решает проблему создания роя (существование которого предполагалось вашим вопросом), но после его создания использование переменной среды (экспортируемой, если вы хотите использовать ее в сценариях) позволит вам использовать почти именно те команды, которые вы указали, с префиксом этой переменной среды.
person
nachbar
schedule
18.11.2018