web-dev-qa-db-ja.com

Docker Swarmにリモートで接続するにはどうすればよいですか?

ローカルMacからクラウドでホストされているdocker swarmクラスターでコマンドを実行することはできますか?はいの場合、どのように?

ローカルからdocker swarmで次のようなコマンドを実行したい:

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

質問の答えは here にあります。

Ubuntuマシンに必要なことは、パス/etc/dockerにあるdaemon.jsonファイルを次の内容で定義することです。

  {
    "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が言及している here を参照してください。

7
Navdeep

1つのオプションは、前の回答で提案されているようにdockerデーモンへの直接アクセスを提供することですが、そのためにはTLS証明書とキーを設定する必要があり、それ自体がトリッキーで時間がかかる可能性があります。 Dockerマシンを使用してノードを作成した場合、Dockerマシンはそのプロセスを自動化できます。

同じ問題がありました。シークレットを含むファイルをスウォームマネージャーにアップロードせずに、スウォームにシークレットを作成したかったからです。また、最初にスタックファイルをアップロードする手間をかけずに、デプロイスタックファイル(例:docker-compose.yml)を実行できるようにしたいと考えました。

必要な数台のサーバーを作成できるようにしたいと思っていました。 DigitalOceanは、必ずしもDockerマシンを使用しているわけではなく、シークレットを再現性よく作成してスタックファイルを実行できます。 DigitalOceanやAWSなどの環境では、TLS証明書の個別のセットは使用されませんが、ローカルマシンのsshキーがssh経由でリモートノードにアクセスするために使用されます。

私にとってうまくいった解決策は、sshに対して個別のコマンドを使用してdockerコマンドを実行することでした。これにより、stdinを使用してシークレットやスタックファイルをパイプ処理できます。

これを行うには、最初にDigitalOceanドロップレットを作成して、おそらくカスタムイメージまたはスナップショットから、Dockerをインストールするか、単に各ドロップレットにdockerをインストールするコマンドを実行する必要があります。次に、液滴をスウォームに結合します。sshをマネージャノードになるものに入力し、docker swarm initと入力します(そのIPが複数ある場合は、--advertise-addrオプションを使用することもできます)ノード(群内トラフィックをプライベートネットワーク上に保持したい場合など)と群のjoinコマンドを取得します。次に、他の各ノードにsshを入力してjoinコマンドを発行すると、スウォームが作成されます。

次に、マネージャノードで次のようにコマンドを発行するために必要なsshコマンドをエクスポートします

export SSH_CMD='ssh [email protected]'

今、あなたにはいくつかの選択肢があります。次のような個々のdockerコマンドを発行できます。

$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がstdinでシークレットを受け入れる必要があることを示し、sshを使用してファイルをstdinにパイプします)

スクリプトを作成してコマンドを再現性よく実行し、シークレットを作成して、ローカルマシン上でのみシークレットファイルとスタックファイルを使用してスタックを起動することもできます。このようなスクリプトは次のようになります。

$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ファイルは、stomp、amqp、および監視インターフェースのsshリスニングポートを設定し、rabbitmqに/ run/secrets内の証明書とキーを探すように指示します。この特定のイメージの別の代替方法は、シークレットファイルを指すようにイメージによって提供される環境変数ですが、イメージ内での構成を必要としないより一般的なソリューションが必要でした)

これで、別のスウォームを起動したい場合、SSH_CMD環境変数を設定すると、スクリプトはそのスウォームで機能し、TLSを設定したり、シークレットファイルやスタックファイルをスウォームファイルシステムにコピーしたりする必要はありません。

したがって、これはスウォーム(存在があなたの質問で前提とされていた)の作成の問題を解決しませんが、一度作成されると、環境変数を使用すると(スクリプトで使用する場合はエクスポートされます)、ほぼ使用できるようになります。正確に、その環境変数を前に付けてリストしたコマンド。

3
nachbar

リモートDockerノードに接続するには、同じCAから署名されたDockerホストとクライアントの両方でTLSをセットアップする必要があります。このCAはdocker Hostへのアクセスを制御するために使用されるため、このCAで署名するキーを制限するように注意してください。

Dockerは、CAをセットアップしてキーを作成/インストールする手順をここに文書化しています: https://docs.docker.com/engine/security/https/

設定したら、シェルの$ DOCKER_Hostの値を変更するだけで、Docker Hostでローカルに実行するのと同じdockerコマンドを使用して、新しいスウォームモード環境に接続できます。

2
BMitch

ゼロから始める場合は、 generic docker-machine driver を使用してマネージャーノードを作成できます。その後、docker-machine envコマンドを使用して、ローカルマシンからそのDockerエンジンに接続できます。

0
andrey