将所有的 "``sh" 替换为 "``bash"

这样更兼容 prism 避免报错。
This commit is contained in:
Tao Wang
2016-11-10 22:48:32 +11:00
parent d8be8f15a9
commit df94a6e1fb
15 changed files with 140 additions and 140 deletions

View File

@@ -5,7 +5,7 @@ swarm 的调度器(scheduler)在选择节点运行容器的时候支持几种过
###Constraint Filter
constraint 是一个跟具体节点相关联的键值对可以看做是每个节点的标签这个标签可以在启动docker daemon的时候指定比如
```sh
```bash
sudo docker -d --label label_name=label01
```
@@ -14,30 +14,30 @@ sudo docker -d --label label_name=label01
在本次试验中给083添加标签--label label_name=083,084添加标签--label label_name=084,124添加标签--label label_name=124,
以083为例打开/etc/default/docker文件修改DOCKER_OPTS
```sh
```bash
DOCKER_OPTS="-H 0.0.0.0:2375 -H unix:///var/run/docker.sock --label label_name=083"
```
在使用docker run命令启动容器的时候使用 `-e constarint:key=value` 的形式可以指定container运行的节点。
比如我们想在84上面启动一个 redis 容器。
```sh
```bash
rio@085:~$ sudo docker -H 192.168.1.83:2376 run --name redis_1 -d -e constraint:label_name==084 redis
fee1b7b9dde13d64690344c1f1a4c3f5556835be46b41b969e4090a083a6382d
```
注意,是**两个**等号,不是一个等号,这一点会经常被忽略。
接下来再在084这台机器上启动一个redis 容器。
```sh
```bash
rio@085:~$ sudo docker -H 192.168.1.83:2376 run --name redis_2 -d -e constraint:label_name==084 redis 4968d617d9cd122fc2e17b3bad2f2c3b5812c0f6f51898024a96c4839fa000e1
```
然后再在083这台机器上启动另外一个 redis 容器。
```sh
```bash
rio@085:~$ sudo docker -H 192.168.1.83:2376 run --name redis_3 -d -e constraint:label_name==083 redis 7786300b8d2232c2335ac6161c715de23f9179d30eb5c7e9c4f920a4f1d39570
```
现在来看下执行情况:
```sh
```bash
rio@085:~$ sudo docker -H 192.168.1.83:2376 ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7786300b8d22 redis:latest "/entrypoint.sh redi 15 minutes ago Up 53 seconds 6379/tcp 083/redis_3
@@ -48,7 +48,7 @@ fee1b7b9dde1 redis:latest "/entrypoint.sh redi 19 minutes ago
可以看到,执行结果跟预期的一样。
但是如果指定一个不存在的标签的话来运行容器会报错。
```sh
```bash
rio@085:~$ sudo docker -H 192.168.1.83:2376 run --name redis_0 -d -e constraint:label_name==0 redis
FATA[0000] Error response from daemon: unable to find a node that satisfies label_name==0
```
@@ -57,7 +57,7 @@ FATA[0000] Error response from daemon: unable to find a node that satisfies labe
通过使用 Affinity Filter可以让一个容器紧挨着另一个容器启动也就是说让两个容器在同一个节点上面启动。
现在其中一台机器上面启动一个 redis 容器。
```sh
```bash
rio@085:~$ sudo docker -H 192.168.1.83:2376 run -d --name redis redis
ea13eddf667992c5d8296557d3c282dd8484bd262c81e2b5af061cdd6c82158d
rio@085:~$ sudo docker -H 192.168.1.83:2376 ps
@@ -66,14 +66,14 @@ ea13eddf6679 redis:latest /entrypoint.sh redis 24 minutes ago
```
然后再次启动两个 redis 容器。
```sh
```bash
rio@085:~$ sudo docker -H 192.168.1.83:2376 run -d --name redis_1 -e affinity:container==redis redis
bac50c2e955211047a745008fd1086eaa16d7ae4f33c192f50412e8dcd0a14cd
rio@085:~$ sudo docker -H 192.168.1.83:2376 run -d --name redis_1 -e affinity:container==redis redis
bac50c2e955211047a745008fd1086eaa16d7ae4f33c192f50412e8dcd0a14cd
```
现在来查看下运行结果,可以看到三个容器都是在一台机器上运行
```sh
```bash
rio@085:~$ sudo docker -H 192.168.1.83:2376 ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
449ed25ad239 redis:latest /entrypoint.sh redis 24 minutes ago Up Less than a second 6379/tcp 083/redis_2
@@ -81,19 +81,19 @@ bac50c2e9552 redis:latest /entrypoint.sh redis 25 minutes ago
ea13eddf6679 redis:latest /entrypoint.sh redis 28 minutes ago Up 3 minutes 6379/tcp 083/redis
```
通过 `-e affinity:image=image_name` 命令可以指定只有已经下载了`image_name`镜像的机器才运行容器
```sh
```bash
sudo docker H 192.168.1.83:2376 run name redis1 d e affinity:image==redis redis
```
redis1 这个容器只会在已经下载了 redis 镜像的节点上运行。
```sh
```bash
sudo docker -H 192.168.1.83:2376 run -d --name redis -e affinity:image==~redis redis
```
这条命令达到的效果是:在有 redis 镜像的节点上面启动一个名字叫做 redis 的容器,如果每个节点上面都没有 redis 容器,就按照默认的策略启动 redis 容器。
###Port Filter
Port 也会被认为是一个唯一的资源
```sh
```bash
sudo docker -H 192.168.1.83:2376 run -d -p 80:80 nginx
```

View File

@@ -11,7 +11,7 @@ binpack 则相反这种情况下swarm会尽可能的把所有的容器放
### spread 策略
先来演示下 spread 策略的情况。
```sh
```bash
rio@083:~$ sudo docker run -d -p 2376:2375 -v $(pwd)/cluster:/tmp/cluster swarm manage --strategy=spread file:///tmp/cluster
7609ac2e463f435c271d17887b7d1db223a5d696bf3f47f86925c781c000cb60
ats@sclu083:~$ sudo docker ps
@@ -19,7 +19,7 @@ CONTAINER ID IMAGE COMMAND CREATED
7609ac2e463f swarm:latest "/swarm manage --str 6 seconds ago Up 5 seconds 0.0.0.0:2376->2375/tcp focused_babbage
```
三台机器除了83运行了 Swarm之外其他的都没有运行任何一个容器现在在85这台节点上面在swarm集群上启动一个容器
```sh
```bash
rio@085:~$ sudo docker -H 192.168.1.83:2376 run --name node-1 -d -P redis
2553799f1372b432e9b3311b73e327915d996b6b095a30de3c91a47ff06ce981
rio@085:~$ sudo docker -H 192.168.1.83:2376 ps
@@ -27,7 +27,7 @@ CONTAINER ID IMAGE COMMAND CREATED
2553799f1372 redis:latest /entrypoint.sh redis 24 minutes ago Up Less than a second 192.168.1.84:32770->6379/tcp 084/node-1
```
启动一个 redis 容器,查看结果
```sh
```bash
rio@085:~$ sudo docker -H 192.168.1.83:2376 run --name node-2 -d -P redis
7965a17fb943dc6404e2c14fb8585967e114addca068f233fcaf60c13bcf2190
@@ -37,7 +37,7 @@ CONTAINER ID IMAGE COMMAND CREA
2553799f1372 redis:latest /entrypoint.sh redis 29 minutes ago Up 4 minutes 192.168.1.84:32770->6379/tcp 084/node-1
```
再次启动一个 redis 容器,查看结果
```sh
```bash
rio@085:~$ sudo docker -H 192.168.1.83:2376 run --name node-3 -d -P redis
65e1ed758b53fbf441433a6cb47d288c51235257cf1bf92e04a63a8079e76bee
rio@085:~$ sudo docker -H 192.168.1.83:2376 ps
@@ -50,13 +50,13 @@ CONTAINER ID IMAGE COMMAND CREA
### binpack 策略
现在来看看binpack策略下的情况。在083上面执行命令
```sh
```bash
rio@083:~$ sudo docker run -d -p 2376:2375 -v $(pwd)/cluster:/tmp/cluster swarm manage --strategy=binpack file:///tmp/cluster
f1c9affd5a0567870a45a8eae57fec7c78f3825f3a53fd324157011aa0111ac5
```
现在在集群中启动三个 redis 容器,查看分布情况:
```sh
```bash
rio@085:~$ sudo docker -H 192.168.1.83:2376 run --name node-1 -d -P redis
18ceefa5e86f06025cf7c15919fa64a417a9d865c27d97a0ab4c7315118e348c
rio@085:~$ sudo docker -H 192.168.1.83:2376 run --name node-2 -d -P redis

View File

@@ -2,20 +2,20 @@
在使用 swarm 管理集群前,需要把集群中所有的节点的 docker daemon 的监听方式更改为 `0.0.0.0:2375`
可以有两种方式达到这个目的第一种是在启动docker daemon的时候指定
```sh
```bash
sudo docker -H 0.0.0.0:2375&
```
第二种方式是直接修改 Docker 的配置文件(Ubuntu 上是 `/etc/default/docker`,其他版本的 Linux 上略有不同)
在文件的最后添加下面这句代码:
```sh
```bash
DOCKER_OPTS="-H 0.0.0.0:2375 -H unix:///var/run/docker.sock"
```
需要注意的是,一定要在所有希望被 Swarm 管理的节点上进行的。修改之后要重启 Docker
```sh
```bash
sudo service docker restart
```
@@ -28,12 +28,12 @@ Docker 集群管理需要使用服务发现(Discovery service backend)功能S
#### 创建集群 token
在上面三台机器中的任何一台机器上面执行 `swarm create` 命令来获取一个集群标志。这条命令执行完毕后Swarm 会前往 DockerHub 上内置的发现服务中获取一个全球唯一的 token用来标识要管理的集群。
```sh
```bash
sudo docker run --rm swarm create
```
我们在84这台机器上执行这条命令输出如下
```sh
```bash
rio@084:~$ sudo docker run --rm swarm create
b7625e5a7a2dc7f8c4faacf2b510078e
```
@@ -43,13 +43,13 @@ b7625e5a7a2dc7f8c4faacf2b510078e
#### 加入集群
在所有要加入集群的节点上面执行 `swarm join` 命令,表示要把这台机器加入这个集群当中。在本次试验中,就是要在 83、84 和 124 这三台机器上执行下面的这条命令:
```sh
```bash
sudo docker run -d swarm join --addr=ip_address:2375 token://token_id
```
其中的 ip_address 换成执行这条命令的机器的 IPtoken_id 换成上一步执行 `swarm create` 返回的 token。
在83这台机器上面的执行结果如下
```sh
```bash
rio@083:~$ sudo docker run -d swarm join --addr=192.168.1.83:2375 token://b7625e5a7a2dc7f8c4faacf2b510078e
3b3d9da603d7c121588f796eab723458af5938606282787fcbb03b6f1ac2000b
```
@@ -57,18 +57,18 @@ rio@083:~$ sudo docker run -d swarm join --addr=192.168.1.83:2375 token://b7625e
#### 启动swarm manager
因为我们要使用 83 这台机器充当 swarm 管理节点所以需要在83这台机器上面执行 `swarm manage` 命令:
```sh
```bash
sudo docker run -d -p 2376:2375 swarm manage token://b7625e5a7a2dc7f8c4faacf2b510078e
```
执行结果如下:
```sh
```bash
rio@083:~$ sudo docker run -d -p 2376:2375 swarm manage token://b7625e5a7a2dc7f8c4faacf2b510078e
83de3e9149b7a0ef49916d1dbe073e44e8c31c2fcbe98d962a4f85380ef25f76
```
这条命令如果执行成功会返回已经启动的 Swarm 的容器的 ID此时整个集群已经启动起来了。
现在通过 `docker ps` 命令来看下有没有启动成功。
```sh
```bash
rio@083:~$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
83de3e9149b7 swarm:latest "/swarm manage token 4 minutes ago Up 4 minutes 0.0.0.0:2376->2375/tcp stupefied_stallman
@@ -81,7 +81,7 @@ CONTAINER ID IMAGE COMMAND CREATED
* 映射的端口可以使任意的除了 2375 以外的并且是未被占用的端口,但一定不能是 2375 这个端口,因为 2375 已经被 Docker 本身给占用了。
集群启动成功以后,现在我们可以在任何一台节点上使用 `swarm list` 命令查看集群中的节点了,本实验在 124 这台机器上执行 `swarm list` 命令:
```sh
```bash
rio@124:~$ sudo docker run --rm swarm list token://b7625e5a7a2dc7f8c4faacf2b510078e
192.168.1.84:2375
192.168.1.124:2375
@@ -93,7 +93,7 @@ rio@124:~$ sudo docker run --rm swarm list token://b7625e5a7a2dc7f8c4faacf2b5100
本次试验,我们在 192.168.1.85 这台机器上使用 `docker info` 命令来查看集群中的节点的信息。
其中 info 也可以换成其他的 Docker 支持的命令。
```sh
```bash
rio@085:~$ sudo docker -H 192.168.1.83:2376 info
Containers: 8
Strategy: spread
@@ -112,7 +112,7 @@ Nodes: 2
经过排查,发现是忘了修改 124 这台机器上面改 docker daemon 的监听方式,只要按照上面的步骤修改写 docker daemon 的监听方式就可以了。
在使用这个方法的时候使用swarm create可能会因为网络的原因会出现类似于下面的这个问题
```sh
```bash
rio@227:~$ sudo docker run --rm swarm create
[sudo] password for rio:
time="2015-05-19T12:59:26Z" level=fatal msg="Post https://discovery-stage.hub.docker.com/v1/clusters: dial tcp: i/o timeout"
@@ -123,7 +123,7 @@ time="2015-05-19T12:59:26Z" level=fatal msg="Post https://discovery-stage.hub.do
第二种方法相对于第一种方法要简单得多,也不会出现类似于上面的问题。
第一步:在 swarm 管理节点上新建一个文件,把要加入集群的机器 IP 地址和端口号写入文件中本次试验就是要在83这台机器上面操作
```sh
```bash
rio@083:~$ echo 192.168.1.83:2375 >> cluster
rio@083:~$ echo 192.168.1.84:2375 >> cluster
rio@083:~$ echo 192.168.1.124:2375 >> cluster
@@ -134,12 +134,12 @@ rio@083:~$ cat cluster
```
第二步在083这台机器上面执行 `swarm manage` 这条命令:
```sh
```bash
rio@083:~$ sudo docker run -d -p 2376:2375 -v $(pwd)/cluster:/tmp/cluster swarm manage file:///tmp/cluster
364af1f25b776f99927b8ae26ca8db5a6fe8ab8cc1e4629a5a68b48951f598ad
```
使用`docker ps`来查看有没有启动成功:
```sh
```bash
rio@083:~$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
364af1f25b77 swarm:latest "/swarm manage file: About a minute ago Up About a minute 0.0.0.0:2376->2375/tcp happy_euclid
@@ -149,7 +149,7 @@ CONTAINER ID IMAGE COMMAND CREATED
在使用这条命令的时候需要注意的是注意:这里一定要使用-v命令因为cluster文件是在本机上面启动的容器默认是访问不到的所以要通过-v命令共享。
接下来的就可以在任何一台安装了docker的机器上面通过命令使用集群同样的在85这台机器上执行docker info命令查看集群的节点信息
```sh
```bash
rio@s085:~$ sudo docker -H 192.168.1.83:2376 info
Containers: 9
Strategy: spread