Как я могу удаленно подключиться к Docker Swarm?

Можно ли выполнять команды в кластере docker swarm, размещенном в облаке, с моего локального Mac? Если да, то как?

Я хочу выполнить следующую команду в рое докеров с моего локального компьютера:

docker create secret my-secret <address to local file>
docker service create --name x --secrets my-secret image

person Navdeep    schedule 18.05.2017    source источник


Ответы (5)


Ответ на вопрос можно найти здесь.

Что нужно сделать для машины с Ubuntu, так это определить файл daemon.json по пути /etc/docker со следующим содержимым:

{
  "hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]
}

Приведенная выше конфигурация не защищена и не должна использоваться, если сервер размещен публично.

Для защищенного соединения используйте следующую конфигурацию:

{
  "tls": true,
  "tlscert": "/var/docker/server.pem",
  "tlskey": "/var/docker/serverkey.pem",
  "hosts": ["tcp://x.x.x.y:2376", "unix:///var/run/docker.sock"]
}

Подробности для создания сертификата можно найти здесь, как указано @BMitch.

person Navdeep    schedule 12.06.2017

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

Чтобы подключиться к удаленному узлу докера, вы должны настроить TLS как на хосте докера, так и на клиенте, подписанном из одного и того же центра сертификации. Позаботьтесь о том, чтобы ограничить ключи, которые вы подписываете этим ЦС, поскольку он используется для управления доступом к хосту докера.

Docker задокументировал шаги по настройке ЦС и созданию/установке ключей здесь: https://docs.docker.com/engine/security/https/

После настройки вы можете подключиться к более новым средам режима роя, используя те же команды докеров, которые вы запускаете локально на хосте докеров, просто изменив значение $DOCKER_HOST в вашей оболочке.

person BMitch    schedule 18.05.2017
comment
Возможно ли подключиться к демону докеров без настройки TLS? - person Navdeep; 18.05.2017
comment
Это не рекомендуется. Любой, у кого есть доступ к незашифрованному сервису (имейте в виду, что у клиента также будет ключ TLS), может иметь root-доступ в системе без необходимости ввода пароля. - person BMitch; 18.05.2017


Это самый простой способ запуска команд на удаленном движке докера:

docker context create --docker host=ssh://myuser@myremote myremote
docker --context myremote ps -a
docker --context myremote create secret my-secret <address to local file>
docker --context myremote service create --name x --secrets my-secret image

or

docker --host ssh://myuser@myremote ps -a

Вам нужно использовать аутентификацию на основе ключа для этой работы (вы уже должны ее использовать). Другие варианты включают настройку сокета на основе сертификата tls или туннелей ssh.

person Marcos Oliveira    schedule 08.07.2021