Skip to content

04. 入门 集群

官方原文

通过将多台机器连接到Dockerized集群swarm,可以实现多容器,多机器应用程序。

1. 前提

安装Docker Machine

这一步是为了在本机中使用virtualbox驱动创建虚拟机作为结点,如果不是在virtualbox运行虚拟机的话可能不行。

1.1 安装 Docker Machine

curl -L https://github.com/docker/machine/releases/download/v0.16.1/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine &&
    chmod +x /tmp/docker-machine &&
    sudo cp /tmp/docker-machine /usr/local/bin/docker-machine

1.2 安装bash补全脚本

补全功能重启生效,有帮助文档。

下载:

base=https://raw.githubusercontent.com/docker/machine/v0.16.1
for i in docker-machine-prompt.bash docker-machine-wrapper.bash docker-machine.bash
do
  sudo wget "$base/contrib/completion/bash/${i}" -P /etc/bash_completion.d
done

然后执行:

source /etc/bash_completion.d/docker-machine-prompt.bash

~/.bashrc文件中添加:

PS1='[\u@\h \W$(__docker_machine_ps1)]\$ '

1.3 卸载 Docker Machine

1.3.1 删除创建的Machine

删除指定的Machine:

docker-machine rm <machine-name>

删除所有的Machine:

docker-machine rm -f $(docker-machine ls -q)

1.3.2 删除可执行命令

rm $(which docker-machine)

Note

docker-machine创建的相关数据、配置文件等信息存储在~/.docker/machine/machines/目录下。建议不要直接修改或删除这些文件,因为这样做只会影响Docker CLI,而不是真正的虚拟机。

2. 集群说明

swarm是一组运行docker并加入到一个集群中的机器。通过swarm manager在集群上执行命令。这字儿机器称为nodes,可以是物理机或虚拟机。

集群有多种策略来运行容器。

swarm managers 指那些可以执行你的命令,或批准其它worker加入到swarm中的的机器。workers仅仅提供能力并且不能进行授权。

docker可以切换到swarm mode开启集群,这会让当前的机器成为swarm manager,从此,docker在swarm上执行命令,不再只是在当前机器。

3. 设置swarm

开启swarm mode并成为swarm managerdocker swarm init,然后在其他机器上运行docker swarm join,让它们作为worker加入swarm

$ docker swarm init
Swarm initialized: current node (coqrwmgo1dvmymo3rvjgp9f29) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-0vfdwlab520va171c1jj3rrshrxbvykakmikerl3x8tjujz5u7-5j52x2866y5auq3at9fjeerx6 172.16.2.237:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

3.1 创建集群

本次使用物理机作为结点进行实验。以下是创建虚拟机作为结点,大同小异。

若使用虚拟机创建集群则需要安装virtualbox,centos7安装时一定要将当前使用的内核版本与所需的rpm包kernel-devel一致,否则无法识别内核模块,无法使用虚拟机。

使用 docker-machine创建虚拟机:

$ docker-machine create --driver virtualbox myvm1

查看虚拟机:

$ docker-machine ls

初始化swarm,添加nodes:

# 这里的<myvm1—ip>根据提示填写
$ docker-machine ssh myvm1 "docker swarm init --advertise-addr <myvm1-ip>"

添加worker:

$ docker-machine ssh myvm2 "docker swarm join \
--token <token> \
<ip>:2377"

Important

执行添加manager和worker的命令时,端口号总是指定2377,或者不要指定。 并且不要使用2376。SSH有问题时,可指定使用本地SSH:docker-machine --native-ssh ssh myvm1 ...

3.2 查看集群

在manager上面查看swarm上面的nodes,manager是否激活(*表示激活):

# 虚拟机查看
$ docker-machine ssh myvm1 "docker node ls"
# 物理机查看
$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
invw2ljg6e34s2o1naux9wklt     convert-server      Ready               Active                                  18.09.6
coqrwmgo1dvmymo3rvjgp9f29 *   dev            Ready               Active              Leader              18.09.6

3.3 离开集群

如果要重新开始,可以从每个节点运行docker swarm leave

4. 在集群上部署app

4.1 配置一个docker-machine shell到 swarm manager

物理机无需执行此步骤。

除了docker-machine ssh ,还有另一种与虚拟机通信的方式:

docker-machine env <machine>,它允许你使用本地的docker-compose.yml文件来远程部署app而不必到处复制该文件。

执行之后根据提示执行eval $(docker-machine env myvm1),然后查看manager是否激活(*表示激活):

$ docker-machine ls

4.2 在 swarm manager 上部署app

03. 入门-服务相同,在swarm manager上面执行:

docker stack deploy -c docker-compose.yml getstartedlab

然后会发现在两者都部署了容器与任务。

Note

如果你的镜像存放在私有仓库而不是Docker Hub,那么首先你需要登录:docker login <your-registry>;然后在部署的时候需要添加验证参数:docker stack deploy --with-registry-auth -c docker-compose.yml getstartedlab

4.3 访问你的服务

通过两者的ip地址都可以访问到服务(仍是负载均衡的)。

Question

此服务需要打开以下端口:
1. Port 7946 TCP/UDP for container network discovery.
2. Port 4789 UDP for the container ingress network.

5. 迭代、扩展app

可以做02. 入门-容器03. 入门-服务中的一切。

在添加新的nodes之后,通过运行docker stack deploy即可使用新的资源。

6. 清理与重启

6.1 stacks

docker stack rm test

6.2 swarms

manager:

docker swarm leave --force

worker:

docker swarm leave

6.3 取消 docker-machine 的shell变量设置

eval $(docker-machine env -u)

6.4 重启 docker machines

docker-machine start <machine-name>

7. 常用命令

docker-machine create --driver virtualbox myvm1 # Create a VM (Mac, Win7, Linux)
docker-machine create -d hyperv --hyperv-virtual-switch "myswitch" myvm1 # Win10
docker-machine env myvm1                # View basic information about your node
docker-machine ssh myvm1 "docker node ls"         # List the nodes in your swarm
docker-machine ssh myvm1 "docker node inspect <node ID>"        # Inspect a node
docker-machine ssh myvm1 "docker swarm join-token -q worker"   # View join token
docker-machine ssh myvm1   # Open an SSH session with the VM; type "exit" to end
docker node ls                # View nodes in swarm (while logged on to manager)
docker-machine ssh myvm2 "docker swarm leave"  # Make the worker leave the swarm
docker-machine ssh myvm1 "docker swarm leave -f" # Make master leave, kill swarm
docker-machine ls # list VMs, asterisk shows which VM this shell is talking to
docker-machine start myvm1            # Start a VM that is currently not running
docker-machine env myvm1      # show environment variables and command for myvm1
eval $(docker-machine env myvm1)         # Mac command to connect shell to myvm1
& "C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe" env myvm1 | Invoke-Expression   # Windows command to connect shell to myvm1
docker stack deploy -c <file> <app>  # Deploy an app; command shell must be set to talk to manager (myvm1), uses local Compose file
docker-machine scp docker-compose.yml myvm1:~ # Copy file to node's home dir (only required if you use ssh to connect to manager and deploy the app)
docker-machine ssh myvm1 "docker stack deploy -c <file> <app>"   # Deploy an app using ssh (you must have first copied the Compose file to myvm1)
eval $(docker-machine env -u)     # Disconnect shell from VMs, use native docker
docker-machine stop $(docker-machine ls -q)               # Stop all running VMs
docker-machine rm $(docker-machine ls -q) # Delete all VMs and their disk images