繁体   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