在 docker swarm 中的特定节点上运行 docker 容器

Dim*_*mos 1 jenkins docker docker-swarm

我有一个詹金斯管道,它在 NUC 服务器上构建和运行各种容器。此 NUC 与另一个 NUC 位于集群 (Swarm) 上。我最近在我的设置和该集群上添加了几个树莓派,所以现在我想知道是否有一种方法可以命令 Jenknis 在x86_x64 or armhf设备上部署。

我尝试了-e constraint:node==<node_name>在其他问题上找到的解决方案,但没有运气。

x86_x64我尝试了从一个节点指向另一个节点以及从一个x86_x64节点指向另一个armhf节点的上述命令

我不想将这些容器作为服务运行,也不关心任何负载均衡器,我只想在特定架构上运行容器(x86_x64 or armhf取决于我想要部署的内容)

gch*_*bon 7

您不能对容器使用约束,只能对服务使用约束。

话虽这么说,对服务使用限制似乎是一个好方法。您可以在官方文档中了解有关服务限制的更多信息。以下是关于约束如何匹配节点或 Docker 引擎标签的一些示例:

# 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
Run Code Online (Sandbox Code Playgroud)

如果你想匹配特定的主机名,你需要使用node.hostname==<hostname>而不是node==<hostname>

您还需要更新restart_policy服务定义deploy策略中的密钥,以防止在第一个容器成功终止其进程后启动新容器。

将它们全部包装在一起,您需要类似的东西:

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
Run Code Online (Sandbox Code Playgroud)

当然,您可以自行决定为每个 Swarm 节点添加标签。Ansible 及其模块docker-node非常适合此目的。这是一个示例剧本:

- hosts: swarm
  tasks:
    - name: Add label to node specifying architecture 
      docker_node:
        hostname: "{{ inventory_hostname }}"
        labels:
          arch: "{{ ansible_architecture }}"
Run Code Online (Sandbox Code Playgroud)

您的 docker 节点将标有密钥arch 和以下值之一:

  • 臂氢夫
  • 手臂v7l
  • i386
  • x86_64