2016-09-07 326 views
9
  1. 初始化羣模式:執行命令

    [email protected]:/home/ubuntu# docker swarm init --advertise-addr 172.31.44.207 
    
    Swarm initialized: current node (4mj61oxcc8ulbwd7zedxnz6ce) is now a manager. 
    
    To add a worker to this swarm, run the following command: 
    
  2. 加入第二個節點:

    docker swarm join \ 
    --token SWMTKN-1-4xvddif3wf8tpzcg23tem3zlncth8460srbm7qtyx5qk3ton55-6g05kuek1jhs170d8fub83vs5 \ 
    172.31.44.207:2377 
    

將管理員加入到這個羣,運行「碼頭羣聯合令牌管理器「並按照說明進行操作。

# start 2 services 
docker service create continuumio/miniconda3 

docker service create --name redis redis:3.0.6 


[email protected]:/home/ubuntu# docker service ls 
ID   NAME  REPLICAS IMAGE     COMMAND 
2yc1xjmita67 miniconda3 0/1  continuumio/miniconda3 
c3ptcf2q9zv2 redis  1/1  redis:3.0.6 

如上圖所示,Redis的有它的複製品,而miniconda不似乎複製

我平時登錄到miniconda容器中鍵入以下命令:

/opt/conda/bin/conda install jupyter -y --quiet && mkdir /opt/notebooks && /opt/conda/bin/jupyter notebook --notebook-dir=/opt/notebooks --ip='*' --port=8888 --no-browser 

的問題是,docker exec -it XXX bash命令不與羣模式下工作。

+0

的0副本意味着容器未能啓動。我建議你在你的docker守護進程上配置一個日誌驅動程序(例如syslog驅動程序),因爲默認情況下它吞併所有的容器輸出。它可能一遍又一遍地重新啓動,你會想知道爲什麼。如果是這樣,你將無法附加並修復它;您需要修復docker服務命令,以便它不會因錯誤而退出。 –

回答

7

編輯2017年10月6日:

現在你可以用--attachable標誌創建覆蓋網絡,以使任何容器加入網絡。這是一個很棒的功能,因爲它具有很大的靈活性。

E.g.

$ docker network create --attachable --driver overlay my-network 
$ docker service create --network my-network --name web --publish 80:80 nginx 
$ docker run --network=my-network -ti alpine sh 
$ wget -qO- web 

<!DOCTYPE html> 
<html> 
<head> 
.... 

你是對的,你不能在泊塢窗羣模式服務運行docker exec。但是您仍然可以發現哪個節點正在運行容器,然後直接在容器上運行exec。例如。

docker service ps miniconda3 # find out, which node is running the container 
eval `docker-machine env <node name here>` 
docker ps # find out the container id of miniconda 
docker exec -it <container id here> sh 

在你的情況你首先必須找出爲什麼服務不能獲得miniconda容器。也許運行docker service ps miniconda3會顯示一些有用的錯誤消息..?

13

有一個襯墊用於訪問該服務的相應實例爲本地主機:

docker exec -ti stack_myservice.1.$(docker service ps -f 'name=stack_myservice.1' stack_myservice -q) /bin/bash 

這是在PowerShell的測試,但bash中應該是相同的。 oneliner訪問第一個實例,但用兩個要訪問的實例的編號替換「1」以獲得另一個實例。

更爲複雜的例子是分佈情況:

swarm_bash stack_task 1 

它只是執行所需的節點上的bash:

#! /bin/bash 

set -e 

exec_task=$1 
exec_instance=$2 

strindex() { 
    x="${1%%$2*}" 
    [[ "$x" = "$1" ]] && echo -1 || echo "${#x}" 
} 

parse_node() { 
    read title 
    id_start=0 
    name_start=`strindex "$title" NAME` 
    image_start=`strindex "$title" IMAGE` 
    node_start=`strindex "$title" NODE` 
    dstate_start=`strindex "$title" DESIRED` 
    id_length=name_start 
    name_length=`expr $image_start - $name_start` 
    node_length=`expr $dstate_start - $node_start` 

    read line 
    id=${line:$id_start:$id_length} 
    name=${line:$name_start:$name_length} 
    name=$(echo $name) 
    node=${line:$node_start:$node_length} 
    echo $name.$id 
    echo $node 
} 

if true; then 
    read fn 
    docker_fullname=$fn 
    read nn 
    docker_node=$nn 
fi < <(docker service ps -f name=$exec_task.$exec_instance --no-trunc -f desired-state=running $exec_task | parse_node) 

echo "Executing in $docker_node $docker_fullname" 

eval `docker-machine env $docker_node` 

docker exec -ti $docker_fullname /bin/bash 

該腳本可以在以後的使用。

+2

關於bash腳本'''$ docker服務ls 之後的-q – raarts

+3

單線程需要--no-trunc ID名稱模式REPLICAS IMAGE jiecd0kb524e bar複製3/3 jwilder/whoami:latest'''和when我稱之爲'''$ ./swarm_bash bar 1 在swarmm-agentpublic-31109991000004執行bar.1.vj6lqkz4wi03hn7hr6574cipg 主機不存在:「swarmm-agentpublic-31109991000004」 來自守護進程的錯誤響應:沒有這樣的容器:bar。 1.vj6lqkz4wi03hn7hr6574cipg'''我真的可以在羣集模式下執行嗎?單班輪也不適合我 – guillem

0

使用泊塢API

眼下,碼頭工人不提供API像docker service execdocker stack exec這一點。而對於這一點,已經存在處理這一功能的兩個問題:

(關於第一個問題,對我來說,它不是直接明顯,這個問題涉及完全是這種功能,但Exec for Swarm已關閉並標記爲Docker service exec問題的副本。)

使用Docker守護程序通過HTTP

run docker exec from swarm manager提到的BMitch,你也可以配置泊塢窗守護進程使用HTTP和比連接到每個節點而不需要SSH的。但是你應該使用已經集成到Docker中的TLS authentication來保護它。之後,您將能夠執行docker exec這樣的:

docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem \ 
    -H=$HOST:2376 exec $containerId $cmd 

使用目的論 - 插件 - 羣 - EXEC

存在着聲稱要解決的問題,並提供所需的功能結合GitHub的項目碼頭工人守護進程:

docker run -v /var/run/docker.sock:/var/run/docker.sock \ 
    datagridsys/skopos-plugin-swarm-exec \ 
    task-exec <taskID> <command> [<arguments>...] 

據我所看到的,這通過創建在同一節點上的另一個容器,其中容器駐留在docker exec守在那裏ld通過執行。在此節點上,此容器裝入docker守護程序套接字以便能夠在本地執行docker exec
欲瞭解更多信息,在一看:skopos-plugin-swarm-exec

使用泊塢窗羣助手

還有一個名爲docker swarm helpers另一個項目,這似乎是圍繞sshdocker exec或多或少的包裝。

參考: