2016-09-07 274 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或多或少的包装。

参考: