[英]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
和以下值之一:
您為什么不想使用服務? 服務是我們編排Swarm中事物的方式。 docker container ...
將僅在單個主機上啟動/停止/檢查/操縱事物。 由於已經建立了群集集群,為什么不使用服務?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.