簡體   English   中英

在docker swarm中的特定節點上運行docker容器

[英]Run a docker container on a specific node in a docker swarm

我有一個jenkins管道,它在NUC服務器上構建和運行各種容器。 該NUC與另一個NUC在群集(群集)上。 我最近在我的設置和該群集上添加了幾個樹莓派,所以現在我想知道是否存在一種命令Jenknis部署在x86_x64 or armhf設備上的方法。

我嘗試了在其他問題上發現的-e constraint:node==<node_name>解決方案,但是我沒有運氣。

我嘗試了上述命令從一個x86_x64節點指向另一個和從x86_x64指向節點armhf節點

我不想將那些容器作為服務運行, x86_x64 or armhf需要任何負載平衡器,我只想在特定體系結構( x86_x64 or armhf取決於我要部署的對象)上運行容器

您不能僅在服務上對容器使用約束。

話雖這么說,對服務使用約束似乎是一個不錯的方法。 您可以在官方文檔中了解有關服務約束的更多信息。 以下是有關約束如何匹配節點或Docker Engine標簽的一些示例:

# Node ID
node.id==2ivku8v2gvtg4

# Node hostname
node.hostname!=node-2

# Node role
node.role==manager

# Node labels
node.labels.security==high

# Docker Engine's labels
engine.labels.operatingsystem==ubuntu 14.04

如果要匹配特定的主機名,則需要使用node.hostname==<hostname>而不要使用node==<hostname>

您還需要從服務定義deploy策略中更新restart_policy項,以防止第一個容器成功終止后啟動新容器。

將它們包裝在一起,您需要這樣的東西:

version: "3.7"
services:
  myapp:
    image: <my_image>
    deploy:
      placement:
        constraints:
          - node.labels.arch == x86_64
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
        window: 120s

當然,由您決定是否將標簽添加到每個Swarm節點。 Ansible及其模塊docker -node確實非常適合此目的。 這是一個示例劇本:

- hosts: swarm
  tasks:
    - name: Add label to node specifying architecture 
      docker_node:
        hostname: "{{ inventory_hostname }}"
        labels:
          arch: "{{ ansible_architecture }}"

您的docker節點將被標記為關鍵arch和以下值之一:

  • armhf
  • armv7l
  • I386
  • x86_64的

您為什么不想使用服務? 服務是我們編排Swarm中事物的方式。 docker container ...將僅在單個主機上啟動/停止/檢查/操縱事物。 由於已經建立了群集集群,為什么不使用服務?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM