Docker-集群swarm(5)
Docker集群的概念
群集是一组运行Docker并加入集群的计算机。在此之后,您继续运行您习惯使用的Docker命令,但现在它们由群集管理器在群集上执行。群中的机器可以是物理的或虚拟的。加入群组后,它们被称为节点。
Swarm管理器可以使用多种策略来运行容器,例如“最节点的节点” - 它使用容器填充利用率最低的机器。,它确保每台机器只获得指定容器的一个实例。您指示swarm管理器在Compose文件中使用这些策略。
群集管理器是群中唯一可以执行命令的机器,或者授权其他机器作为工作者加入群集。工人只是在那里提供能力,没有权力告诉任何其他机器它能做什么和不能做什么。
1. 安装Docker Machine#
安装#
1 2 3 | $ base=https: //github .com /docker/machine/releases/download/v0 .16.0 && curl -L $base /docker-machine- $( uname -s)-$( uname -m) > /tmp/docker-machine && sudo install /tmp/docker-machine /usr/local/bin/docker-machine |
检查安装版本
1 2 | [root@docker ~] # docker-machine version docker-machine version 0.16.0, build 702c267f |
安装bash完成脚本
Machine存储库提供了几个bash
脚本,可添加以下功能:
- 命令完成
- 一个在shell提示符下显示活动计算机的函数
- 一个函数包装器,它添加一个
docker-machine use
子命令来切换活动机器
1 2 3 4 5 | base=https: //raw .githubusercontent.com /docker/machine/v0 .16.0 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 |
使其生效
1 | source /etc/bash_completion .d /docker-machine-prompt . bash |
要启用docker-machine
shell提示,请添加 $(__docker_machine_ps1)
到您的PS1
设置中~/.bashrc
。
1 | PS1= '[\u@\h \W$(__docker_machine_ps1)]\$ ' |
安装VirtualBox
参考: yum安装VirtualBox
如果是在Vmare的机器中还需要开启虚拟化
docker-machine
使用VirtualBox驱动程序创建几个VM
1 | docker-machine create --driver virtualbox myvm1<br>docker-machine create --driver virtualbox myvm2 |
列出计算机并获取其IP地址
1 2 3 4 | [root@docker ~] # docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS myvm1 - virtualbox Running tcp: //192 .168.99.100:2376 v18.09.1 myvm2 - virtualbox Running tcp: //192 .168.99.101:2376 v18.09.1 |
2. 初始化SWARM并添加节点#
第一台机器充当管理器,第二台是工人节点,它执行管理命令并验证工作节点加入群。
您可以使用命令向VM发送命令docker-machine ssh
。指示myvm1
成为一个swarm管理器docker swarm init
并查找如下输出:
1 2 3 4 5 6 7 8 | [root@docker ~] #docker-machine ssh myvm1 "docker swarm init --advertise-addr 192.168.99.100" Swarm initialized: current node (kx0ou7byih7sjb4hudxearizw) is now a manager. To add a worker to this swarm, run the following command : docker swarm join --token SWMTKN-1-3ofjl4coq8n9z2bw6t4nnr8zzuhrg7bmlf94f59ybjee74fs0d-dr5g7ec9nzkb2ypj9q3275l3n 192.168.99.100:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions. |
端口2366和2377
- 2377:群集管理端口
- 2376:Docker守护程序端口
将第二台虚拟机加入集群
1 2 | [root@docker ~] #docker-machine ssh myvm2 "docker swarm join --token SWMTKN-1-3ofjl4coq8n9z2bw6t4nnr8zzuhrg7bmlf94f59ybjee74fs0d-dr5g7ec9nzkb2ypj9q3275l3n 192.168.99.100:2377" This node joined a swarm as a worker. |
查看集群中的节点
1 2 3 4 | [root@docker ~] #docker-machine ssh myvm1 "docker node ls" ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION kx0ou7byih7sjb4hudxearizw * myvm1 Ready Active Leader 18.09.1 yqg18tj1ujx13eb47sb10ozvk myvm2 Ready Active 18.09.1 |
离开群,在需要离开的节点运行
1 | docker swarm leave |
3. 在集群中部署应用程序#
为管理节点(myvm1)配置shell
到目前为止,您已经将Docker命令包装在docker-machine ssh
与VM通信中。另一种选择是运行docker-machine env <machine>
以获取并运行一个命令,该命令将当前shell配置为与VM上的Docker守护程序通信。此方法适用于下一步,因为它允许您使用本地docker-compose.yml
文件“远程”部署应用程序,而无需将其复制到任何位置。
1 2 3 4 5 6 7 8 9 10 11 12 | [root@docker ~] #docker-machine env myvm1 export DOCKER_TLS_VERIFY= "1" export DOCKER_HOST= "tcp://192.168.99.100:2376" export DOCKER_CERT_PATH= "/root/.docker/machine/machines/myvm1" export DOCKER_MACHINE_NAME= "myvm1" # Run this command to configure your shell: # eval $(docker-machine env myvm1) [root@docker ~] #eval $(docker-machine env myvm1) [root@docker ~ [myvm1]] #docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS myvm1 * virtualbox Running tcp: //192 .168.99.100:2376 v18.09.1 myvm2 - virtualbox Running tcp: //192 .168.99.101:2376 v18.09.1 |
可以看见myvm1变成了活动状态
取消当前shell
1 | eval $(docker-machine env myvm1) |
在swarm管理器上部署应用程序
1 2 3 | [root@docker ~ [myvm1]] #docker stack deploy -c docker-compose.yml getstartedlab Creating network getstartedlab_webnet Creating service getstartedlab_web |
可以通过下面的命令查看服务已经分布在myvm1和myvm2上了
1 2 3 4 5 6 7 | [root@docker ~ [myvm1]] #docker stack ps getstartedlab ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS r2bg0k9j68br getstartedlab_web.1 scottcho /flask :v1 myvm1 Running Running 3 minutes ago kumrzfmznjmq getstartedlab_web.2 scottcho /flask :v1 myvm2 Running Running 2 minutes ago 1w3p5qe3fbhf getstartedlab_web.3 scottcho /flask :v1 myvm1 Running Running 3 minutes ago bxlvev660m1o getstartedlab_web.4 scottcho /flask :v1 myvm2 Running Running 2 minutes ago 62jts8h2qplt getstartedlab_web.5 scottcho /flask :v1 myvm2 Running Running 2 minutes ago |
访问服务
1 2 3 | [root@docker ~ [myvm1]] #curl http://192.168.99.100:4000 <h3>Hello World!< /h3 ><b>Hostname:< /b > f612eb9ae8f3<br/><b>Visits:< /b > <i>cannot connect to Redis, counter disabled< /i >[root@docker ~ [myvm1]] #curl http://192.168.99.101:4000 <h3>Hello World!< /h3 ><b>Hostname:< /b > 37e0a0449988<br/><b>Visits:< /b > <i>cannot connect to Redis, counter disabled< /i >[root@docker ~ |
内部网络图
停止和启动VM#
1 2 | docker-machine stop myvm2 docker-machine start myvm2 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了