04. 入门 集群
通过将多台机器连接到Dockerized集群swarm
,可以实现多容器,多机器应用程序。
1. 前提⚓
这一步是为了在本机中使用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 manager:docker 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⚓
在添加新的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